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 (MSR0xC0011029) set et, bu hatalı optimizasyonu disable eder. - SMT'yi disable etmek yetersizdir. Leak, non-SMT context'leri boyunca devam eder.