Skip to content

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:

  1. Bir guest GPU app'inden, Direct3D üzerinden shader'ları compile et ki driver FIFO'ya SVGA3D command'ları emit etsin.
  2. 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_resource indeksi.
  3. Host translator, kontrollü veriyi bir heap chunk ya da stack array'in ötesine yazar.
  4. Host ASLR'yi yenmek için leak primitive'ini kullan (vmware-vmx text'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-vmx fault'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.

References