Skip to content

RSB Poisoning (ret2spec)

Return Stack Buffer'ı poison et, böylece bir ret speculatively 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 fazla ret yü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