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 Buffer — MSBDS, CVE-2018-12126 (Fallout saldırısı). Bekleyen her store için veriyi tutar.
- Line Fill Buffer — MFBDS, CVE-2018-12130 (RIDL ve ZombieLoad'un çekirdeği). L1D refill verisini tutar.
- Load Port'lar — MLPDS, CVE-2018-12127. Veriyi bir load port üzerinden core'a girerken tutar.
- Uncacheable memory — MDSUM, 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¶
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_CLEARile buffer overwrite: güncellenmiş microcode,VERWinstruction'ı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 parametresifull(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 daoffseçer. - SMT'yi devre dışı bırakmak (
nosmt), cross-thread MDS için muhafazakâr seçimdir.