SRSO mitigation (Speculative Return Stack Overflow)¶
SRSO / "Inception" (CVE-2023-20569), non-architectural bir CALL'un bir Return Address Predictor entry'si ekmesine ve sonraki bir RET'i saldırganın seçtiği bir gadget'a yönlendirmesine izin verir; Linux mitigation'ı her kernel RET'ini kontrollü bir "safe return"e speculate etmeye zorlar.
Mechanism¶
Note
Kavramsal: NEDEN işe yarar, invariant/teori.
AMD CPU'ları (Zen 1–4, family'ler 0x17 ve 0x19) bir RET'in target'ını
bir Return Address Predictor (RAP) kullanarak tahmin eder — esasen
Return Stack Buffer / Return Address Stack. Normalde bir CALL return
target'ını bu yapıya push eder ve eşleşen RET onu pop eder.
SRSO flaw'ı şudur: bir non-architectural CALL — front end'in, architectural
path üzerinde gerçekte bir CALL olmamasına rağmen CALL olduğunu predict
ettiği bir instruction — RAP'te bir entry yaratabilir. Sonraki bir RET
de o attacker-influenced entry'ye predict edilebilir. Branch Target Buffer
(BTB) poisoning ile birleştiğinde, host üzerinde code çalıştırabilen bir
saldırgan bir kernel RET'ini bir disclosure gadget'ına speculatively
atlatabilir ve privileged memory'yi bir microarchitectural side channel
üzerinden sızdırabilir. Saldırı local scope'tur (ağ üzerinden uzaktan
yürütülemez); ancak bir unprivileged local process ya da bir VM guest'i,
host kernel'ini — bir hypervisor host'u dahil — hedef alabilir. Target
layout'u ve gadget offset'leri hakkında ayrıntılı bilgi gerektirir.
Linux mitigation'ı şu invariant'ı yeniden tesis eder: her kernel return'ü,
attacker-poisoned bir prediction yerine kontrollü, güvenli bir konuma
speculate eder. Bunu, return'leri __x86_return_thunk üzerinden
yönlendirerek yapar; bu da CPU'yu her function return'ünü bilinen bir
"safe return" sekansına mispredict etmeye zorlar (ruhen Retbleed için
kullanılan return-thunk yaklaşımına benzer). Zen 3/4'te implementation, bir
"untrain" routine'i (srso_alias_untrain_ret()) ile bir "safe return"
routine'i (srso_alias_safe_ret()) arasında kasıtlı BTB aliasing kullanır;
böylece poisoned herhangi bir RAP/BTB entry'si, gerçek bir return onu
tüketmeden önce evict edilir.
Birkaç policy noktası güvenliği maliyete karşı dengeler:
- microcode — yalnızca extended-IBPB microcode'unu uygula (hardware-seviyesi yardım, return thunk yok).
- safe-ret (default) — yukarıdaki gibi software return-thunk mitigation'ı.
- ibpb — privilege transition'larında bir Indirect Branch Prediction Barrier çıkar.
- ibpb-vmexit — IBPB'yi yalnızca VM exit'lerinde çıkar (host'u guest'lerden koru).
- off — mitigation'ı devre dışı bırak.
Walkthrough¶
Çalışan CPU'nun etkilenip etkilenmediğini ve nasıl mitigate edildiğini kontrol et:
Örnek çıktılar:
Boot policy'sini spec_rstack_overflow= kernel command line parametresi
üzerinden incele / ayarla:
Geçerli değerler:
spec_rstack_overflow=microcode
spec_rstack_overflow=safe-ret # default
spec_rstack_overflow=ibpb
spec_rstack_overflow=ibpb-vmexit
spec_rstack_overflow=off
CPU family/model'inin etkilenen aralıkta olduğunu doğrula (Zen 1–4 ⇒ family 0x17 veya 0x19):
Örnek:
(family 25 == 0x19 == Zen 3/Zen 4.)
Etkilenen bir kernel'de Safe RET'i implement eden return-thunk symbol'lerini gözlemlemek için:
(Gerçek adresleri göstermek için kptr_restrict=0 gerekir — bkz.
kptr-restrict.)
Detection¶
/sys/devices/system/cpu/vulnerabilities/spec_rstack_overflowyetkili status string'idir.VulnerableveyaVulnerable: Safe RET not enableddeğeri, mitigation'ın eksik ya da devre dışı olduğunu gösterir.
Mitigation¶
- Etkilenen AMD Zen 1–4 hardware'inde
spec_rstack_overflow=safe-ret'i (default) koru ve extended IBPB için AMD microcode update'ini uygula. - Hypervisor host'larında, host'u guest'lerden tam IBPB'den daha düşük
maliyetle korumak için
ibpb-vmexit'i düşün. - İlgili return/branch speculation savunmaları: retbleed-return-thunk, indirect-branch-prediction-barrier, retpoline.