Skip to content

VMware 3D shader out-of-bounds read DoS/info leak (CVE-2019-5521)

VMware pixel-shader path'indeki bir out-of-bounds read, 3D acceleration'lı bir guest'in host memory'sini leak etmesine veya rendering worldlet'ini crash etmesine izin verir.

Mechanism

Bug class: guest tarafından sağlanan shader bytecode'unda eksik bounds validation

VMware'in virtual GPU'su (SVGA3D device'ı) guest'ten shader program'ları ve rendering state'i kabul eder ve host graphics stack'inin çalıştırabilmesi için onları translate eder. Pixel-shader translator'ı guest-controlled bytecode'u walk eder ve doğrudan o bytecode'dan alınan field'ları kullanarak internal array'lere (register'lar, sabitler, sampler'lar, instruction token'ları) index'ler.

Tutması gereken security invariant'ı şudur: guest verisinden türetilen her index, read'den önce backing buffer'ın gerçek boyutuna karşı doğrulanır. CVE-2019-5521 bu invariant'ın bir ihlalidir — bir length, register numarası veya token count bir upper-bound check'i olmadan güvenilir kabul edilir, böylece translator guest-controlled allocation'ın sonunu aşarak okur. Read host VMX/MKS rendering process'inin içinde olduğundan, dokunduğu byte'lar guest memory'si değil host memory'sidir. Guest->host sınırı read yönünde aşılır: guest'e asla görünür olmaması gereken veriler (komşu heap içeriği, pointer'lar) rendering sonuçları aracılığıyla geri yansıtılabilir ve unmapped memory'ye yapılan vahşi bir read renderer'ı fault'lar.

Bu bir info-leak / DoS primitive'idir, bir write primitive'i değil — tek başına code execution vermez, ama host pointer'larının bir leak'i, daha büyük bir escape chain'de ASLR'ı yenmenin klasik bir ilk aşamasıdır.

Walkthrough

Güvenlik açığı 3D graphics enabled bir VM gerektirir (Workstation/Fusion'da varsayılan, ESXi'de varsayılan olarak kapalı). Kavramsal düzeyde guest:

  1. Virtual SVGA3D device'ı ve bir rendering context'i başlatır.
  2. Gömülü size veya index field'ı aslında sağlanan veriden daha büyük olan bir shader/draw komutu submit eder.
  3. Host tarafındaki shader parser'ı o field'ı clamp etmeden bir loop bound ya da array index olarak kullanır ve allocation'ın ötesine okur.
Conceptual shape of the unchecked index (illustrative only)
// Representative pseudo-code of the trusted-length pattern.
// The real translator validates this after the patch.
for (i = 0; i < hdr->token_count; i++)   // token_count is guest-controlled
    emit( shader_tokens[i] );            // no check that i stays in-bounds
High-level guest-side trigger (conceptual)
open SVGA3D device
create surface + shader
define shader with declared length > supplied length
issue draw call -> host translator over-reads
observe rendered output / host renderer crash

Başarılı bir over-read ya render target aracılığıyla komşu host heap byte'larını döndürür (information disclosure) ya da unmapped bir adresi dereference ederek MKS/rendering thread'ini öldürür (host'a karşı denial of service).

Detection

Telemetri sinyalleri

  • Host renderer crash'leri: tekrarlanan vmware-vmx / MKS (mouse-keyboard-screen) worldlet fault'ları, SVGA3D/shader modülünde segfault'lar, ya da 3D rendering ile ilişkili core dump'lar. ESXi'de renderer veya worldlet panic'lerini belirten vmkernel.log / vmware.log kayıtlarına bak.
  • vmware.log: SVGA3D'ye, shader compilation hatalarına, ya da tek bir VM'den zamanda kümelenmiş MKS poweroff/restart olaylarına atıfta bulunan kayıtlar.
  • Davranışsal: host renderer'ı crash eden 3D draw call'ları tekrar tekrar yayan düşük ayrıcalıklı bir guest kullanıcısı — tipik bir workload için anormal ve fuzzing ya da exploitation girişimlerinin güçlü bir göstergesi.
  • Host'taki EDR: graphics aktivitesine bağlı, VM'nin VMX child process'inin beklenmedik crash/restart'ı.

Mitigation

Patch ve sertleştirme

  • Patch (VMSA-2019-0012'ye göre): ESXi 6.7 için ESXi670-201904101-SG, ESXi 6.5 için ESXi650-201903001; Workstation 15.x için 15.0.3 ve 14.x için 14.1.6; Fusion 11.x için 11.0.3 ve 10.x için 10.1.6.
  • Attack surface'i azalt: ihtiyaç duymayan VM'lerde 3D acceleration'ı devre dışı bırak (mks.enable3d = FALSE). ESXi'de özellik zaten varsayılan olarak kapalıdır; bir workload GPU rendering gerektirmedikçe kapalı tut.
  • Defense in depth: host graphics stack'ini/driver'larını güncel tut, çünkü leak host display driver path'ine chain'lenebilir.

References