FineIBT¶
Coarse hardware CFI'yi (Intel CET IBT
endbr64landing pad'leri) her indirect-call target'ında fine-grained bir software type-hash check'i ile hardening yapar.
Mechanism¶
Note
Intel CET IBT tek başına coarse'tur — herhangi bir indirect branch herhangi bir
endbr64'e land edebilir, yani tüm geçerli target'lar tek bir equivalence class'ı
paylaşır. FineIBT bunu, IBT'yi kCFI tarzı type checking ile birleştirerek daraltır:
compiler prototype başına bir hash hesaplar, caller indirect call'dan hemen önce
onu bir scratch register'a (%r10d Linux'ta) yükler ve callee'nin preamble'ı
(function-16'da, __cfi_foo sembolüne yerleştirilmiş) beklenen hash'i çıkarır ve
uyuşmazlıkta trap (ud2) eder. Check endbr'den sonra durduğu için, bir attacker
hem hardware IBT'yi sağlamak hem de software hash karşılaştırmasını geçmek zorundadır
— target kümesini "tüm fonksiyonlar"dan "tam olarak bu tipteki fonksiyonlar"a budar.
Kernel kCFI (CONFIG_CFI_CLANG) artı IBT (CONFIG_X86_KERNEL_IBT) üzerine kuruludur;
kernel, IBT-capable hardware'de boot'ta kCFI preamble'larını FineIBT formuna rewrite eder.
Overhead ~%0-1.94 (SPEC CPU2017).
Walkthrough¶
CONFIG_CFI_CLANG=y ve CONFIG_X86_KERNEL_IBT=y ile build et (Clang toolchain);
FineIBT, IBT CPU'larda boot'ta otomatik olarak seçilir.
Target tarafı preamble (kernel patch'inden verbatim):
__cfi_foo:
endbr64
subl $hash, %r10d ; caller put expected hash in r10d
jz 1f ; match -> fall through to foo
ud2 ; mismatch -> trap
nop
1:
foo:
endbr64
Caller, call *reg'den önce call-site başına type hash'ini %r10d'ye yükler.
Detection¶
Bir uyuşmazlık ud2 aracılığıyla fault üretir ve sessiz corruption yerine bir kernel
trap/oops olarak ortaya çıkar.
Mitigation¶
Warning
Clang hâlâ foo+0'da ikinci bir endbr64 emit eder, bu yüzden doğrudan foo'ya
land eden — __cfi_foo preamble'ını atlayan — bir indirect call IBT'yi sağlar ve
hash check'i elide eder. Düzeltme ("x86/fineibt: Poison ENDBR at +0"), caller'lar
preamble'a redirect edildikten sonra bu ikinci ENDBR'yi cfi_rewrite_endbr()
aracılığıyla poison eder.
Daha sonraki çalışma (FineIBT-BHI, 2025), Branch History Injection'ı köreltmek için
speculative-mismatch path'inde %rdi'yi poison eden bir CMOVNZ ekler.
Clang CFI, kernel CFI ve
Intel CET IBT ile karşılaştır.