Skip to content

SPOILER (memory order buffer leak)

Intel'in speculative load / store-to-load-forwarding logic'indeki bir timing leak'i: dependency resolution önce yalnızca kısmi (page-offset) address bit'lerini karşılaştırdığı için, kasıtlı olarak hazırlanmış bir load, kendi physical page'inin önceki store'larla ne zaman alias yaptığını açığa çıkarır, physical address'in ~20 bit'ine kadarını leak eder ve Rowhammer ile cache attack'larını hızlandırır.

Mechanism

Note

Intel core'ları load'ları daha eski store'ların önünde speculative olarak çalıştırır ve ordering'i zorlamak için Memory Order Buffer (MOB)'u — store buffer artı load buffer — kullanır. Bir load, address'leri alias yapabilecekse pending bir store'dan data forward edebilir. Bunu, tam physical address'ler bilinmeden önce karara bağlamak için disambiguation logic'i yalnızca alt 12 page-offset bit'ini karşılaştırır ("4K aliasing"). Kısmi karşılaştırma hit yaptığında ama tam physical address'ler farklı olduğunda speculation yanlıştır: load squash edilir ve yeniden issue edilir ve bu yeniden çözümleme cycle'lara mal olur. SPOILER'ın invariant'ı: bu squash-and-reissue'nun latency'si, kaç tane daha yüksek physical-address bit'inin gerçekte alias yaptığına bağlıdır. Store buffer'ı, timed bir load ile 4K-alias yapan address'lerle doldurup page frame'i sweep'leyerek, unprivileged bir process (JavaScript bile) herhangi bir privileged mapping interface'i olmadan kendi virtual page'lerinin physical-address yapısını okur.

Walkthrough

Signal, address aliasing'e göre anahtarlanmış bir latency merdivenidir. Raporlanan yaklaşık latency'ler: dependency yokken ~30 cycle, yalnızca store'lar arasında 4K aliasing varken ~100 cycle, load ile store'lar arasında 4K aliasing varken ~200 cycle ve 1 MB aliasing'de belirgin bir high-latency peak — yani alt 20 physical-address bit'i eşleştiğinde, shared bir eviction-set page'i işaretler.

  1. Store buffer'ı doldur: hedef address'leri bir target load address ile 4K-alias yapan store'larla (aynı page offset, farklı page'ler).
// Conceptual SPOILER probe: time a load after a window of aliasing stores,
// sweeping the page index. WINDOW ~ store-buffer depth (e.g. ~64; larger on
// newer microarchitectures). A latency peak marks higher-bit aliasing.
for (size_t page = 0; page < PAGE_COUNT; page++) {
    flush_window();
    for (int i = 0; i < WINDOW; i++)
        store_buf[i * PAGE_SIZE + offset] = 0;   // 4K-aliasing stores
    t0 = rdtscp();
    sink = probe[page * PAGE_SIZE + offset];      // timed dependent load
    t1 = rdtscp();
    latency[page] = t1 - t0;                       // peak => physical aliasing
}
  1. Load'un page frame'ini sweep et ve page başına latency'yi kaydet. Peak'ler aliasing periyodunda tekrar eder, OS'in aksi takdirde virtual-to-physical translation'ın ardına saklayacağı high-order physical bit'leri ortaya çıkarır.

  2. Leak'i exploit et. Hangi virtual page'lerin physical eviction-set bit'lerini paylaştığını bilmek attacker'ın cache eviction set'lerini çok daha hızlı kurmasını (eviction-set arama için raporlanan ~4096x speedup) ve bir victim row'un etrafına deterministic double-sided Rowhammer aggressor row'larını yerleştirmesini sağlar.

Expected behavior
Root cause: partial-address (12-bit) memory disambiguation in the MOB
Signal:     load latency after a window of 4K-aliasing stores
Latencies:  ~30 (none) / ~100 (store 4K) / ~200 (load+store 4K) / peak @ 1 MB
Leak:       ~20 low physical-address bits of the attacker's own pages
Boosts:     ~256x v->p reverse-engineering, ~4096x eviction-set search,
            deterministic double-sided Rowhammer
Scope:      unprivileged, works from sandboxes (JavaScript); CVE-2019-0162

Detection

Probe, store'lar ve rdtscp-tarzı timing açısından yoğundur; yüksek memory-disambiguation squash / machine-clear oranlarının performance-counter ile izlenmesi onu işaretleyebilir, ama yüksek false positive ile.

Mitigation

Hiçbir microcode fix root cause'u tamamen kaldırmaz; bu, etkilenen Intel core'larında speculative store-to-load forwarding'e içkindir. Channel'ı köreltmek için fine-grained timer'ları sınırla ve timer çözünürlüğünü sandbox'la. Asıl getiri Rowhammer ve eviction-set inşası olduğundan onları harden et: ECC/TRR DRAM ve cache-partitioning downstream'de yardımcı olur. İlgili primitive'ler: ../arch/store-to-load-forwarding.md, ../arch/memory-disambiguation-prediction-abuse.md, ../arch/rowhammer.md.

References