Skip to content

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), ret speculatively 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/callreturn'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. O ret'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 fazla ret instruction'ı 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 bir jmp ile predictor'ı poison ederek, predictor victim'in ret'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.

References