CacheWarp (CVE-2023-20592)¶
Kötü niyetli bir hypervisor'ın
INVDinstruction'ını suistimal ederek bir guest'in dirty cache line'larını dropladığı, SEV-ES/SEV-SNP VM belleğini architectural olarak stale bir state'e geri döndüren software tabanlı bir fault-injection attack.
Mechanism¶
Dirty cache line'ları droplamak guest belleğini neden geri döndürür
AMD SEV-ES ve SEV-SNP, kötü niyetli bir hypervisor'ın plaintext'i okuyamaması
ya da yazamaması için guest VM belleğini encrypt eder ve integrity-protect
eder. CacheWarp, DRAM'e doğrudan hiç dokunmayarak integrity'yi atlatır: cache'i
modify edilmiş ("dirty") line'ları belleğe geri yazmadan invalidate eden
INVD instruction'ının uygunsuz davranışını exploit eder. Bir guest bir
store yaptığında, yeni değer bir dirty cache line'da yaşar ve henüz DRAM'e
ulaşmamıştır. Hypervisor o line'ı INVD ile invalidate ederse, yazma sessizce
atılır ve o adresin sonraki read'i DRAM'den eski (stale) değeri görür.
Architectural olarak bu, store'un hiç gerçekleşmemiş gibi görünür — single-store
granülerliğinde seçici bir state reset — oysa SEV'in encryption/integrity
mekanizmasına dokunulmamıştır. AMD bunu, INVD instruction'ının "CPU'nun cache
line write-back davranışını etkileyebileceği ve bunun guest virtual machine
memory integrity'sinin potansiyel kaybına yol açacağı" şeklinde tarif eder. Bu
bir hardware bug'dır, transient-execution side channel'ı değil. (KB'de bu note,
bir transient-execution leak'i olduğu için değil, aynı microarchitectural
fault-injection / state-reset ailesine ait olduğu için sidechannel/ altında
sınıflandırılır.)
Walkthrough¶
Makale, bug'ı iki adlandırılmış primitive'e dönüştürür:
- DropForge — seçilmiş, modify edilmiş bir cache line'ı seçici olarak drop eder; bir store'u stale değerine geri döndürür (attacker tarafından kontrol edilen bir write rollback).
- TimeWarp — stack üzerindeki return address'leri geri döndürür; bir victim'in control flow'unu daha erken/eski bir devama yönlendirir.
Etkilenen CPU'larda hypervisor önce AMD HWCR MSR'sindeki (0xc0010015) ilgili
bit'i temizleyerek INVD'yi etkinleştirir:
# From the CacheWarp PoC: enable INVD via MSR 0xC0010015
sudo bash -c 'modprobe msr; \
CUR=$(rdmsr 0xc0010015); \
ENABLED=$(printf "%x" $((0x$CUR & ~16))); \
wrmsr -a 0xc0010015 0x$ENABLED'
INVD kullanılabilir olunca, kötü niyetli hypervisor guest'i single-step eder ya
da intercept eder, sonra güvenlikle ilgili bir store dirty iken cache'i invalidate
eder:
Uçtan uca gösterilen attack'lar
- OpenSSH authentication bypass (TimeWarp): return address'i geri döndür, böylece authentication rutini zaten authenticate edilmiş bir path'e döner ve attacker'ı geçerli credential olmadan login eder.
sudoprivilege escalation (DropForge): authentication sonucunu tutan değişkeni geri döndür, böylece başarısız bir check bir "success" state'ine geri alınır ve guest içinde root elde edilir.- RSA-CRT key recovery: modular exponentiation sırasında "blind" cache-line droplama, private key'in geri kazanıldığı hatalı bir signature indükler — single-stepping olmadan.
Bozulan özellik confidentiality değil, integrity'dir
CacheWarp guest secret'larını doğrudan okumaz; seçilmiş yazmaları silerek memory integrity'yi bozar. Tehlike şu ki confidential-computing guest'leri hypervisor'ın kendi state'lerini değiştiremeyeceğini varsayar — CacheWarp bu varsayımı ihlal eder ve VM içinde RCE / privilege escalation'a dönüşür.
Mitigation¶
- Etkilenen: SEV-ES/SEV-SNP'li AMD EPYC 1.–3. nesil (Zen 1–Zen 3).
- 3. nesil EPYC (SEV-SNP): AMD'nin hot-loadable microcode patch'ini ve güncellenmiş firmware'ini uygula (CVE-2023-20592 / AMD bülteni uyarınca).
- 1./2. nesil EPYC: mitigation yok — SEV ve SEV-ES gerekli guest-memory-integrity korumasından yoksundur, dolayısıyla bu nesiller açık kalır.
-
- nesil EPYC (Zen 4) etkilenmediği bildirilmiştir.