Intel CET Indirect Branch Tracking¶
Her indirect
CALL/JMP'in birENDBR32/ENDBR64instruction'ı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
CALLveyaJMP, tracker'ıWAIT_FOR_ENDBRANCH'e taşır; yürütülen sonraki instruction birENDBR32(legacy/compat mode) veyaENDBR64(64-bit mode) olmalıdır. Öyleyse trackerIDLE'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ığındaIA32_U_CET.TRACKER = IDLE(CPL=3) ya daIA32_S_CET.TRACKER = IDLEyapar ve suppress bit'ini temizler.- Etkinleştirme,
IA32_U_CET(user) /IA32_S_CET(supervisor) MSR'ındakiENDBR_ENkontrolüdür. BirNO_TRACK_ENkontrolü artı3EHNOTRACK 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'iGNU_PROPERTY_X86_FEATURE_1_IBTELF note'u ile kaydeder. Kernel'deobjtool, hiçbir indirect branch tarafından ulaşılmayan fonksiyonları enumerate eder ve onları "seal" eder; yasal hedef kümesini küçültmek içinendbr'lerini birnop4ile 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:
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:
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
#CPcontrol-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¶
- LWN.net. Indirect branch tracking for Intel CPUs. — https://lwn.net/Articles/889475/
- felixcloutier (Intel SDM mirror). ENDBR64 — Terminate an Indirect Branch in 64-bit Mode. — https://www.felixcloutier.com/x86/endbr64
- Intel. Indirect Branch Tracking — 12th Gen Intel Core Processors Datasheet. — https://edc.intel.com/content/www/us/en/design/ipla/software-development-platforms/client/platforms/alder-lake-desktop/12th-generation-intel-core-processors-datasheet-volume-1-of-2/006/indirect-branch-tracking/
- Intel. A Technical Look at Intel's Control-flow Enforcement Technology. — https://www.intel.com/content/www/us/en/developer/articles/technical/technical-look-control-flow-enforcement-technology.html
- Microsoft. Understanding Hardware-enforced Stack Protection. — https://techcommunity.microsoft.com/blog/windowsosplatform/understanding-hardware-enforced-stack-protection/1247815