Skip to content

Microarchitectural Data Sampling

MDS şemsiyesi (RIDL / Fallout / ZombieLoad): cache'lerden değil, dahili CPU buffer'larından — store buffer, line-fill buffer ve load port'lar — bayat, in-flight veriyi örnekleyen Intel transient-execution saldırıları ailesi.

Mechanism

Neden çalışır

Klasik Meltdown/L1TF, L1 cache'te yerleşik veriyi sızdırır. MDS ise cache'in altındaki bir katmandan sızdırır: pipeline boyunca veriyi in flight tutan küçük dahili buffer'lar. Bir load fault verdiğinde ya da bir microcode assist'e ihtiyaç duyduğunda, etkilenen Intel core'ları, fault retire olmadan önce bu buffer'lardan birinde o an duran herhangi bir bayat değeri transient olarak bağımlı instruction'lara forward edebilir. Saldırgan adresi seçmez — buffer'ın tuttuğu her ne ise onu örnekler, sonra secret'ları yeniden inşa etmek için tekrarlar.

Üç buffer, aileye leaf variant'larını verir (her biri kendi notuyla):

  • Store BufferMSBDS, CVE-2018-12126 (Fallout saldırısı). Bekleyen her store için veriyi tutar.
  • Line Fill BufferMFBDS, CVE-2018-12130 (RIDL ve ZombieLoad'un çekirdeği). L1D refill verisini tutar.
  • Load Port'larMLPDS, CVE-2018-12127. Veriyi bir load port üzerinden core'a girerken tutar.
  • Uncacheable memoryMDSUM, CVE-2019-11091: aynı buffer'lar, uncacheable işaretli ve hiçbir zaman cache'lere girmeyen veriyi bile sızdırır — bkz. o not.

Leak/transmit/decode kalıbı diğer transient saldırılarla aynıdır: transient olarak bir buffer byte'ı oku, onu bir probe array'i indekslemek için kullan, sonra Flush+Reload ile decode et. RIDL (VU Amsterdam, "Rogue In-Flight Data Load") ve ZombieLoad (TU Graz) herkese açık saldırı adlarıdır; Intel kümeyi INTEL-SA-00233 olarak takip eder.

Walkthrough

Yapı RIDL/ZombieLoad'u yansıtır: fault veren/assert eden bir load bir buffer'ı örnekler ve değer bir cache covert channel üzerinden exfiltrate edilir.

Transient buffer-sampling iskeleti (kavramsal)
// probe[256 * 4096] flushed beforehand
flush(probe);
TRANSIENT {                          // faulting / assisting load
    uint8_t v = *faulting_ptr;       // forwards a STALE in-flight buffer 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);

Değer örneklendiği için (adreslenmediği için), gerçek saldırılar defalarca tekrar eder ve stream'i filtreler/hizalar — örneğin ZombieLoad, fill buffer boyunca akan string'leri SMT sibling'i, user/kernel sınırı, VM'ler ve SGX enclave'lerinin dışına geçecek şekilde yeniden inşa eder.

Detection

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

Değerler arasında Not affected, Vulnerable, Vulnerable: Clear CPU buffers attempted, no microcode ya da SMT durumu eklenmiş Mitigation: Clear CPU buffers bulunur. "no microcode" durumu, kernel'in VERW issue ettiğini ama CPU'nun buffer'ları gerçekten overwrite etmesini sağlayan MD_CLEAR semantiğinden yoksun olduğunu gösterir.

Mitigation

  • VERW / MD_CLEAR ile buffer overwrite: güncellenmiş microcode, VERW instruction'ını etkilenen CPU buffer'larını temizleyecek ş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 secret bir trust boundary boyunca hayatta kalmaz.
  • SMT değerlendirmeleri: MSBDS hariç tüm MDS variant'ları hyperthread'ler arasında exploit edilebilir, dolayısıyla yalnızca buffer temizleme, her iki thread çalışırken sibling-thread window'unu kapatmaz. mds= kernel parametresi full (varsayılan: buffer'ları temizle, otomatik SMT değişikliği yok), full,nosmt (tam koruma için SMT'yi de devre dışı bırak) ya da off seçer.
  • SMT'yi devre dışı bırakmak (nosmt), cross-thread MDS için muhafazakâr seçimdir.

References