RSB Poisoning (ret2spec)¶
Return Stack Buffer'ı poison et, böylece bir
retspeculatively attacker'ın seçtiği bir adrese atlar: RSB'yi overflow ederek (recursion) ya da onu bir SMT sibling boyunca paylaşarak, return'ler bir cache covert channel üzerinden memory sızdıran bir gadget'a mispredict eder.
Mechanism¶
Neden çalışır
Modern CPU'lar bir ret'in target'ını özel bir Return Stack Buffer
(RSB) ile öngörür — software call stack'ini yansıtan küçük bir hardware
stack (Intel'de yaygın olarak 16 entry): her call return adresini
push'lar, her ret onu pop'layıp öngörür. Tahmin, gerçek return adresi
memory'den yüklenmeden önce speculatively tüketilir.
RSB sabit boyutlu, circular bir yapıdır ve kusur da budur:
- Overflow (aynı process): bir program RSB'nin entry sayısından daha
derine recurse ederse, erken entry'ler overwrite edilir. Recursion geri
açıldığında, en derin
ret'ler stale / yanlış öngörülen target'lar bulur ve overwrite edilmiş adreste speculatively yürütülür — attacker'ın derin call pattern'ini kontrol ederek seçtiği bir adres. - Underflow / cross-context: track edilen
call'lardan daha fazlaretyürütülürse RSB underflow eder; tahminler o zaman bir stale entry'den gelir. RSB SMT sibling'leri arasında paylaşıldığından (ve incelenen part'larda context switch'te flush edilmediğinden), bir thread victim thread'inin pop'layacağı entry'leri poison edebilir ve victim'in speculative return'lerini attacker-controlled bir konuma yönlendirebilir.
Mispredict edilen ret, secret-dependent veriyi cache'e yükleyen speculative
bir gadget çalıştırır; sonuç Flush+Reload ile geri
çıkarılır. Teknik, yalnızca return'leri kullanarak Spectre sınıfı yetenekler
— speculative arbitrary read — verir ve eşzamanlı olarak ret2spec
(Maisuradze & Rossow, CCS 2018) ve Spectre Returns! (Koruyeh ve diğ.,
WOOT 2018) olarak tanıtıldı.
Walkthrough¶
Aynı process'teki overflow varyantı privileged bir kurulum gerektirmez — derin recursion priming primitive'idir:
// Conceptual: recurse past the RSB depth to leave stale predicted targets,
// then return through a window where the architectural target differs from
// the (attacker-influenced) predicted target.
void recurse(int depth) {
if (depth == 0) {
// base case: by here the RSB has been overwritten beyond its 16 slots
return; // this ret mispredicts to a stale target
}
recurse(depth - 1);
// speculative window on the return path: gadget runs at predicted target
}
Cross-context (SMT) varyantı sibling'in RSB'sini poison eder, sonra victim'in return etmesine izin verir:
1. POISON : attacker thread executes a call/ret pattern that fills RSB entries
with addresses pointing at a chosen speculative gadget.
2. CO-RUN : victim thread on the SMT sibling executes a `ret`; the shared RSB
supplies the poisoned target.
3. LEAK : victim speculatively runs the gadget, touching a probe array at an
index derived from secret data.
4. RECOVER : attacker Flush+Reloads the probe array to read out the secret.
Gösterilen yetenekler (ret2spec / Spectre Returns)
RSB depth (Intel) : ~16 entries -> recursion past 16 frames overwrites it
Misspeculation : `ret` predicted target != architectural return addr
Covert channel : Flush+Reload over a 256-entry probe array
Shown : speculative reads of process memory; enumeration of
mapped pages; relevance to breaking ASLR.
Relation : same RSB structure later abused across privilege
boundaries by Retbleed (USENIX 2022).
Detection¶
- Güvenilir bir in-band detector yoktur; speculative iş squash edilir ve geriye yalnızca bir cache footprint bırakır. Dolaylı sinyaller arasında, sıkı Flush+Reload probe döngüleriyle birleşmiş olağandışı derin recursion bulunur.
Mitigation¶
- RSB stuffing / "RSB filling": context switch'te ve kernel entry'de, tüm RSB entry'lerini zararsız bir trap adresiyle overwrite et, böylece underflow stale/poison edilmiş target'lara düşemez.
- Microcode/IBRS sınıfı kontroller ve SMT'yi devre dışı bırakmak cross-sibling poisoning yolunu kaldırır.
- Hassas return yollarında speculation barrier'ları (
lfence) ve constant-time code, exploit edilebilir gadget'ları azaltır. - Retbleed'deki cross-boundary escalation'a ve daha geniş Spectre / Spectre-BTB ailesine bakın.
References¶
- ret2spec: Speculative Execution Using Return Stack Buffers (CCS 2018, PDF)
- ret2spec (arXiv:1807.10364)
- Koruyeh, Khasawneh, Song, Abu-Ghazaleh, "Spectre Returns! Speculation Attacks using the Return Stack Buffer," USENIX WOOT 2018 (concurrent work).