VMware SVGA II / 3D modern shader exploitation (guest-to-host)¶
"Straight outta VMware" sınıfı guest-to-host escape: bir guest, virtual GPU command FIFO'su üzerinden hazırlanmış SVGA3D shader bytecode'u gönderir ve host shader translator'ındaki validate edilmemiş length'ler/indeksler
vmware-vmx'te heap/stack corruption üretir, host pointer'larını leak eder ve bir host function pointer'ını hijack eder.
Mechanism¶
Note
VMware'in virtual GPU'su (VGPU9/VGPU10), guest driver'ın SVGA3D
command'larına (örn. SVGA_3D_CMD_SET_SHADER) indirgediği ve host
vmware-vmx process'iyle paylaşılan bir command FIFO üzerinden ittiği
Direct3D-türevli shader bytecode'u kabul eder. Host bu bytecode'u yeniden
parse edip native shader'lara translate etmelidir. İzolasyon invariant'ı,
translator'ın guest bytecode'undan alınan her length, token count ve register
indeksini bounds-check etmesi gerektiğidir. "Straight outta VMware" /
Comsecuris bulguları bu invariant'ın birkaç başarısızlığını gösterir:
VGPU10_OPCODE_CUSTOMDATA / dcl_immediateConstantBuffer parse edilirken bir
heap overflow (allocation bir saldırgan length'inden boyutlandırılır),
dcl_indexableTemp'te bir OOB heap write (parse edilmiş değer bir dword
indeks olarak yeniden kullanılır) ve dcl_resource'ta bir stack overflow
(bytecode-türevli indeks sabit bir on-stack array'e). Bunların herhangi biri
VMX process'inde bir guest → host write verir; ek bir RWX mapping code
execution'ı kolaylaştırdı. CVE-2017-4924 (Comsecuris tarafından ZDI
üzerinden raporlandı, VMSA-2017-0015 / Eyl 2017'de düzeltildi) belgelenen
örnektir.
Framebuffer döneminin Cloudburst escape'inin halefi ve SVGA 3D shader heap overflow'un kardeşi.
Walkthrough¶
Public, patch'lenmiş materyal (BlackHat EU 2018 "Straight outta VMware"; Comsecuris write-up'ı; VMSA-2017-0015). Konsept yolu:
- Bir guest GPU app'inden, Direct3D üzerinden shader'ları compile et ki driver FIFO'ya SVGA3D command'ları emit etsin.
- Hatalı biçimli bir declaration token'ıyla shader bytecode'u elle hazırla —
örn. host allocation'ından daha büyük bir immediate-constant-buffer length ya
da range dışında bir
dcl_indexableTemp/dcl_resourceindeksi. - Host translator, kontrollü veriyi bir heap chunk ya da stack array'in ötesine yazar.
- Host ASLR'yi yenmek için leak primitive'ini kullan (
vmware-vmxtext'ini oku), sonra bir host function pointer'ını overwrite et ve onu çağır (talk bir host process başlatmayı gösterir).
Başarısız bir denemede gözlemlenebilir: anormal SVGA3D shader submission'ında
vmware-vmx crash'i.
Warning
Patch'lenmiş/tarihsel. Yalnızca konseptsel — çalışan shader payload'u ya da host offset'leri sağlanmamıştır.
Detection¶
- Host: shader/FIFO işlemede
vmware-vmxfault'ları; RWX mapping'leri için monitor et. - Config: 3D acceleration enabled olan VM'leri enumerate et.
Mitigation¶
- Düzeltilmiş VMware sürümlerine patch'le (shader CVE'leri için VMSA-2017-0006 / VMSA-2017-0015); daha sonraki SVGA shader düzeltmeleri için güncel update'leri uygula.
- Attack surface'i kaldırmak için ihtiyaç duymayan VM'lerde 3D acceleration'ı disable et.
- Device-emulation process'ini sandbox'la/least-privilege uygula; RWX mapping'i kaldır.