Skip to content

AMD ATIDXX64 pixel shader type confusion VMware guest-to-host (CVE-2019-5183)

Özel hazırlanmış bir pixel shader, AMD Radeon DirectX 11 user-mode driver'ında (atidxx64.dll) bir type confusion tetikler; VMware guest'in 3D çağrılarını host'taki vmware-vmx.exe içinde bu driver'a forward ettiği için, bu bir guest-to-host code-execution primitive'ine dönüşür.

Mechanism

Sınır neden kırılıyor

VMware Workstation guest'e sanal bir 3D GPU sunar. Guest'in Direct3D 11 / pixel-shader işi VM içinde render edilmez — guest'in dışına forward edilir ve host'un gerçek graphics driver'ı olan, host vmware-vmx.exe process'i içine yüklenen atidxx64.dll tarafından işlenir. Register/loop-condition operasyonları hatalı işlenen bozuk bir pixel shader (ps_4_0), driver'ın bir C++ vtable'ının sınırlarını aşmasına yol açar — bir object'in virtual dispatch'i geçerli vtable'ın ötesini okur, dolayısıyla fetch ettiği "function pointer" aslında komşu string/data olur (CWE-843, type confusion). Attacker'ın etkilediği object içerikleriyle o indirect call attacker-controlled data üzerine düşer → host process içinde code execution. İhlal edilen invariant: guest-authored GPU shader'lar untrusted input'tur, ama privileged host driver kodu tarafından parse edilirler — yani o driver'daki bir memory-safety bug'ı bir VM-escape demektir (CVSS Scope:Changed, 9.0).

Walkthrough

Talos advisory'sinden yeniden kurgulanmış kavramsal yol; açıklayıcı amaçlı, silahlandırılmış bir chain değil.

  1. Vulnerable bir AMD Radeon driver'ı olan bir host üzerinde, 3D acceleration etkin bir VMware guest içinde kötü amaçlı bir app çalıştır.

  2. D3D11 üzerinden (CreatePixelShader + bir draw call) register/loop operasyonları out-of-bounds vtable erişimini sürmek için bozulmuş, özel hazırlanmış bir ps_4_0 pixel shader gönder.

  3. Guest shader, host vmware-vmx.exe içindeki atidxx64.dll'e forward edilip compile/process edilir; type confusion, out-of-bounds bir vtable slot üzerinden dispatch eder.

Talos crash kanıtı

Advisory, hata veren indirect call'u call qword ptr [rax+200h] olarak gösterir; burada çözümlenen target geçerli bir code pointer değil, ASCII data'dır (örn. baytlar 6564616853343675, "u64ShaderId") — bozuk/aşırı okunmuş bir vtable slot'un tipik işareti.

Web'den de erişilebilir

Talos, aynı driver yolunun uzak bir web sitesinden WebGL üzerinden teorik olarak erişilebilir olduğunu not eder; WebGL de shader compilation'ı aynı şekilde driver üzerinden sürer.

Detection

  • Host tarafı: Target'ı data'ya işaret eden bir indirect call üzerinde access violation ile gelen vmware-vmx.exe crash'i; WinDbg, atidxx64.dll içindeki bozuk vtable dispatch'ini gösterir.
  • Davranışsal: Compilation'ı başarısız olan veya renderer'ı crash eden bozuk/fuzzer benzeri pixel shader'lar gönderen bir guest anormaldir.

Mitigation

  • Driver'ı patch'le: AMD bunu Radeon Software Adrenalin 2020 (driver 20.1.1, Jan 2020) ile düzeltti — Talos sorunun orada gittiğini doğruladı. Host AMD Radeon driver'ını 20.1.1+'a güncelle ve VMware Workstation'ı patch'le (15.5.1 ile doğrulandı).
  • Yüzeyi daralt: Gerekmediği yerlerde guest 3D acceleration'ı devre dışı bırak.

References