Skip to content

Zenbleed

AMD Zen 2'de vector register file'ının speculative use-after-free'i; mispredict edilmiş bir vzeroupper üzerinden ~30 KB/s cross-context veri sızdırır (CVE-2023-20593).

Mechanism

Note

Zen 2, YMM/ZMM upper half'larını bir "z-bit" optimizasyonuyla izler: bir vector register'ın upper bit'lerinin sıfır olduğu bilindiğinde, core physical register-file depolaması allocate edip yazmak yerine bir flag set eder. vzeroupper, o upper bit'leri sıfırlayan instruction'dır, dolayısıyla ilgili z-bit'leri çevirir ve arkadaki physical register'ları free eder.

Bug, mispredict edilmiş bir vzeroupper'dan yanlış recovery'dir. vzeroupper yanlış bir branch path'inde speculative olarak yürütülüp sonra geri alınırsa, core gerçekleştirdiği register-file muhasebesini geri almakta başarısız olur. "Free ettiği" physical register'lar architectural state tarafından hâlâ referans edilir — register file slot'larının bir microarchitectural use-after-free'i. Recover edilen register, o physical slot'ta artık ne değer yaşıyorsa onu okur ki bu, aynı physical core'u paylaşan başka bir thread, process, VM ya da hyperthread tarafından yazılmış veri olabilir, çünkü vector register file shared bir kaynaktır.

Leak, standart architectural register read olduğundan (decode edilmesi gereken transient bir covert channel değil), Flush+Reload adımı yoktur: çalınan byte'lar doğrudan bir YMM register'ında belirir. SMT'yi disable etmek deliği kapatmaz, çünkü stale veri aynı logical thread'deki daha önceki execution context'lerinden de gelebilir.

Walkthrough

Warning

Yalnızca sahip olduğun/test etmeye yetkili olduğun hardware'de çalıştır. Bu, defensive anlayış için kamuya açık, patch'lenmiş kusuru belgeler.

Disclose edilen trigger, core'u bir vzeroupper'ın ötesine speculate edip mis-recover yapmaya zorlar. Araştırmacının yayımladığı kavramsal instruction sequence'i şudur:

; precondition: set up a register-rename / merge dependency
vcvtsi2sd  xmm0, xmm0, rax      ; activates the merge optimization path
vmovdqa    ymm0, ymm1           ; forces a register rename of the ymm register
jcc        overzero             ; conditional branch the core mispredicts
vzeroupper                      ; speculatively executed, then rolled back
overzero:
; on mis-recovery, ymm0's upper half now aliases a stale physical register

Tek bir trigger'ı sürekli bir leak'e çevirmek için, gadget sıkı bir loop'ta çalıştırılır ve recover edilen YMM lane'leri secret-görünümlü byte'lar için taranır:

// pseudo-loop (illustrative)
for (;;) {
    trigger_zenbleed();        // the asm sequence above
    read_ymm_register(buf);    // upper lanes contain leaked physical-RF data
    scan_for_secrets(buf);     // e.g. observe key/login material in flight
}
Beklenen davranış

Loop'u patch'lenmemiş bir Zen 2 parçasında çalıştırmak, attacker'ın asla yazmadığı bir veri stream'i verir — aynı physical core'daki eşzamanlı ya da yakın zamanlı workload'lara ait byte'lar. Orijinal disclosure kabaca core başına saniyede 30 KB throughput ölçtü; register'lardan geçerken (örn. bir login sırasında) password'ları ve kriptografik key'leri recover etmeye yetecek kadar. Patch'lenmiş bir core'da (microcode ya da DE_CFG[9] chicken bit set edilmiş) upper lane'ler deterministic sıfırlar olarak okunur.

Detection

Primitive çoğunlukla sessizdir (fault yok, cache decode loop'u yok), dolayısıyla doğrudan detection zordur. Gerçekçi sinyaller çevreseldir: bir core'u pinleyip olağandışı yüksek hızda vzeroupper/AVX rename sequence'leri yürüten workload'lar ve AMD fix'inin mevcut olup olmadığını gösteren firmware/microcode attestation'ı.

Mitigation

  • AMD microcode güncellemeleri mis-recovery'yi düzeltir.
  • Microcode öncesi/olmadan software workaround'u: her core'da DE_CFG[9] chicken bit'ini (MSR 0xC0011029) set et, bu hatalı optimizasyonu disable eder.
  • SMT'yi disable etmek yetersizdir. Leak, non-SMT context'leri boyunca devam eder.

References