Microarchitectural Load Port Data Sampling¶
MLPDS (CVE-2018-12127): CPU'nun load port'larından core'a girerken geçen bayat veriyi sızdırır — fill buffer ya da store buffer yerine load-port yolunu örnekleyen MDS leaf'i.
Mechanism¶
Çalışan her load, bir load port'a dispatch edilir; bu, verinin memory subsystem'den (cache, fill buffer ya da store-forwarding) core'a girdiği pipeline arayüzüdür. MLPDS, bu yolu örnekleyen MDS leaf'idir: load port'larından (ilişkili buffer'ları ve sub-cache-line / split-load handling'i dahil) geçirilen veri, architectural fault retire olmadan önce fault veren ya da assert eden bir load'a transient olarak forward edilebilir.
Neden çalışır
Kardeşleri gibi MLPDS de bir sampling sızıntısıdır: saldırgan, seçilmiş bir adresi değil, bir load port'tan o an geçen her ne değer ise onu okur. Sızıntı en kolay, hardware'in özel olarak ele aldığı load'larda yüzeye çıkar — split ya da hizalanmamış load'lar ve belirli genişliklerdeki load'lar — burada bayat, port'ta staging edilmiş byte'lar speculative window'a sağ çıkar. Bu, MFBDS/MSBDS ile aynı transient-forward primitive'idir, yalnızca load yolundaki farklı bir dahili yapıya bağlanmıştır.
Walkthrough¶
Leak/transmit/decode loop'u standart MDS kalıbıdır: fault veren bir load load-port yolunu örnekler ve byte bir Flush+Reload covert channel üzerinden exfiltrate edilir.
- Fault veren ya da assist eden bir load ile bir transient window aç.
- Load port'unu örnekle. Core, (fault veren) architectural değer yerine load port üzerinden staging edilmiş bayat bir byte'ı transient olarak forward eder.
- Byte'ı flush'lanmış bir probe array'e encode et.
- Her probe line'ını zamanlayarak decode et; hızlı line örneklenen byte'tır.
- Tekrarla & filtrele — sampling gürültülüdür, dolayısıyla saldırılar loop eder ve recover edilen stream'i hizalar.
Transient load-port sampling iskeleti (kavramsal)
// probe[256 * 4096] flushed beforehand
flush(probe);
TRANSIENT { // faulting / assisting (often split) load
uint8_t v = *faulting_ptr; // forwards a STALE load-port 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¶
MLPDS, mds sysfs node'unu diğer leaf'lerle paylaşır (özel dosya yok). Değerler: Not affected, Vulnerable, Vulnerable: Clear CPU buffers attempted, no microcode ya da bir SMT son ekiyle Mitigation: Clear CPU buffers.
Mitigation¶
VERW/MD_CLEARile buffer overwrite: güncellenmiş microcode,VERW'ün etkilenen CPU buffer'larını overwrite etmesini sağlar; kernel bunu user space'e dönüşte ve VM entry'de çalıştırır, böylece hiçbir bayat load-port byte'ı bir trust boundary'yi geçmez.- SMT değerlendirmeleri: MFBDS gibi (ve MSBDS'nin aksine), MLPDS hyperthread'ler arasında saldırılabilir, dolayısıyla yalnızca
VERW, her iki thread çalışırken sibling-thread window'unu kapatmaz — tam koruma içinmds=full,nosmtya da SMT'yi devre dışı bırakmak gerekir. MD_CLEAR'dan yoksun microcode,VERW'ü etkisiz bırakır (kernel "no microcode" durumunu raporlar).