ZombieLoad (fill buffer data sampling)¶
CPU'nun Line Fill Buffer'ından stale değerleri transient olarak sample eden ve onları bir Flush+Reload covert channel'ı üzerinden exfiltrate eden Meltdown-type bir MDS saldırısı; process'ler, kernel, VM'ler ve SMT sibling'ler boyunca veri sızdırır. ZombieLoad'un asıl leaf'i fill-buffer sampling/MFBDS (CVE-2018-12130); ilgili uncacheable-memory varyantı MDSUM (CVE-2019-11091) mechanism bölümünde ayrı bir MDS leaf olarak ele alınır.
Mechanism¶
Note
Line Fill Buffer (LFB), L1D cache ile memory hierarchy'nin geri kalanı arasında in flight olan veriyi (cache fill'ler, non-temporal/uncacheable erişimler vb.) tutan küçük, per-core bir yapıdır. Bir SMT core'unun her iki logical thread'i tarafından paylaşılır. Bir load fault verdiğinde ya da bir microcode assist'e ihtiyaç duyduğunda (örn. uncacheable memory'ye dokunur, bir page boundary'sini geçer ya da bir assist koşuluna çarpar), core, fault architectural olarak yükseltilip pipeline squash edilmeden önce LFB'de zaten duran bir stale değeri bağımlı micro-op'lara transient olarak forward edebilir. O forward edilen değer, buffer'ı en son ne kullandıysa ona aittir — muhtemelen başka bir process, kernel, co-resident bir VM ya da sibling hyperthread.
Meltdown'dan farklı olarak ZombieLoad seçilmiş bir adresi okumaz: in flight olan ne varsa onu sample eder. Attacker victim adresini doğrudan seçemez; bunun yerine leak'i bir loop'ta çalıştırır ve yakalanan stream'i secret-görünümlü byte'lar için filtreler (domain-aware reconstruction). Değer yalnızca kısa transient window sırasında mevcut olduğundan, squash'tan sağ çıkan bir microarchitectural state'e encode edilmelidir — kanonik seçim bir cache-line index'idir, sonradan Flush+Reload ile recover edilir.
ZombieLoad, Microarchitectural Data Sampling (MDS) ailesinin bir üyesidir: MFBDS/LFB sampling (bu teknik), artı MLPDS load-port sampling ve MSBDS store-buffer sampling. Fill-buffer sampling'e atanan CVE CVE-2018-12130'dur ve uncacheable-memory varyantı (MDSUM) CVE-2019-11091'dir.
Bu not vs. kardeşleri
ZombieLoad, fill-buffer örneklemesini suistimal eden adı konmuş saldırıdır
(RIDL ile aynı leaf'i paylaşır); altında yatan microarchitectural leaf'in soğuk
tanımı için bkz. MFBDS. Bu not
domain-aware reconstruction, uçtan uca primitive ve zombieload-v2 (TAA) hattını
kapsar. Store buffer'ı hedef alan ayrı leaf
MSBDS ZombieLoad'un kapsamı
dışındadır.
Walkthrough¶
Warning
Yalnızca yetkili araştırma için. Aşağıdaki sequence, orijinal disclosure ile yayımlanan kamuya açık, patch'lenmiş primitive'dir; gösterim amaçlıdır, silahlandırılmış uçtan uca bir exploit değildir.
Leak, faulting bir load etrafında bir transmit/receive çiftidir. 256 girdilik bir
Flush+Reload dizisi (oracle, olası her byte değeri için bir cache line) alıcıdır:
// Receiver array: 256 cache lines, one per leaked byte value
uint8_t oracle[256 * 4096];
// Transmit gadget: a faulting/assisting load forwards a stale LFB byte,
// which indexes the oracle inside the transient window.
void leak(void *faulting_ptr) {
asm volatile(
"movzbl (%0), %%eax\n" // faulting load: forwards STALE LFB byte
"shl $12, %%eax\n" // value * 4096 -> distinct cache line
"movzbl oracle(%%eax), %%eax\n" // encode byte into cache state
:: "r"(faulting_ptr) : "rax");
}
Fault suppress edilir ya da ucuz hale getirilir (TSX transaction, signal handler ya da speculative wrapping). Squash'tan sonra alıcı her line'ı timing'ler:
for (int v = 0; v < 256; v++) {
unsigned t = time_load(&oracle[v * 4096]); // rdtscp + flush
if (t < CACHE_HIT_THRESHOLD) // ~ <150 cycles
recovered = v; // this byte was in flight
}
Beklenen davranış
Hyperthreading enabled olan vulnerable 2019-öncesi bir Intel core'da, gadget'ı
sıkı bir loop'ta çalıştırmak, attacker'ın asla yazmadığı gürültülü bir byte
stream'i üretir — kernel ya da SMT sibling tarafından işlenen veri parçaları.
Domain-aware filtering ile orijinal çalışma, ziyaret edilen URL'ler, AES key'ler
ve /etc/shadow hash'leri gibi canlı veriyi recover etti. Tamamen mitigate
edilmiş bir core'da (microcode MD_CLEAR artı context switch'te VERW, SMT ele
alınmış) oracle, tutarlı sızmış değer olmadan noise olarak okunur.
Detection¶
Primitive, victim'e görünür bir architectural fault yükseltmez ve log izi
bırakmaz; load squash edilir. Gerçekçi sinyaller çevreseldir: bir core'a pinlenmiş,
bir Flush+Reload timing loop'uyla (çok sayıda clflush + rdtscp çifti) yüksek
hızda faulting/assisting load'lar yürüten bir process ve MD_CLEAR mitigation'ının
aktif olup olmadığının microcode/OS attestation'ı.
Mitigation¶
- Microcode +
VERW/MD_CLEAR: güncellenmiş microcode,VERWinstruction'ını LFB, store buffer ve load port'ların üzerine yazacak şekilde yeniden amaçlandırır; OS her privilege transition / context switch'teVERWgönderir. Bkz. MDS buffer clear (VERW). - SMT/hyperthreading'i disable et: LFB sibling'ler arasında shared'dır, dolayısıyla cross-thread sızıntı SMT gerektirir; buffer-clear tek başına eşzamanlı çalışan sibling'i kapsamaz.
- Karşılıklı güvenmeyen thread'lerin asla bir physical core'u paylaşmaması için group-scheduling / core scheduling.