Retbleed¶
ETH Zurich'ten (USENIX Security 2022) return instruction'larını ele geçiren bir Spectre-BTI varyantı: Return Stack Buffer underflow ettiğinde (Intel) ya da return'ler indirect branch olarak mispredict edildiğinde (AMD),
retspeculatively bir BTB-injected target'ı izler — indirect branch'leri return'lere çeviren retpoline'ı alt eder.
Mechanism¶
Neden çalışır
Branch Target Injection / Spectre-BTB'nin retpoline ile
kontrol altına alındığı düşünülüyordu; retpoline indirect jmp/call'ı
return'lerin attacker tarafından yönlendirilemez olduğu varsayımıyla
ret tabanlı bir thunk ile değiştirir. Retbleed bu varsayımın yanlış
olduğunu gösterir:
- Intel (RSB underflow): Return Stack Buffer (RSB) küçük, sabit sayıda
öngörülmüş return target tutar. Derin bir call chain RSB'nin underflow
etmesine neden olduğunda (track edilen entry'den daha fazla
ret), microarchitecture return target'ı öngörmek için generic indirect-branch predictor (BTB)'ye geri düşer. Oret'in adresi için BTB'yi poison etmiş bir attacker, speculative return'ü seçilmiş bir gadget'a yönlendirir. Yazarlar, system call'lar üzerinden user space'ten çalıştırılabilen, bu türden underflow ile erişilebilir binden fazlaretinstruction'ı buldu. - AMD (branch type confusion): etkilenen Zen part'larında bir
ret, return-address-stack state'inden bağımsız olarak indirect branch olarak öngörülebilir. Çakışan bir adreste indirect birjmpile predictor'ı poison ederek, predictor victim'inret'ini bir indirect jump gibi ele alır ve speculatively injected target'a atlar. (AMD ayrıca hiç branch olmayan adresler için "Phantom JMP" tahminleri sergiler, CVE-2022-23825.)
Her iki durumda da ret, bir cache footprint bırakan speculative bir gadget
çalıştırır; bu da bir Flush+Reload covert channel ile geri
çıkarılır — speculation penceresi boyunca privileged (kernel) memory'yi
sızdırır.
Retpoline sadece eksik değil, baltalanıyor
Retpoline indirect branch'leri etkisizleştirmek için return'ler oluşturduğu için, etkilenen CPU'larda korunan bir indirect branch'i exploit edilebilir bir return'e çevirebilir. Retbleed bu yüzden birçok kernel'in birincil Spectre-v2 savunması olarak güvendiği bir mitigation'ı kırar.
Walkthrough¶
Exploit, diğer BTI saldırılarıyla aynı üç faza sahiptir; yenilik trigger
(underflow eden/karıştırılan bir ret) ve ona ulaşan kernel call site'larının
aranmasıdır.
1. PROFILE : find a kernel `ret` reachable from a syscall whose RSB will be
underflowed (deep call chain), and a disclosure gadget reachable
from a mispredicted target.
2. POISON : from user space, train the BTB so the address of that `ret`
(Intel) or a colliding branch (AMD) predicts the gadget address.
3. TRIGGER : invoke the syscall; the kernel `ret` underflows the RSB
(Intel) / is mistyped as indirect (AMD) and speculatively runs
the gadget on secret kernel data.
4. RECOVER : Flush+Reload the gadget's probe array to read out the leaked
byte; repeat to scan kernel memory.
Belirli bir sistemin mitigate edilip edilmediğini kernel'in kendi raporuyla doğrula:
$ cat /sys/devices/system/cpu/vulnerabilities/retbleed
Mitigation: untrained return thunk; SMT disabled
Etkilenen part'lar ve CVE eşlemesi (ETH Zurich comsec'e göre)
Intel : CVE-2022-29901 Core generations 6, 7, 8 (RSB underflow)
AMD : CVE-2022-29900 Zen 1, Zen 1+, Zen 2 (return mispredicted
as indirect branch)
AMD : CVE-2022-23825 "Phantom JMP" predictions (no branch present)
Channel: Flush+Reload over a speculatively-touched probe array
Impact : speculative arbitrary kernel-memory disclosure across protection
boundaries; retpoline-based Spectre-v2 mitigations bypassed
Detection¶
- Kernel'in durum string'i için
/sys/devices/system/cpu/vulnerabilities/retbleed'i kontrol et (Vulnerable,Mitigation: ...). - Diğer transient-execution saldırılarında olduğu gibi, güvenilir bir in-band runtime detector yoktur; savunma detection değil, mitigation'dır.
Mitigation¶
- Intel: enhanced IBRS / risk altındaki return'lerin etrafında IBRS ayarlamak, artı RSB'nin asla BTB'ye underflow etmemesi için RSB stuffing.
- AMD: return'leri güvenli, BTB-isolated bir diziden geçiren Linux "untrained return" (jmp2ret) thunk'ı; alternatif olarak call-depth tracking / RSB stuffing.
- SMT'yi devre dışı bırakmak, etkilenen Intel part'larında sibling-thread training yolunu kaldırır. ETH Zurich bu mitigation'ların önemli overhead taşıdığını raporlar (AMD'de kabaca %14, Intel'de %39; Phantom-JMP savunmaları belirgin biçimde daha fazla).
- Ayrıca daha geniş Spectre / Spectre-BTB / RSB Poisoning ailesine bakın.