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.
- 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.
- 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.
- 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.
- 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ı)
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.logiç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
vmxuserworld 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-vmxfault'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.