Skip to content

Microarchitectural Store Buffer Data Sampling

MSBDS / Fallout (CVE-2018-12126): yakın zamanda yazılmış store-buffer verisini store-to-load forwarding aracılığıyla sızdırır — saldırgana hangi byte'ların sızdığını kısmen seçtiren tek MDS leaf'i.

Mechanism

Store buffer, bekleyen her store'un adresini ve verisini, cache'e commit edilene kadar tutar. Program order'ı korumak için core, bekleyen bir store ile örtüşen daha genç bir load'un, cache'e gitmek yerine store'un verisini forward etmesine izin verir (store-to-load forwarding). MSBDS — Fallout saldırısı (VUSec / KU Leuven vd.) — bunu suistimal eder: fault veren ya da assist eden bir load bir store-buffer entry'siyle eşleşiyor gibi göründüğünde, core bayat store-buffer byte'larını transient olarak forward edebilir ve yakın zamanda retire olmuş bir store'dan veriyi açığa çıkarabilir.

Neden çalışır

Forwarding bir kısmi adres (düşük bit'ler) üzerinden eşleştirilir, dolayısıyla bir load'a, ona aslında karşılık gelmeyen bir store-buffer entry'si servis edilebilir. MSBDS'yi özel yapan şey bu kısmi eşleşmedir: saldırgan, load'un adres bit'lerini bir kurbanın store'una hizalayarak, tamamen rastgele sampling yerine hangi entry'nin sızdığı üzerinde bir miktar kontrol uygular — "store-to-leak forwarding". Fallout bunu, kernel write'larını sızdırmak ve kernel'in yakın zamanda nereye store ettiğini gözlemleyerek KASLR'ı yenmek için kullandı. Fallout ayrıca, izin/adres kontrolü çözülmeden önce stale veriyi ileten bir Write Transient Forwarding (WTF) etkisi gösterdi; bu da KASLR kırmada kullanışlıdır.

Bu not vs. kardeşleri

MSBDS ayrı bir leaf'tir (CVE-2018-12126) ve store buffer'ı örnekler — Line Fill Buffer'ı örnekleyen MFBDS (CVE-2018-12130) ve onu suistimal eden ZombieLoad saldırısından farklıdır. İki ayırt edici özellik: MSBDS kısmî adres eşleşmesi nedeniyle attacker'a hangi entry'nin sızdığı üzerinde bir miktar kontrol verir ve store buffer thread başına partition'landığı için SMT sibling'leri arası exploit edilemez — fill-buffer örneklemesi her iki yönden de tersine çalışır.

Walkthrough

MDS'nin geri kalanıyla aynı leak/transmit/decode iskeleti, ama örneklenen kaynak store-to-load forwarding aracılığıyla ulaşılan store buffer'dır; exfiltration Flush+Reload iledir.

  1. Store buffer'ı prime et — kurbanın (ya da syscall gibi geçişlerin) bekleyen store'larda secret veri bırakmasını sağla.
  2. Düşük adres bit'leri hedef store entry'siyle eşleşen, fault veren/assert eden bir load ile bir transient window aç.
  3. Örnekle. Core, bayat store-buffer byte'larını transient olarak forward eder.
  4. Byte'ı flush'lanmış bir probe array'e encode et.
  5. Probe line'larını zamanlayarak decode et; gürültüyü yenmek için tekrarla.
Transient store-buffer sampling iskeleti (kavramsal)
// probe[256 * 4096] flushed beforehand
flush(probe);
TRANSIENT {                          // faulting load, low bits matched to a store
    uint8_t v = *faulting_ptr;       // store-to-load forward of a STALE store byte
    (void)probe[v * 4096];           // encode into cache
}
// decode: time each probe[i*4096]; the fast line reveals the sampled byte
uint8_t leaked = reload_index(probe);

Detection

$ cat /sys/devices/system/cpu/vulnerabilities/mds
Mitigation: Clear CPU buffers; SMT mitigated

MSBDS, paylaşılan mds sysfs node'u altında raporlanır. Değerler: Not affected, Vulnerable, Vulnerable: Clear CPU buffers attempted, no microcode ya da bir SMT son ekiyle Mitigation: Clear CPU buffers.

Güvenilir bir runtime signature yok; alert'lere değil duruşa güvenin

  • HPC / PMU anomalileri — tek bir thread'den gelen çok yüksek oranlarda machine_clears, faulting load veya cache-miss olayları MDS tarzı probing'e işaret edebilir, ama gürültülüdür ve kolayca atlatılır.
  • Microcode / mitigation telemetrisiMD_CLEAR capability'sinin CPUID'de mevcut olduğunu ve VERW buffer-clearing'in gerçekten uygulandığını (mds node'unun "Mitigation: Clear CPU buffers" raporlaması) doğrulayın.
  • Config drift — devre dışı olması gereken host'larda SMT yeniden etkinleştirilirse ya da bir kernel mds=off ile boot ederse alert verin.

Mitigation

  • VERW / MD_CLEAR ile buffer overwrite: güncellenmiş microcode, VERW'ün etkilenen CPU buffer'larını (store buffer dahil) overwrite etmesini sağlar; kernel bunu user space'e dönüşte ve VM entry'de çalıştırır.
  • SMT değerlendirmeleri: MSBDS, hyperthread'ler arasında exploit edilebilir olmayan tek MDS variant'ıdır — store buffer, thread başına statik olarak partition'lanmıştır. Dolayısıyla MFBDS/MLPDS'nin aksine, VERW tabanlı buffer temizleme MSBDS'yi SMT'nin devre dışı bırakılmasını gerektirmeden kapatır (microcode mevcut olduğunda mds node'unun SMT vulnerable yerine SMT mitigated okuyabilmesinin nedeni budur).
  • MD_CLEAR'dan yoksun microcode, VERW'ü etkisiz bırakır (kernel "no microcode" durumunu raporlar).

References