Microarchitectural Data Sampling Uncacheable Memory¶
MDSUM (CVE-2019-11091): uncacheable işaretli olan ve dolayısıyla hiçbir zaman cache'lere girmeyen veriyi sızdıran MDS variant'ı — sızıntının cache hierarchy'den değil, in-flight CPU buffer'larından geldiğini kanıtlar.
Mechanism¶
Neden çalışır
Meltdown/L1TF sonrası doğal bir varsayım şuydu: veri hiçbir zaman cache'lenmezse, transient olarak sızdırılamaz. MDSUM bunu çürütür. Uncacheable (UC) tipinde bellek — MTRR'ler, PAT ya da device/MMIO bölgeleri aracılığıyla — L1/L2/L3 cache'lerini tümüyle atlar. Yine de her load, verisini hâlâ core'un dahili in-flight buffer'larından geçirir: line-fill buffer ve load port'lar. Bu buffer'lar tam olarak MDS'nin örneklediği şeydir.
Yani MDSUM yeni bir buffer değildir — MFBDS/MLPDS sızıntısının (line-fill buffer / load port) uncacheable bellekte bile tetiklendiğinin gösterimidir. Invariant: secret hiçbir zaman bir cache line'da durmaz, ama bir fill buffer ya da load port'tan geçer ve fault veren/assert eden bir load, fault retire olmadan önce o bayat buffer değerini transient olarak forward eder. MDS'nin temelde L1TF gibi cache-resident bir sızıntı değil, bir buffer-örnekleme ailesi olmasının nedeni budur.
CVE-2019-11091 olarak takip edilir, MSBDS / MFBDS / MLPDS ile birlikte Intel INTEL-SA-00233'ün parçasıdır.
Walkthrough¶
Exploitation kalıbı MDS'nin geri kalanıyla aynıdır — yalnızca secret'ın kaynağı (bir UC mapping) farklıdır:
Uncacheable bellekten bir secret örnekleme (kavramsal)
// 'uc_ptr' targets a region typed uncacheable (MTRR/PAT/MMIO);
// its bytes are never cached, but they still pass through the fill buffer.
flush(probe); // probe[256 * 4096], pre-flushed
TRANSIENT { // faulting / assisting load
uint8_t v = *uc_ptr; // stale fill-buffer / load-port byte
(void)probe[v * 4096]; // encode into cache
}
uint8_t leaked = reload_index(probe);// Flush+Reload recovers the sampled byte
Tüm MDS'te olduğu gibi değer örneklenir (adreslenmez), dolayısıyla saldırılar tekrar eder ve stream'i hizalar. Dikkat çekici sonuç basitçe şudur: cache'siz bir veri yolu, MDS'ye karşı bir savunma değildir — sızıntı buffer'ları takip eder.
Detection¶
MDSUM, MDS raporlama arayüzünü paylaşır; ayrı bir sysfs dosyası yoktur:
Bir Mitigation: Clear CPU buffers satırı MDSUM'ı da kapsar, çünkü aynı VERW
overwrite'ı, kaynak bellek tipinden bağımsız olarak fill buffer / load port'ları
temizler.
Mitigation¶
VERW/MD_CLEARbuffer overwrite: standart MDS mitigation'ı, line-fill buffer'ı ve load port'ları user space'e dönüşte ve VM entry'de temizler — uncacheable kaynak fark yaratmaz, çünkü temizlenen yapılar aynı buffer'lardır.- SMT: MFBDS/MLPDS gibi MDSUM da hyperthread'ler arasında exploit
edilebilir, dolayısıyla tam koruma buffer temizlemeye ek olarak
mds=full,nosmt(ya danosmt) gerektirir. MDS_NOenumerate eden (ve başka türlü etkilenmeyen) CPU'lar hiçbir software eylemine ihtiyaç duymaz.