Skip to content

Spectre Variant 4 (Speculative Store Bypass) on Arm

Arm core'ları, daha eski, address'i örtüşen bir store resolve olmadan önce bir load'a stale bir değeri speculative olarak forward edebilir ve store'un üzerine yazacağı data'yı transient olarak açığa çıkarabilir (CVE-2018-3639).

Mechanism

Bug sınıfı / aşılan invariant

Memory-level parallelism çıkarmak için, bir Arm core bir load'u daha eski bir in-flight store'un aynı address'e yazıp yazmadığını resolve etmeden önce speculative olarak execute edebilir (bir memory disambiguation prediction). Predictor "alias yok" tahmin ettiğinde, load henüz commit edilmemiş store değeri yerine eski memory içeriğini okur ve dependent instruction'lar o stale data üzerinde transient olarak execute olur. Kırılan invariant speculation altında store-to-load ordering / data hazard doğruluğu'dur: bir değeri sanitize etmek, mask'lemek ya da relocate etmek için önceki bir store'a güvenen bir program'ın daha eski, secret-taşıyan memory image'i transient window boyunca tüketilebilir. Diğer Spectre variant'larında olduğu gibi, misprediction resolve olduğunda architectural state rollback edilir, ama transient computation bir attacker'ın okuyup çıkardığı bir microarchitectural iz bırakır. Bu özellikle, bir bounds pointer ya da type tag'in kullanımdan hemen önce yazıldığı language runtime'larında ve sandbox'larda önemlidir.

Walkthrough

Yüksek seviyeden, Arm whitepaper'ından ve arm64 SSBD kernel mitigation serisinden (LWN).

Kavramsal reprodüksiyon
  1. Disambiguation hazard'ını kur. Bir slot'a bir store, ardından aynı slot'un bir load'unu düzenle; store geciktirilir (örn. resolve olması yavaş bir address hesabı aracılığıyla) ve slot daha önce secret-türevli bir değer tutmaktadır.
  2. Prediction'ı mistrain et / sömür. Core, load'un bekleyen store'a alias'lamadığını predict eder ve stale önceki içeriği forward eder.
  3. Transient leak gadget'ı. Dependent instruction'lar, speculation window boyunca bir probe array'i index'lemek için stale değeri kullanır.
  4. Recover et. Pipeline transient yolu squash etmeden önce sızdırılan değeri çıkarsamak için probe array'i bir cache-timing channel üzerinden oku (bkz. Flush+Reload / Prime+Probe).

Detection

Sinyaller dolaylıdır

  • Exposure envanteri: Linux'ta core'un vulnerable olup olmadığını ve mitigation state'ini görmek için /sys/devices/system/cpu/vulnerabilities/spec_store_bypass'i oku.
  • Firmware probing: entry/exit'te dinamik SSBD handling'e işaret eden SMCCC_ARCH_WORKAROUND_2 feature discovery / toggling çağrılarını gözle.
  • prctl aktivitesi: PR_SPEC_STORE_BYPASS aracılığıyla opt-in yapan process'ler audit edilebilir; JIT'lerde/sandbox'larda opt-in olmaması bir hardening boşluğudur.
  • Bir victim'in sıkı store-then-load loop'ları etrafında ani yükselen PMU memory-ordering machine-clear / nuke counter'ları exploitation'a işaret edebilir, ama spesifik değildir. Tek bir transient leak architectural olarak loglanmaz.

Mitigation

  • PSTATE.SSBS (Speculative Store Bypass Safe). Bir Armv8.5 feature'ı (daha eski core'larda da implement edilebilir) ki clear olduğunda unsafe store bypass'ı devre dışı bırakır; SCTLR_ELx.DSSBS, kernel entry'sinde uygulanan varsayılanı kontrol eder.
  • Firmware SSBD toggle. SMCCC_ARCH_WORKAROUND_2, mitigation'ı per-PE enable/disable eder; kernel onu EL0↔EL1 geçişlerinde dinamik olarak sürebilir ya da firmware etkilenen core'larda statik bir "chicken bit" set edebilir.
  • Per-process kontrol. prctl(PR_SET_SPECULATION_CTRL, ...), hassas task'ların (JIT'ler, browser'lar, sandbox'lar) opt-in yapmasına olanak tanır ve x86 SSBD interface'ini yansıtır (bkz. Speculative Store Bypass Disable).
  • Firmware'i, hypervisor'ı ve kernel'i güncel tut; durumu yukarıdaki sysfs file üzerinden doğrula ve untrusted kod execute eden herhangi bir runtime için mitigation'ı etkinleştir.

References