Skip to content

Intel CET Indirect Branch Tracking

Her indirect CALL/JMP'in bir ENDBR32/ENDBR64 instruction'ına inmesini gerektiren forward-edge CET savunması; başka herhangi bir hedef bir control-protection (#CP) fault'u doğurur ve JOP/COOP'un fonksiyonların ortasına girişini engeller.

Mechanism

Neden çalışır

Jump-oriented ve call-oriented code reuse, bir indirect branch'in (CALL reg/JMP [mem]) keyfi bir adrese — tipik olarak bir fonksiyonun içindeki bir gadget'a — yönlendirilmesine dayanır. Indirect Branch Tracking (IBT), bu tür hedeflerin yasal kümesini compiler'ın açıkça işaretlediği instruction'larla sınırlar, böylece keyfi fonksiyon-ortası iniş artık izin verilmez.

  • Processor, mode başına IDLE ve WAIT_FOR_ENDBRANCH olmak üzere iki durumlu küçük bir tracker state machine çalıştırır. Bir indirect CALL veya JMP, tracker'ı WAIT_FOR_ENDBRANCH'e taşır; yürütülen sonraki instruction bir ENDBR32 (legacy/compat mode) veya ENDBR64 (64-bit mode) olmalıdır. Öyleyse tracker IDLE'a döner; başka bir şeyse CPU bir control-protection (#CP) exception'ı doğurur.
  • ENDBR32/ENDBR64, NOP encoding alanından seçilmiştir, dolayısıyla (IBT'siz veya IBT devre dışı) CPU'larda no-op olarak çalışır — binary uyumluluğunu korur. ENDBR64'e göre: koşullar sağlandığında IA32_U_CET.TRACKER = IDLE (CPL=3) ya da IA32_S_CET.TRACKER = IDLE yapar ve suppress bit'ini temizler.
  • Etkinleştirme, IA32_U_CET (user) / IA32_S_CET (supervisor) MSR'ındaki ENDBR_EN kontrolüdür. Bir NO_TRACK_EN kontrolü artı 3EH NOTRACK prefix'i, güvenilen indirect branch'lerin (örn. doğrulanmış jump table'ları) kontrolden muaf tutulmasını sağlar.
  • Compiler'lar landing pad'leri -fcf-protection=branch (GCC ≥ 9, Clang ≥ 14) altında emit eder ve opt-in'i GNU_PROPERTY_X86_FEATURE_1_IBT ELF note'u ile kaydeder. Kernel'de objtool, hiçbir indirect branch tarafından ulaşılmayan fonksiyonları enumerate eder ve onları "seal" eder; yasal hedef kümesini küçültmek için endbr'lerini bir nop4 ile overwrite eder.

Invariant: bir indirect branch koda yalnızca compiler tarafından onaylanmış bir landing pad'de girebilir. ENDBR ile başlamayan gadget'lar, hijack edilmiş bir indirect transfer yoluyla ulaşılamaz.

Walkthrough

1. CPU/binary desteğini kontrol et. IBT bir CPU feature'ı olarak görünür (örn. destekleyen kernel'lerde /proc/cpuinfo'da ibt); binary, GNU-property note'u aracılığıyla opt-in yapar:

$ readelf -n ./app | grep -a IBT
      Properties: x86 feature: IBT

2. Forward-edge koruması ile derle.

$ gcc -fcf-protection=branch -c f.c       # emit ENDBR landing pads
$ gcc -fcf-protection=full   -c f.c       # branch + shadow stack (return) together

3. Landing pad'leri incele. Her indirect-call hedef fonksiyonu bir endbr64 ile başlar:

$ objdump -d ./app | grep -A1 '<bar>:'
0000000000001150 <bar>:
    1150:  f3 0f 1e fa            endbr64

4. Bir JOP girişiminin fault vermesini izle. Bir indirect CALL/JMP'i (örn. bozuk bir function pointer veya vtable slot'u aracılığıyla) ENDBR olmayan bir adrese yönlendir: tracker WAIT_FOR_ENDBRANCH'tedir, sonraki instruction bir landing pad değildir ve CPU #CP teslim eder — Linux bunu gadget'ı çalıştırmak yerine bir control-protection SIGSEGV'i olarak raporlar.

IBT kaba taneli (coarse-grained)

IBT yalnızca bir branch'in herhangi bir geçerli ENDBR'a indiğini kanıtlar, o call site için doğru olana indiğini değil. Ulaşılabilir herhangi bir fonksiyon girişi yasal bir hedef olarak kalır ki bu tam olarak whole-function reuse saldırılarının (COOP, block-oriented programming) suistimal ettiği boşluktur. IBT'yi backward edge için shadow stack ve type-checked forward edge'ler için FineIBT ile eşleştir.

Detection

  • IBT-enabled process'lerde #CP control-protection fault'ları — untrusted-input işlerken tekrar eden fault'lar forward-edge hijack denemelerine işaret eder.
  • control-flow protection'a atıfta bulunan WER / OS crash telemetrisi.
  • EDR: CET-enabled process'lerin exploit delivery ile ilişkili erken sonlanması.

Mitigation

(Artık risk.) Her fonksiyon prologue'u yasal bir landing pad olduğundan, IBT call-site-confused reuse'a izin verir: address-taken herhangi bir fonksiyonun başına atlamak ya da girişleri zaten ENDBR taşıyan tüm virtual fonksiyonları chain'lemek. Counterfeit-object ve COOP aileleri tamamen IBT'nin izin verilen hedef kümesi içinde çalışır. FineIBT, o kümeyi daraltmak için landing pad'de call-site başına bir type hash kontrolü ekler.

References