Skip to content

VMware vmxnet3 heap overflow (CVE-2020-3971)

VMware'in emüle ettiği vmxnet3 network adapter'ındaki bir heap-overflow sınıfı bug, bir guest'in bir emulation buffer'a komşu privileged host physical memory'sini okumasına olanak tanır — bir guest-to-host information disclosure.

Mechanism

Bug class: guest vmxnet3 ring state tarafından sürülen heap out-of-bounds access

vmxnet3 paravirtual NIC, host VMX userworld'ünde emüle edilir. Guest driver, descriptor ring'leri ve packet buffer'ları host ile paylaşır ve device'ı register'lar ve paylaşımlı bir control region üzerinden programlar. Host, guest tarafından yazılmış ring'leri dolaşır; packet data'yı guest tarafından sağlanan buffer'lar ile host-side staging buffer'lar arasında taşımak için length'leri ve buffer adreslerini okur.

Boundary aşılır çünkü guest-controlled ring/descriptor state'inden türetilen bir size ya da offset, o buffer'a doğru şekilde sınırlanmadan bir host heap buffer'a göre index'lemek veya kopyalamak için kullanılır. Access host allocation'ının sonunu aştığında, host komşu heap memory'sini okur — host VMX process'ine ait olan ve physical memory'den privileged bilgi içerebilen bir memory — ve bu out-of-bounds içerik, guest'in gözlemleyebildiği emüle data path boyunca geri döner.

İhlal edilen invariant şudur: guest tarafından sağlanan her length/offset, kullanılmadan önce üzerinde işlem yaptığı host buffer'a karşı validate edilmelidir. Bug bir heap-overflow sınıfı kusur olsa da, açığa çıkan etki (CVSS vektörü C:H/I:N/A:N'ya göre) yalnızca confidentiality'dir — bir host-code-execution write primitive'i değil, bir out-of-bounds read / info leak. Bu, tek bir bug sınıfının (sınırsız heap access) kontrol edilmeyen field'ın hangi yöne sürdüğüne bağlı olarak nasıl bir read-tarafı leak ya da bir write-tarafı corruption ürettiğine iyi bir örnektir.

Walkthrough

Warning

Tarihsel ve patch'lenmiş (VMSA-2020-0015, 2020). Yalnızca public CVE/advisory'den kavramsal bir yeniden kurgu — offset, struct layout veya exploit yok.

  1. Guest, vmxnet3 driver'ını yükler ve device'ın descriptor ring'lerini ve paylaşımlı buffer'larını guest memory'de yapılandırır.
  2. Guest, host tarafından uygulandığında o ring slot'u için host'un staging buffer'ının ötesine ulaşan bir length veya offset ile bir descriptor programlar.
  3. Host emulator descriptor'ı işler ve range dışı size/offset'i kullanarak packet data'yı okur; komşu host heap memory'sini içeri çeker.
  4. Over-read içeriği emüle receive / completion path'i üzerinden guest'e geri akar ve privileged host (physical) memory'sini guest'e açığa çıkarır.
Kavramsal OOB read (yalnızca örnekleme amaçlı)

host: desc = read_ring_descriptor(guest)     // attacker-authored
      len  = desc.length                      // unvalidated vs host_buf
      emit_to_guest(host_buf, len)            // len > sizeof(host_buf) -> over-read
Yalnızca kontrol edilmemiş, guest tarafından sağlanan bir length'in kullanımı load-bearing'dir; somut size ve offset'ler kasıtlı olarak çıkarılmıştır.

Detection

  • VMX crash'leri / core dump'lar: birincil etki sessiz bir read olsa da, unmapped bir page'e dokunan bir over-read vmware-vmx'i fault'lar; vmware.log içine loglanır (Backtrace/CoreDump/MonitorPanic) ve guest network aktivitesiyle korele olur.
  • ESXi vmkernel logları: anormal ring/descriptor parametreleriyle vmxnet3 çalıştıran bir VM için ara sıra vmx userworld sonlanmaları veya ZDUMP'lar.
  • Behavioral sinyal: bir guest'in vmxnet3 descriptor'larını anormal length/offset'lerle programlaması ya da olağandışı ring yeniden yapılandırmaları sürmesi — özellikle workload'u bu paterni haklı çıkarmayan bir VM'de — şüphelidir. Info-leak exploitation büyük ölçüde sessizdir, dolayısıyla bu device-seviyesindeki anomali bir crash'ten daha güvenilir bir sinyaldir.
  • EDR / host telemetry: VM dizini altında tekrarlayan VM başına vmware-vmx fault'ları veya core dump'lar.

Mitigation

  • VMSA-2020-0015'teki düzeltilmiş build'lere patch'leyin:
  • ESXi 6.5: ESXi650-201907101-SG
  • ESXi 6.7: ESXi670-201904101-SG
  • Workstation 15.x: 15.0.2
  • Fusion 11.x: 11.0.2
  • Attack surface'i azaltın: paravirtual NIC gerekli olmadığı yerde farklı bir emüle adapter kullanın veya kullanılmayan network adapter'ları kaldırın; böylece vmxnet3 emulation path'i expose olmaz.
  • OS/compiler defense: kalıcı düzeltme, kopyalamadan önce guest tarafından sağlanan her descriptor length/offset'ini host staging buffer'a karşı sınırlamaktır; host-side heap hardening ve staging buffer'ların zeroing'i, kalan herhangi bir over-read'in değerini azaltır.

References