제어흐름무결성(CFI) (Control-Flow Integrity)

정보보안학
한 줄 정의: 프로그램 실행 중 함수 호출과 반환 등 제어 흐름이 미리 정의된 정상 경로를 벗어나지 못하도록 강제하는 보안 기법입니다.

쉽게 풀면

기차가 정해진 선로 위로만 달릴 수 있도록 분기점마다 신호기가 통제하는 상황을 떠올려 보세요. CFI는 프로그램이 실행되는 동안 함수가 호출되고 되돌아오는 흐름을 이 신호기처럼 감시하여, 프로그램이 원래 설계된 경로가 아닌 곳으로 갑자기 튀는 것을 막습니다. 예를 들어 ROP 공격처럼 반환 주소를 조작해 엉뚱한 코드로 점프하려는 시도가 있으면, CFI는 그 점프가 허용된 목적지 목록에 없다는 것을 확인하고 실행을 차단합니다.

왜 중요한가

DEP 같은 실행 방지 기법이 ROP로 우회당하면서, 코드 자체를 막는 대신 실행 흐름을 감시하는 CFI가 대안적 방어 기법으로 주목받았습니다. 시스템 보안 연구에서는 CFI의 오버헤드, 정밀도, 우회 가능성을 다루는 것이 주요 주제 중 하나입니다.

논문에서는 이렇게 쓰입니다

"본 논문은 컴파일 타임에 제어 흐름 그래프를 생성하고 이를 기반으로 CFI를 적용하여 ROP 공격의 성공률을 크게 낮추는 방법을 제안한다."

CFI가 ROP 방어에 어떻게 활용되는지를 설명하는 문장입니다.

"제안 기법은 세밀한(fine-grained) CFI를 구현함으로써 기존의 성긴(coarse-grained) CFI 대비 오탐율을 낮추었다."

CFI 구현의 정밀도 수준에 따른 성능 차이를 언급하는 문장입니다.

조금 더 깊게 보면

CFI는 일반적으로 프로그램의 정상적인 제어 흐름 그래프(CFG)를 사전에 정적 분석으로 구축한 뒤, 런타임에 실제 점프나 호출이 이 그래프 상의 허용된 경로인지 검사하는 방식으로 동작합니다. 검사 정밀도에 따라 성긴(coarse-grained) CFI와 세밀한(fine-grained) CFI로 나뉘며, 세밀할수록 보안성은 높아지지만 일반적으로 실행 오버헤드도 커지는 경향이 있습니다.

주의할 점

CFI는 완벽한 방어 기법이 아니며, 허용된 경로 안에서도 공격에 악용될 수 있는 가젯이 남아 있을 경우 우회될 수 있다는 연구 결과들이 존재합니다.

관련 용어