Skip to content

FineIBT

Coarse hardware CFI'yi (Intel CET IBT endbr64 landing 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.

References