Medusa¶
Transynther fuzzer tarafından sentezlenen bir MDS/ZombieLoad alt-varyantı; implicit write-combining (WC) memory operasyonlarından (örneğin
rep mov,rep stos, AVX2) Intel line-fill buffer'dan geçerken data sızdırır.
Mechanism¶
Neden çalışır
Medusa, Microarchitectural Data Sampling'in (MDS) yönlendirilmiş bir alt kümesidir. ZombieLoad ve RIDL gibi, abort edilmiş (faulting ya da microcode-assisted) bir load'un — architectural fault retire olup transient instruction'ları squash etmeden önce — "ilk fetch edilebilen herhangi bir data'yı basitçe tüketip dependent operation'lara sağlaması" gerçeğini suistimal eder.
Ayırt edici invariant, sızdırılan byte'ların kaynağıdır. Aynı cache line'a
yapılan birden fazla store'u tek bir bus request'inde birleştirmek için CPU
write combining (WC) kullanır; bu Intel'de "fill buffer'ın parçasıdır"
(disclosure sırasında Intel tarafından doğrulanmıştır). Bazı instruction'lar
WC'yi page memory type'tan bağımsız olarak implicit biçimde kullanır — özellikle
fast-string operasyonları rep mov / rep stos ve geniş AVX2 load'ları. Bu
transfer'ler, sıradan 8-byte load'ların ve 128-bit AVX load'larının asla
dokunmadığı 32-byte common data bus'ın üst yarısını kullanır.
Medusa, faulting bir load ile bir transient window açar ve fill buffer'ın WC
kısmında ne varsa onu forward eder, ardından onu bir
Flush+Reload covert channel üzerinden encode eder. (ZombieLoad/RIDL'ın
yaptığı gibi) keyfi fill-buffer içeriği yerine "özellikle WC kaynaklı data
transfer'lerini hedeflediği" için, Medusa attacker'a savunmasız victim'leri
tam olarak belirleme imkânı verir — örneğin rep mov'a derlenen bir kernel
copy_to_user / memcpy.
Paper üç varyant tanımlar (hepsi, Meltdown yapı taşlarını mutasyona uğratan ve leakage'ı performance counter'larla sınıflandıran Transynther fuzzing aracı tarafından bulunmuştur):
- Variant I — Cache Indexing. Tek bir cache line içinde bir faulting load; cache-line offset'i hangi WC byte'larının sızdığını seçer. En yüksek leakage, offset 16–31 için (common data bus'ın üst yarısı, yalnızca AVX2/WC tarafından kullanılır).
- Variant II — Unaligned Store-to-Load Forwarding. Faulting/assisting bir load'da unaligned bir store-to-load-forwarding koşulu; WC-buffer byte'larını sızdırır ve (MSBDS/Fallout'ın aksine) hyperthread'ler arasında çalışır.
- Variant III — Shadow REP MOV. Faulting bir (örneğin non-canonical) adrese
dummy bir byte'ın
rep mov'u, ardından stale ya da eşzamanlı birrep mov'dan data sızdıran bir dependent load; tamamen address-agnostic.
Walkthrough¶
Medusa, WC-buffer byte'larını tekrar tekrar bir Flush+Reload oracle'ına forward
eder. Sender (victim), 128 bit'ten geniş data'yı rep mov/rep stos/AVX2 ile
taşımalıdır.
// Conceptual Medusa Variant I encode/decode (transient; needs vulnerable Intel CPU).
// Real PoC + Transynther: https://github.com/vernamlab/Medusa
flush(probe); // clear covert-channel array (256 lines)
if (xbegin() == _XBEGIN_STARTED) { // TSX (or signal handler) for fault suppression
char v = *fault_addr_in_line; // faulting load INSIDE one cache line;
// offset 16..31 indexes the WC half of the bus
(void)probe[v * 4096]; // encode leaked WC byte into cache state
xend();
}
// decode: time each probe[i*4096]; the fast line index == leaked byte
Raporlanan leakage oranları (collude eden victim, paper'dan)
Tested CPUs: i7-7700 (Kaby Lake), i7-8650U (Kaby Lake R), i9-9900K (Coffee Lake)
Variant I (Cache Indexing): ~0.19 kB/s, FP rate 47.7%
Variant II (Unaligned STLF): ~36.23 kB/s, FP rate 0.559%
Variant III (Shadow REP MOV): ~0.13 kB/s, FP rate 3.91%
Cross-VM covert channel (Variant III): ~14.3 B/s, error-free
Warning
Birkaç Medusa proof-of-concept'i, fault suppression için TSX Asynchronous Abort'a
(TAA, CVE-2019-11135) dayanır. Medusa yalnızca 128 bit'ten geniş data sızdırır,
bu yüzden tam olarak tek bir victim türünü (rep mov/rep stos/AVX2) hedefler
— kesinlik için bir avantaj, genellik için bir sınırlama.
Detection¶
Medusa, diğer MDS saldırıları gibi, victim'in gözlemleyebileceği çok az iz bırakır. Host tarafındaki sezgisel yöntemler ZombieLoad ile örtüşür: yüksek TSX-abort oranlarıyla birlikte sıkı Flush+Reload timing loop'ları ve microcode-assist / fault-suppression gadget'larının anormal kullanımı.
Mitigation¶
Paper'a göre Medusa, ZombieLoad'ın bir varyantıdır, bu yüzden aynı karşı önlemler geçerlidir:
- Buffer overwrite (
VERW/MD_CLEARmicrocode). Intel'in microcode'u, privilege-level geçişlerinde store buffer'ı, fill buffer'ı ve load port'larını temizlemek içinVERW'i retrofit eder. Yazarlar, bunun tek başına tüm ZombieLoad/Medusa varyantlarını durdurmadığını belirtir — L1 data cache de flush'lanmalıdır. - SMT'yi (hyperthreading) devre dışı bırak. Medusa "hyperthreading etkinse engellenemez"; cross-hyperthread leak'i tam olarak yalnızca SMT'yi devre dışı bırakmak bloklar (OS group scheduling yoksa).
- TSX'i devre dışı bırak (örneğin
MSR_TSX_FORCE_ABORT) ki MDS'e dirençli CPU'lar TSX-assist güdümlü fault suppression kullanamasın.