개요
Control flow integrity (CFI)는 컴퓨터 보안에서 flow of execution즉 코드의 실행에 관한 보안을 지칭한다.
Background
Control flow란 컴퓨터 프로그램에서 Decision을 나타낸다. 이러한 Control flow는 Direct, 즉 Address를 직접 참고 하여 실행 될 수 있거나, In-direct, 즉 Address에 대한 간접 참조로 접근하는 두 모델을 가르킨다. 대부분의 함수 콜에서 프로그램은 Direct call을 수행하고 Stack에 Return하는 함수의 콜 주소를 참조하여 다시 원래의 함수로 돌아온다. 그러나, 이 상황에서 Atacker는 프로그램 코드의 임의의 부분으로 점프할 수 있는 Return함수의 콜 스택을 변조를 시도할 수 있다. 이를 통하여 Attacker는 임의의 함수를 실행, 메모리를 탈취하거나, 권한없는 함수를 실행시킬 수 도 있다. 자세한 내용은 ROP참고.
주요 개념
- Control flow graph (CFG)
- CFI는 프로그램의 정상적인 실행 흐름을 나타내는 제어 흐름 그래프(CFG)를 생성하여, 프로그램이 실행 중에 이 CFG를 벗어나지 않도록 보장한다.
- Verification
- 프로그램이 실행 중 특정 지점에서 수행할 수 있는 제어 흐름(예: 함수 호출, 반환)이 CFG에 정의된 범위 내에 있는지 확인한다.
- Indirect Branch Protection
- 함수 포인터, 가상 함수 테이블(vtable), 반환 주소와 같이 공격자가 조작할 가능성이 있는 간접 제어 흐름을 보호한다.
이상, code-pointer separation, code-pointer integrity, stack canaries, shadow stacks, vtable pointer verification등등 다양한 기법들이 존재한다.