Skip to content

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:

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

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_CLEAR buffer 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 da nosmt) gerektirir.
  • MDS_NO enumerate eden (ve başka türlü etkilenmeyen) CPU'lar hiçbir software eylemine ihtiyaç duymaz.

References