Skip to content

Spectre-RSB

Return address'lerin hardware stack'i olan Return Stack Buffer (RSB)'ı manipüle ederek speculative return prediction'ını ele geçir, böylece bir ret gerçek caller'ı yerine transient olarak attacker'ın seçtiği bir gadget'a jump eder.

Mechanism

Note

Return Stack Buffer (RSB), return target'larını predict eden küçük, sabit-derinlikli bir hardware stack'idir. Her call'da CPU return address'i RSB'ye push eder; her ret'te en üstteki entry'yi pop eder ve orada speculative olarak devam ederek return address'i architectural stack'ten yükleme latency'sini gizler. Spectre-RSB'nin suistimal ettiği invariant: RSB'nin prediction'ı program stack'teki gerçek return address ile uyuşmaması sağlanabilir. Attacker RSB tepesini kontrol ederse — seçilen "return" target'larıyla onu overfill ederek ya da RSB'nin kuruduğu ve ret'in başka bir predictor'a (örn. BTB) fallback ettiği bir underflow'a yol açarak — ret, architectural state hâlâ resolve edilirken kontrolü speculative olarak bir Spectre gadget'ına transfer eder. Misprediction conditional ya da indirect-branch predictor'larından değil, return predictor'ından kaynaklandığı için, onlara yönelik mitigation'lar (retpoline, düz IBRS) bunu mutlaka kapsamaz.

Walkthrough

İki kanonik primitive RSB poisoning (overfill) ve RSB underflow'dur.

  1. RSB'yi poison'la. Push edilen return address'leri seçilen bir gadget'ı gösteren bir call dizisini, onları pop edecek eşleşen ret'ler olmadan execute et — böylece RSB tepesi artık attacker-controlled target'lar tutar:
; Conceptual RSB poisoning: push a gadget address onto the RSB,
; then divert architectural flow so the real return differs.
    call  set_rsb_entry      ; pushes &after_call onto the RSB
set_rsb_entry:
    lea   rax, [rip+gadget]  ; overwrite the on-stack return address
    mov   [rsp], rax         ; architectural return now goes to `gadget`...
    ret                      ; ...but RSB still predicts &after_call (transient)
after_call:
    ; transient execution runs here from the RSB prediction
  1. Ya da underflow'a zorla. Boş bir RSB ile yeterince ret'ten sonra (örn. derin bir call chain boyunca ya da bir context switch'te), sonraki ret'in RSB entry'si yoktur ve attacker'ın ayrıca poison'ladığı BTB / default prediction'a düşer.

  2. Transient gadget çalışır. Gerçek return address doğrulanmadan önceki window boyunca, speculative olarak execute edilen gadget bir secret okur ve onu cache'e encode eder.

  3. Secret'ı flush-reload ya da prime-probe ile recover et.

Beklenen davranış
Root cause:    Return Stack Buffer (RSB) return-address predictor
Primitives:    RSB poisoning (overfill)  |  RSB underflow -> BTB fallback
Trigger sites: deep call chains, context switches, mismatched call/ret
Bypasses:      retpoline and IBRS do not by themselves protect returns
Leak channel:  cache (Flush+Reload / Prime+Probe)

Warning

RSB state bir context switch boyunca kalıcı olabilir, dolayısıyla daha yüksek ayrıcalıklı bir context'teki bir ret, attacker'ın daha önce push ettiği entry'leri tüketebilir. Trust boundary'lerinde açık bir RSB-refill adımının gerekmesinin nedeni budur.

Detection

Misprediction architectural olarak görünmezdir. Mispredict edilmiş return'ler ya da RSB ile ilgili event'ler için performance counter'lar, izlenen bir core'da anormal davranışı işaret edebilir, ama bu kabadır; mitigation preventive'dir.

Mitigation

RSB stuffing / refilling: context switch'te (ve vmexit'te), kernel RSB'yi güvenli bir capture loop'unu gösteren zararsız "dummy" return address'lerle doldurur, böylece attacker-controlled entry'ler victim'in execution'ına kalıcı olamaz ve underflow zararsız koda düşer. Daha derin pipeline'lı ardılları (retbleed, inception) için rsb-poisoning'e ve indirect-branch karşılığı için retpoline'a bakın.

References