Store-to-Load Forwarding¶
Out-of-ordercore, bekleyen bir store'un değerini, store retire olmadan önce store buffer'dan doğrudan daha genç (younger) bir load'a forward eder; yanlış tahmin edilen forwarding (ya da onun bypass'ı) Spectre v4'ün temelidir.
Mechanism¶
Note
Out-of-order bir core'da store'lar retire olana kadar bir store buffer'da bekler. Read-after-write bağımlılıklarını stall yapmadan onurlandırmak için, her load cache/memory'ye bakmadan önce aynı adrese yapılmış daha eski store'ları arar; bir eşleşmede store'un değeri, store commit edilmeden önce doğrudan store buffer'dan forward edilir. Tam adres karşılaştırması yavaş olduğundan core bir memory-disambiguation predictor kullanır ve kısmi adres eşleşmesinde forward edebilir ya da adresi henüz çözülmemiş bir store'u speculative olarak bypass edebilir. Bu tahmin yanlış olduğunda load, eski (stale) veriyle transient olarak çalışır ve bu veri ardından bir cache covert channel üzerinden sızdırılabilir — bu, Speculative Store Bypass'tır (Spectre v4 / SSB, CVE-2018-3639).
Walkthrough¶
Forwarding kuralı şudur: "her load, memory'ye bakmadan önce aynı adrese yapılmış daha eski store'ları arar." Spectre v4, store adresinin geç hesaplandığı durumu sömürür; öyle ki daha genç bir load o konumdaki eski değeri speculative olarak okur:
// store address resolves late; load executes speculatively with stale data
*slow_ptr = secret_index; // store, address not yet resolved
x = array[*slow_ptr]; // load may bypass the store, use OLD *slow_ptr
y = probe[x * 64]; // leak transient x via cache footprint
Mitigation, IA32_SPEC_CTRL MSR'ındaki bir bit ile kontrol edilen Speculative
Store Bypass Disable (SSBD)'dir (Intel bunu açığa çıkarmak için güncel microcode
gerektirir; AMD ise microcode olmadan sunar). SSBD'yi set etmek, load'ları önceki
store'lara göre non-speculative olmaya zorlar.
Maliyet
SSBD'yi etkinleştirmenin kabaca %2-8 overhead getirdiği bildirildi; en çok JIT-yoğun yazılımları (JavaScript engine'leri, eBPF) etkiler.
Mitigation¶
IA32_SPEC_CTRLüzerinden SSBD (process bazındaprctl(PR_SET_SPECULATION_CTRL)ile ya da global olarak) speculative bypass'ı devre dışı bırakır.- Sandbox'larda geç çözülen store'lardan hemen sonra secret-dependent adreslerden kaçınmak (örn. JIT'lerde masking) sömürülebilir gadget'ları azaltır.