개발/코더 탈출

CFI

-=HaeJuK=- 2024. 9. 12. 12:20

**CFI (Control Flow Integrity)**는 프로그램의 제어 흐름이 악의적으로 변경되지 않도록 보호하는 보안 기법입니다. 주로 Return-Oriented Programming (ROP), **Jump-Oriented Programming (JOP)**와 같은 공격으로부터 시스템을 방어하는 데 사용됩니다. CFI는 실행 중인 프로그램의 제어 흐름이 예상된 정상적인 흐름을 따르고 있는지 확인하여, 공격자가 제어 흐름을 변경하는 시도를 탐지하고 차단합니다.

CFI의 주요 개념:

  1. 제어 흐름 그래프 (CFG, Control Flow Graph): CFI는 프로그램의 소스 코드에서 미리 제어 흐름 그래프(CFG)를 생성합니다. CFG는 프로그램의 모든 가능한 제어 흐름을 나타낸 그래프입니다. CFI는 프로그램 실행 중에 이 그래프를 기준으로 현재 실행 경로가 예상된 경로와 일치하는지 검사합니다.
  2. 정적 분석: 프로그램이 실행되기 전에 정적 분석을 통해 가능한 제어 흐름을 미리 정의합니다. 이는 함수 호출, 분기, 루프, 반환 등 제어 흐름의 모든 가능한 경로를 포함하여 분석하게 됩니다.
  3. 실시간 검사: 프로그램이 실행되는 동안 CFI는 현재 실행 중인 프로그램의 제어 흐름이 사전 정의된 제어 흐름 그래프(CFG) 내에 있는지를 확인합니다. 예상되지 않은 방향으로 흐름이 변경될 경우, 이를 비정상적인 동작으로 간주하고 차단할 수 있습니다.
  4. 공격 방어: CFI는 악의적인 공격자가 코드 실행 흐름을 제어하려고 할 때 이를 차단할 수 있습니다. 특히, **ROP(Return-Oriented Programming)**나 JOP(Jump-Oriented Programming) 같은 공격에서는 제어 흐름을 조작하여 메모리 내 특정 코드를 악용하려고 하는데, CFI는 이러한 공격 시도를 탐지하고 방어할 수 있습니다.

CFI의 적용 방식:

  1. 간접 분기 보호: 간접 분기(예: 함수 포인터 호출, 반환 주소)에서 CFI는 분기가 안전한지 여부를 검증합니다. 프로그램이 간접 분기 지점을 만나면, 그 분기가 사전 정의된 합법적인 대상에 속하는지 확인하여 허용된 대상이 아니면 공격으로 판단하고 실행을 차단합니다.
  2. 무결성 검사: 제어 흐름이 예상된 대로 진행되고 있는지 확인하기 위해 CFI는 프로그램 실행 중에 중요한 분기나 함수 호출 전에 무결성 검사를 수행합니다. 예기치 않은 제어 흐름 변경이 발견되면 CFI는 프로그램을 종료하거나 경고를 생성합니다.
  3. 다양한 환경에서 적용: CFI는 운영 체제, 컴파일러, 그리고 런타임에서 적용될 수 있습니다. 운영 체제나 컴파일러 수준에서 적용된 CFI는 더 강력한 보호를 제공하며, 특정 바이너리 파일에 적용될 수도 있습니다.

CFI의 장점:

  • 강력한 보안: ROP, JOP, 버퍼 오버플로우 등 제어 흐름을 악용하는 공격에 대해 매우 효과적입니다.
  • 무결성 유지: 프로그램의 정상적인 동작 흐름을 유지하면서, 공격자가 임의로 코드 흐름을 변경하는 것을 방지합니다.

CFI의 한계:

  • 오버헤드: CFI는 실행 중에 프로그램의 제어 흐름을 지속적으로 확인하므로 성능에 약간의 오버헤드를 추가할 수 있습니다. 하지만, 이 성능 저하를 최소화하기 위한 연구와 최적화가 진행되고 있습니다.
  • 불완전한 보호: CFI는 제어 흐름의 무결성만을 보장합니다. 만약 공격자가 제어 흐름을 변경하지 않고 데이터만을 변조하는 경우에는 CFI로 방어할 수 없습니다.

요약:

**Control Flow Integrity(CFI)**는 프로그램의 제어 흐름을 감시하여, 악의적인 공격자가 코드 실행 흐름을 변경하려는 시도를 차단하는 보안 기술입니다. 제어 흐름 그래프(CFG)를 기반으로 예상된 흐름과 일치하는지 검사하여 ROP나 JOP 같은 공격을 방어하며, 프로그램의 무결성을 유지합니다.

반응형