Skip to content

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-vmx process'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:

  1. Bir vmxnet3 adapter'a sahip bir guest içinde local administrator elde edin (device'ın driver-seviyesinde kontrolü).
  2. Device'ı operasyonel state'e getirmek için standart vmxnet3 driver'ını kullanın.
  3. 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.
  4. 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.
  5. 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-vmx crash'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-init tarzı 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.

References