Skip to content

CacheWarp (CVE-2023-20592)

Kötü niyetli bir hypervisor'ın INVD instruction'ı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).
  • TimeWarpstack ü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.
  • sudo privilege 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.
    1. nesil EPYC (Zen 4) etkilenmediği bildirilmiştir.

References