Skip to content

Spectre-RSB Underflow / RSB stuffing bypass

Return Stack Buffer'ı kurut, böylece bir ret underflow eder ve farklı bir predictor'a (BTB) fallback eder — yalnızca RSB'yi refill eden ya da dengeleyen savunmaları atlatarak.

Mechanism

Note

Return Stack Buffer (RSB), predict edilmiş return target'larının küçük, sabit-derinlikli bir hardware stack'idir: her call bir return address push eder, her ret birini pop eder ve orada speculative olarak devam eder. Burada sömürülen invariant, stack boş olduğunda ne olduğudur. Bir program RSB'nin entry sayısından daha fazla ret gerçekleştirirse — derin bir call chain, uzun bir return dizisi ya da onu boşaltan bir context switch — sonraki ret'in pop edecek hiçbir RSB entry'si yoktur. Birçok microarchitecture'da predictor stall etmez; return target'ı tahmin etmek için Branch Target Buffer (BTB)'ya fallback eder (ya da başka bir generic indirect predictor'a). BTB, bir attacker'ın eğitebileceği bir same-/cross-address-space yapısı olduğundan, underflow eden bir ret fiilen poison'lanabilir bir indirect branch olur. Güvenlik sonucu: RSB'yi yalnızca dengeli tutan ya da onu zararsız entry'lerle refill eden bir mitigation, underflow prediction'ı hâlâ attacker-controlled bir BTB üzerinden yönlendiriyorsa bypass edilebilir; ret'i "güvenli" varsayan bir indirect-branch-restricted-speculation ya da retpoline politikası return yolunu açıkta bırakır.

Walkthrough

Bu, spectre-rsb ve ret2spec'in bir variant/edge case'idir; ayırt edici primitive, overfill poisoning değil underflow → BTB fallback'tir.

  1. RSB'yi boşalt. Ya return'leri RSB derinliğinden daha derine zincirle, ya da RSB'nin temizlendiği veya attacker-irrelevant state'le doldurulduğu bir geçişe (context switch / vmexit) güven.

  2. Fallback predictor'ı train et. BTB'yi poison'la ki return site'ın generic indirect prediction'ı seçilen bir Spectre gadget'ını göstersin — spectre-btb ile aynı training.

Kavramsal mantıksal adımlar
# imbalance: more rets than the RSB can hold
deep_chain:  call deep_chain      ; N nested calls...
             ...                  ; ...then N+ rets drains the RSB
underflow:   ret                  ; RSB empty -> predictor consults BTB
             ;  BTB was pre-trained -> transient jump to attacker gadget
  1. Transient gadget çalışır. Misprediction window boyunca gadget bir secret okur ve onu cache'e encode eder.

  2. flush-reload ya da prime-probe ile recover et.

Warning

Bunun savunma açısından önemli olmasının nedeni: RSB stuffing tek başına her zaman yeterli değildir. RSB'yi güvenli entry'lerle refill etmek poison'lanmış RSB tüketimini önler, ama underflow'un BTB'ye danıştığı parçalarda return yolu hâlâ BTB-class isolation'a ihtiyaç duyar (IBRS/eIBRS, boundary'lerde IBPB). Bu, sonradan retbleed ve inception'a sertleşen kavramsal soy hattıdır.

Detection

Architectural olarak görünmez. Instrumented host'larda, izlenen bir core'da mispredict edilmiş return'ler (BR_MISP_RETIRED.RET / return-mispredict event'leri) ya da RSB under/overflow event'leri için performance counter'lar, anormal dengesiz call/ret oranlarını işaret edebilir, ama sinyal kaba ve gürültülüdür; detective değil preventive kabul et. EDR'nin güvenilir bir user-mode sinyali yoktur.

Mitigation

References