Skip to content

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ı bir rep 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
Bir case study'de yazarlar, bir RSA signing operasyonunun base64 decoding aşamasında sızan tam RSA key'lerini, leakage template'leri artı lattice tabanlı cryptanalysis kullanarak geri kazanır.

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_CLEAR microcode). Intel'in microcode'u, privilege-level geçişlerinde store buffer'ı, fill buffer'ı ve load port'larını temizlemek için VERW'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.

References