Clang kCFI (Kernel Control Flow Integrity)Linux 6.12+
1. 전통적 간접 함수 호출 취약점 (Unchecked Indirect Call Hijacking)
전통적 C 언어 및 베이스라인 리눅스 커널에서는 함수 포인터 간접 호출((*func_ptr)(arg)) 시 CPU가 해당 레지스터의 메모리 주소로 무조건 분기(call *%reg / blr xN)함. 공격자가 힙 오버플로우나 UAF(Use-After-Free)로 함수 포인터를 임의의 커널 함수나 가젯 주소로 변조하면, CPU는 프로토타입 일치 여부를 검사하지 못하고 제어 흐름이 즉시 탈취됨.
2. Clang kCFI 컴파일 타임 Type Hash 주입 메커니즘
Clang kCFI(-fsanitize=kcfi)는 LTO(링크 타임 최적화) 없이 동작하는 현대적인 정방향 CFI 기법임. Clang 컴파일러는 각 함수의 선언 시그니처(리턴 타입 및 인자 타입 리스트)를 기반으로 고유한 32비트 정수 해시(Type Hash Tag)를 산출하여, 함수 진입점 직전 4바이트(-4(%reg))에 프리픽스 데이터로 임베딩함.
3. 런타임 동기 검증 & ud2/brk Trap 메커니즘
Clang kCFI가 활성화되면 컴파일러는 모든 간접 호출 지점에 검증 프롤로그 코드를 자동 삽입함. 대상 함수 포인터에서 4바이트를 거슬러 올라가 읽은 후(-4(%reg)), 기대하는 타입 해시 상수와 비교함. 일치하면 정상 호출하며, 불일치 시 하드웨어 트랩(x86: ud2, ARM64: brk #0x8000)을 발생시켜 커널 예외 처리기로 즉시 제어권을 넘김.
4. Base vs Hardened 커널 보안 아키텍처 비교
Clang kCFI 비활성화 커널(Base)과 kCFI 활성화 커널(Hardened)의 제어 흐름 보호 특성 및 성능 오버헤드, 모듈 호환성 매트릭스를 대조함.