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는 프로토타입 일치 여부를 검사하지 못하고 제어 흐름이 즉시 탈취됨.
공격자 메모리 오염 (Heap/Stack) 1. Heap UAF / Out-of-Bounds Write 2. 함수 포인터 데이터 덮어쓰기 func_ptr = &hijacked_target; 간접 호출 호출부 (Caller Site) 기대 시그니처: void (*)(unsigned long) x86_64: mov %rax, %r11; call *%r11 ARM64: ldr x1, [x0]; blr x1 타깃 시그니처 검사 없음 (Blind Jump) 정상 대상: legit_target() 프로토타입: void (unsigned long) 의도된 정상 커널 실행 경로 탈취 대상: hijacked_target() 시그니처: void (void) / 임의 가젯 제어 흐름 탈취 성공 (Privilege Escalation!) 정상 시 변조 시 취약성 결과: 하드웨어 및 컴파일러 검증 부재로 인하여 유효하지 않은 타입의 임의 커널 함수 실행 허용됨.
정상 간접 호출 (Type Hash Match)
변조/불일치 호출 트랩 (CFI Failure Trap)
런타임 검증 프롤로그 (Compiler Injected Check)
컴파일 타임 Type Hash 주입