VMware vmxnet3 uninitialized stack guest-to-host escape (CVE-2018-6981)¶
VMware'in emüle ettiği vmxnet3 paravirtual NIC'inde guest tarafından tetiklenebilir bir uninitialized resource kullanımı (CWE-908): hatalı işlenen invalid-DMA emulation'ı bir host stack variable'ını uninitialized bırakır; device backend bunu sonra kullanır ve host
vmware-vmxprocess'inde memory corruption ile code execution'a yol açar. GeekPwn 2018'de raporlandı, VMSA-2018-0027'de düzeltildi.
Mechanism¶
Note
vmxnet3, VMware'in paravirtual network adapter'ıdır ve host vmware-vmx (VMX)
process'i içinde emüle edilir. Guest driver, guest-controlled memory'de yaşayan
device register'larını ve DMA descriptor ring'lerini programlar; host backend
bunları okur ve guest adına karşılık gelen network/DMA operasyonlarını yapar.
Isolation invariant'ı, host'un her local variable'ı kullanılmadan önce
known-good bir state'e kurması gerektiğidir — özellikle guest input'unun
malformed olduğu error path'inde.
CVE-2018-6981 bir use-of-uninitialized-resource bug'ıdır (CWE-908). Guest
geçersiz bir DMA adresi sağladığında, host'un o error durumunun emülasyonu bir
stack variable'ını initialize etmekte başarısız olur. Sonraki bir code path bu
stale stack içeriğini geçerli bir değermiş gibi tüketir (ör. sonraki bir device
operasyonunda kullanılan bir pointer/length), böylece attacker tarafından
etkilenen ya da artakalan host memory bir corruption primitive'i sürer. Bu, host
VMX process bağlamında çalıştığı için aşılan boundary guest → host'tur:
Workstation/Fusion'da bu host makinesinde code execution anlamına gelebilir
(CVSS 8.8, AV:L/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H).
Bu, VMware vmxnet3 integer overflow host code execution ile aynı untrusted-input device-backend sınıfıdır ve kardeş info-leak'i VMware vmxnet3 uninitialized stack info leak (CVE-2018-6982) ile eşlenir; ikisi de VMSA-2018-0027'de düzeltildi.
Walkthrough¶
Public, patch'lenmiş issue (VMSA-2018-0027), binary patch'ten PoC'ye kadar herkese açık olarak analiz edildi. Yalnızca kavramsal yol — exploit geometry'si yok:
- Bir vmxnet3 adapter'a sahip bir guest içinde local administrator elde edin (device'ın driver-seviyesinde kontrolü).
- Device'ı operasyonel state'e getirmek için standart vmxnet3 driver'ını kullanın.
- Bir register write ile device state'ine geçersiz bir DMA adresi programlayın; böylece host, error handling'inin temizce reddetmediği kötü bir adres saklar.
- Vulnerable path'i süren spesifik device-protocol komutunu (PCI MMIO ile) gönderin; host, hatalı işlenen invalid-DMA durumundan artakalan uninitialized stack variable'ını tüketir.
- VMX heap'indeki ortaya çıkan memory corruption sonra bir host object kontrolüne ve nihayet host code execution'a groom edilir.
Warning
Tarihsel/patch'lenmiş, yalnızca kavramsal. Kesin offset, struct field veya gadget chain verilmemiştir. Yayımlanan analiz, halihazırda düzeltilmiş bir issue'nun savunma odaklı bir "patch-to-PoC" çalışmasıdır.
Detection¶
- Host: o guest'in NIC/DMA programlamasıyla korele belirli bir VM için
vmware-vmxcrash'leri; host process crash dump'larını ve EDR fault telemetry'sini yakalayın. - Etkilenen VM için
vmware.log: bir VMX abort'undan hemen önce vmxnet3 çevresindeki device reset/error girdileri. - Inventory: exposure'ı kapsamlandırmak için bir vmxnet3 adapter ile yapılandırılmış VM'leri enumerate edin; vmxnet3 olmayan adapter'lar (e1000/e1000e) bu issue'dan etkilenmez.
- Anomali: bir guest'in tekrar tekrar geçersiz DMA adresleri yazıp ardından device komutları göndermesi, sağlıklı bir NIC driver'ı için karakteristik değildir.
Mitigation¶
- VMSA-2018-0027 düzeltmelerini uygulayın: Workstation 14.1.4 / 15.0.1, Fusion 10.1.4 / 11.0.1, ESXi 6.7 (ESXi670-201811401-BG), ESXi 6.5 (ESXi650-201811301-BG), ESXi 6.0 (ESXi600-201811401-BG). Patch'lemekten başka workaround yok.
- Mümkün olduğunda untrusted guest'ler için vmxnet3 olmayan bir NIC modeli kullanın; çünkü yalnızca vmxnet3 ile yapılandırılmış VM'ler expose'dur.
- Compiler/OS defense-in-depth: stack-variable zeroing /
-ftrivial-auto-var-inittarzı initialization, tüm sınıf uninitialized-stack bug'larını kaldırır; device emulation'ı sandbox'lı ve least-privileged çalıştırın.