Skip to content

Microarchitectural Fill Buffer Data Sampling

MFBDS (CVE-2018-12130): RIDL ve ZombieLoad'un çekirdeğindeki Line Fill Buffer (LFB) sızıntısı — fault veren/assert eden bir load, fill buffer'dan geçen bayat veriyi transient olarak forward eder.

Mechanism

Line Fill Buffer (LFB), L1 data cache ile memory hierarchy'nin geri kalanı arasında memory verisini in flight tutan küçük yapıdır: bekleyen L1D miss'leri, refill'leri ve non-temporal/uncacheable aktarımları takip eder. MFBDS, bu buffer'ı örnekleyen MDS leaf'idir. Bir load fault verdiğinde ya da bir microcode assist'e ihtiyaç duyduğunda, etkilenen Intel core'ları, architectural fault retire olmadan önce bir LFB entry'sinde o an duran herhangi bir bayat değeri bağımlı instruction'lara transient olarak forward edebilir.

Bu not vs. kardeşleri

Bu not, MFBDS leaf'inin kendisini (CVE-2018-12130, LFB'yi örnekleyen microarchitectural bug) tarif eder. Bu leaf'i suistimal eden adı konmuş saldırı ZombieLoad'dur (RIDL ile birlikte); ZombieLoad notu, domain-aware reconstruction ve uçtan uca primitive'i kapsar. Farklı bir buffer'ı (store buffer) örnekleyen ve attacker'a kısmî hedef kontrolü veren kardeş leaf için bkz. MSBDS.

Neden çalışır

Saldırgan adresi seçmez — MFBDS, LFB'nin tuttuğu her ne ise onu örnekler. LFB pipeline boyunca (ve SMT sibling'leri arasında) paylaşıldığı için sızdırılan byte'lar başka bir hyperthread'e, kernel'e, başka bir VM'ye ya da bir SGX enclave'ine ait olabilir. RIDL ("Rogue In-Flight Data Load", VU Amsterdam) ve ZombieLoad'u (TU Graz) bu kadar güçlü yapan tam da bu buffer'dır: tekrarlanıp hizalanan tek bir fault veren load, L1D refill'lerinden akan key'ler ya da string'ler gibi secret'ları — bellekte nerede yaşadıklarını hiç bilmeden — yeniden inşa edebilir.

Walkthrough

Leak/transmit/decode kalıbı diğer transient saldırılarla aynıdır: fault veren bir load LFB'yi örnekler ve değer bir Flush+Reload cache covert channel üzerinden exfiltrate edilir.

  1. Bir transient window aç. Fault veren (örneğin non-present ya da supervisor bir page) ya da bir microcode assist tetikleyen bir load issue et; fault, speculation tarafından yeterince uzun süre bastırılır.
  2. LFB'yi örnekle. Window boyunca core, gerçek (fault veren) değer yerine bir fill-buffer entry'sinden bayat in-flight bir byte forward eder.
  3. Encode et. Örneklenen byte'ı, flush'lanmış bir probe array'i indekslemek için kullan ve bir line'ı cache'le.
  4. Decode et. Window çöktükten sonra her probe line'ını rdtscp ile zamanla; hızlı line örneklenen byte'ı ele verir.
  5. Tekrarla & hizala. Değer örneklendiği için gerçek saldırılar defalarca loop eder ve stream'i filtreler (ZombieLoad, fill buffer boyunca akan string'leri SMT sibling'i, user/kernel sınırı, VM'ler ve SGX'in dışına geçecek şekilde yeniden inşa eder).
Transient fill-buffer sampling iskeleti (kavramsal)
// probe[256 * 4096] flushed beforehand
flush(probe);
TRANSIENT {                          // faulting / assisting load
    uint8_t v = *faulting_ptr;       // forwards a STALE LFB byte, not *faulting_ptr
    (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 vulnerable

MFBDS'nin özel bir sysfs dosyası yoktur — paylaşılan mds node'u altında (ve TSX yolu için tsx_async_abort altında) raporlanır. Değerler arasında Not affected, Vulnerable, Vulnerable: Clear CPU buffers attempted, no microcode ya da bir SMT son ekiyle Mitigation: Clear CPU buffers bulunur.

Mitigation

  • VERW / MD_CLEAR ile buffer overwrite: güncellenmiş microcode, VERW instruction'ını etkilenen CPU buffer'larını (LFB dahil) overwrite edecek şekilde yeniden amaçlandırır. Kernel bunu user space'e dönüşte ve VM entry'de çalıştırır, böylece hiçbir bayat fill-buffer secret'ı bir trust boundary boyunca hayatta kalmaz.
  • SMT değerlendirmeleri: MSBDS'nin aksine MFBDS hyperthread'ler arasında exploit edilebilir — LFB, SMT sibling'leri tarafından paylaşılır, dolayısıyla yalnızca buffer temizleme, her iki thread çalışırken cross-thread window'unu kapatmaz. mds=full,nosmt (ya da BIOS'ta SMT'yi devre dışı bırakmak), yüksek güvence gerektiren host'lar için muhafazakâr seçimdir.
  • MD_CLEAR bit'i olmayan microcode, VERW'ü buffer temizleme açısından bir no-op yapar; kernel o zaman "no microcode" durumunu raporlar.

References