Predictive Store Forwarding abuse¶
AMD Zen 3+ bir store'un verisini bir younger load'a, adreslerin gerçekten alias ettiğini doğrulamadan önce speculatively forward eder — mispredict edilen bir forward secret-bağımlı transient state bırakır, Spectre v4 / Speculative Store Bypass'ın aynı-context bir varyantı.
Mechanism¶
Neden çalışır
Store-to-load forwarding (STLF) köklü bir optimizasyondur: bir load, yakın bir store'un az önce yazdığı bir adresi okuduğunda, CPU store'un verisini cache'i beklemek yerine doğrudan store queue'dan forward eder. Normalde STLF yalnızca load ve store adreslerinin eşleştiği bilindiğinde devreye girer.
AMD Zen 3'te tanıtılan Predictive Store Forwarding (PSF) bir adım daha ileri gider: history'ye dayanarak hangi store'un belirli bir load'u besleyeceğini tahmin eder ve o veriyi speculatively, adresler resolve edilmeden önce forward eder. Tahmin iki şekilde yanlış olabilir:
- alias edeceği tahmin edilen store/load çifti aslında aynı konumu adreslemez, ya da
- tahmin edilen store/load ilişkisi artık geçerli değildir (ör. store yürütülmeyen bir yoldaydı).
Tahmin yanlış olduğunda, core misprediction'ı tespit edip rollback yapmadan önce younger instruction'lar yanlış (forward edilmiş) veri üzerinde transient olarak yürütülür. PSF speculation'ı mevcut program context'iyle sınırlı olduğu için, AMD etkisini Speculative Store Bypass (Spectre v4, CVE-2018-3639)'a benzer olarak niteler: bir load'un stale/yanlış veri kullandığı, secret-bağımlı etkileri bir cache covert channel üzerinden sızdırılabilen bir transient pencere. Risk başlıca, tek bir address space içinde software'de isolation'ı zorlayan koda yöneliktir — yani sandbox'lar.
Walkthrough¶
PSF tek başına bir güvenlik açığı değildir; mispredict edilen bir forward'ın transient bir load'un sandbox politikasının yasakladığı veriyi okumasına ve sonra onu cache'e encode etmesine izin verdiği bir software sandbox içinde Spectre-v4 tarzı bir gadget gerektirir.
Kavramsal gadget (klasik Speculative Store Bypass ile aynı biçim):
// 'idx' is sandbox-controlled; the store is meant to sanitize/overwrite slot[].
slot[safe_index] = sanitized; // store the CPU may predict will forward
char v = slot[attacker_index]; // PSF may forward the wrong store's data
char leak = probe_array[v * 4096]; // transient access -> cache footprint
// architecturally squashed, but the cache line for 'v' stays resident
Transient değer v daha sonra probe_array üzerinde
Flush+Reload gibi bir cache side channel ile recover edilir.
PSF'yi devre dışı bırakma / kontrol etme¶
AMD MSR 0x48 (SPEC_CTRL) içinde iki MSR kontrol bit'i açığa çıkarır:
MSR 0x48, bit 2 = SSBD (Speculative Store Bypass Disable) -> disables SSB *and* PSF
MSR 0x48, bit 7 = PSFD (Predictive Store Forwarding Disable) -> disables ONLY PSF
PSFD, yalnızca PSF için endişelenen ve tam SSBD'nin daha büyük performans
darbesinden kaçınmak isteyen software için daha hafif bir ayardır. Linux onu
toggle etmek için destek kazandı:
# AMD Zen 3 PSF control (kernel command line)
nopsfd # disable Predictive Store Forwarding
psfd # (re)enable it
# Confirm SSB / PSF mitigation status on the running kernel
$ cat /sys/devices/system/cpu/vulnerabilities/spec_store_bypass
Mitigation: Speculative Store Bypass disabled via prctl
Warning
AMD, "PSF davranışına karşı savunmasız sayılacak herhangi bir koddan haberdar olmadığını" belirtir ve pratik riski genel software için muhtemelen düşük olarak derecelendirir. Gerçekçi maruziyet, hardware'in transient olarak bypass edebileceği bounds/type check'lerine dayanan yüksek değerli in-process sandbox'lardır (JIT'ler, language VM'leri).
Detection¶
- Yalnızca dolaylı: diğer transient-execution saldırıları gibi, PSF suistimali cache side-channel artefaktları bırakır (leak adımı), dolayısıyla tespit edilebilir davranış PSF event'inin kendisi değil, etrafındaki Flush+Reload / Prime+Probe döngüsüdür.
Mitigation¶
- PSF'yi devre dışı bırakmak için PSFD'yi (
MSR 0x48bit 7), ya da hem PSF'yi hem de Speculative Store Bypass'ı devre dışı bırakmak için SSBD'yi (bit 2) set et; process başına kontrolüprctl(PR_SPEC_STORE_BYPASS) venopsfd/psfdkernel seçenekleri üzerinden aç. - Sandbox'lar bir store tarafından yazılan verinin bir speculation penceresi içinde daha sonraki bir load'a görünür olmasına güvenmemelidir; trust sınırlarında Spectre-v4 hardening (serializing fence'ler / process isolation) uygula.
References¶
- AMD. Security Analysis of AMD Predictive Store Forwarding. — https://www.amd.com/content/dam/amd/en/documents/processor-tech-docs/white-papers/security-analysis-of-amd-predictive-store-forwarding.pdf
- LWN. Introduce support for PSF mitigation. — https://lwn.net/Articles/851781/
- Ramakrishna Saripalli. [PATCH] Introduce support for PSF control (LKML). — https://lore.kernel.org/lkml/20210517220059.6452-1-rsaripal@amd.com/