Spectre-RSB Underflow / RSB stuffing bypass¶
Return Stack Buffer'ı kurut, böylece bir
retunderflow 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.
-
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. -
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
-
Transient gadget çalışır. Misprediction window boyunca gadget bir secret okur ve onu cache'e encode eder.
-
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¶
- Poison'lanmış ya da bayat entry'lerin tüketimini durdurmak için context switch ve
vmexit'te RSB filling / stuffing (rsb-stuffing-rsb-filling). - BTB-class kontrollerle birleştir — trust boundary'lerinde indirect-branch-restricted-speculation / enhanced IBRS ve indirect-branch-prediction-barrier — çünkü underflow BTB üzerinden yönlenebilir.
- Return thunk'lar (retbleed-return-thunk), etkilenen parçalarda return'leri kontrollü, non-speculative bir diziye dönüştürür.
- CPU microcode'unu ve OS mitigation'larını güncel tut.