Skip to content

Memory Disambiguation Prediction Abuse (Spectre v4 / Speculative Store Bypass)

CPU'nun memory-disambiguation predictor'ını kandırarak, bir load'un henüz çözülmemiş bir store'un ötesinde stale (bayat) veriyi speculative olarak okumasına izin verdir, ardından onu bir cache covert kanalı üzerinden sızdır.

Mechanism

Note

Out-of-order çekirdekler load'ları mümkün olduğunca erken execute etmek ister. Bir load, adresi henüz hesaplanmamış bir store'u takip ettiğinde, memory-disambiguation predictor bunların alias edip etmediğini tahmin eder. Çakışma yok tahmin ederse, load'un store'u bypass etmesine ve şu anda bellekte olan ya da daha eski bir store'dan forward edilen değeri — yani stale veriyi — okumasına izin verilir. Tahmin yanlışsa (gerçekten alias ettilerse), pipeline daha sonra load'u squash eder ve doğru değerle yeniden execute eder. Mimari sonuç her zaman doğrudur, ama load'un stale veriyi tükettiği geçici window mikromimari olarak gözlemlenebilir.

Jann Horn (Google Project Zero) ve Ken Johnson (MSRC) tarafından açıklanan Speculative Store Bypass (CVE-2018-3639, "Variant 4") bunu istismar eder. Bir saldırgan, bir pointer/index'i güvenli bir değerle üzerine yazan bir store ve hemen ardından buna bağımlı bir load düzenler. Predictor load'un store'u bypass etmesine izin verirse, load eski (saldırgan-lehine) değeri kullanır, out-of-bounds ya da hassas veriye erişir ve sonuç squash'tan önce bir Flush+Reload / Prime+Probe cache kanalına yönlendirilir. En tehlikeli olduğu yer, saldırganın çevredeki kodu kontrol ettiği sandbox'lanmış JIT'lerdir (JavaScript). Bu sınıf, store-bypass prediction uygulayan Intel, AMD, ARM ve IBM POWER çekirdeklerini etkiler.

Walkthrough

Kavramsal gadget (speculative okuma, store çözülmeden önce gerçekleşir):

// arr8[idx] is a pointer the sandbox just sanitized via the store below.
// The store's address depends on a slow computation, so it resolves late.
*slow_addr_ptr = safe_value;          // STORE (address resolves late)
uint8_t v = secret_array[arr8[idx]];  // LOAD bypasses store -> reads stale idx
tmp = probe[v * 4096];                // leak v into the cache channel

Mitigation, x86'da mimari MSR'ler/CPUID üzerinden enumerate edilir ve açılıp kapatılır:

CPUID feature bits  : IA32_ARCH_CAPABILITIES, SSBD support advertised via CPUID
Control MSR         : IA32_SPEC_CTRL, bit 2 = SSBD (Speculative Store Bypass Disable)
                      writing SSBD=1 disables the store-bypass speculation

Linux bunu per-thread bir opt-in ve bir boot knob'u olarak açığa çıkarır:

# Boot-time policy
#   cat /proc/cmdline | tr ' ' '\n' | grep spec_store_bypass_disable
#   options: on | off | auto | prctl | seccomp
spec_store_bypass_disable=prctl

# Per-process control at runtime
#   prctl(PR_SET_SPECULATION_CTRL, PR_SPEC_STORE_BYPASS, PR_SPEC_DISABLE, 0, 0)
cat /sys/devices/system/cpu/vulnerabilities/spec_store_bypass
# e.g. "Mitigation: Speculative Store Bypass disabled via prctl"

Detection

Temiz bir mimari imza yoktur; sızıntı geçicidir. Savunucular, mitigation durumunu /sys/devices/system/cpu/vulnerabilities/spec_store_bypass üzerinden bilmeye ve herhangi bir cache covert kanalına özgü yoğun cache-probing loop'larının anomali tespitine güvenir.

Mitigation

  • Store-bypass speculation'ı devre dışı bırakmak için IA32_SPEC_CTRL.SSBD'yi (bit 2) ayarla, performans pahasına — bu yüzden prctl/seccomp opt-in modeli.
  • Process izolasyonu ve sandbox'larda (browser JIT'leri) yüksek çözünürlüklü timer'ları / paylaşılan array'leri kaldırmak, exfiltration kanalını kırar.

References