VMware EHCI USB heap overflow race (CVE-2020-3966)¶
VMware USB 2.0 (EHCI) controller emülasyonundaki bir race condition, bir guest'in transfer-descriptor state'ini validation ile use arasında değiştirmesine izin verir ve bir host heap overflow'u ile guest-to-host code execution üretir.
Mechanism¶
Bug class: bir heap copy'sini besleyen shared guest memory üzerinde TOCTOU race
VMware EHCI emülasyonu, guest physical memory'de yaşayan — host emulator onu okurken guest'in yazmaya devam edebileceği memory — guest-authored bir Queue Head (QH) ve Queue Element Transfer Descriptor (qTD) schedule'ını işler. Emulator bir size veya buffer field'ını bir read'de doğrulayıp ardından kopyalama zamanında aynı field'ı yeniden okuduğunda (ya da ona dayandığında), ikinci bir guest thread'i (ya da vCPU) iki erişim arasındaki window'da değeri değiştirebilir.
Bu, shared memory üzerinde klasik bir time-of-check / time-of-use (TOCTOU) double-fetch'tir. Host buffer'ına sığan bir length doğrular, ama kopya çalıştığında guest onu büyütmüştür, yani kopya allocation'ı aşar — root cause'u tek bir eksik bounds check'ten çok mutable guest-controlled field'ların non-atomic read'leri olan bir heap overflow.
Sınır aşılır çünkü emulator, guest descriptor memory'sinin bir transfer süresince stabil olduğunu örtük olarak varsayar. Değildir: host'un iki kez fetch ettiği herhangi bir field bir kez snapshot'lanmalı ve snapshot'a karşı doğrulanmalıdır, aksi takdirde validate edilen değer ile kullanılan değer farklılaşır.
Sibling'den farkı: Buradaki root cause bir race (non-atomic double-fetch, CVE-2020-3966) — length validation'ı geçerken doğru, ama use anında guest tarafından büyütülmüş. Buna karşılık length'in tek bir okumada zaten yetersiz clamp edildiği statik OOB write varyantı (CVE-2020-3967) için bkz. VMware EHCI USB heap overflow.
Walkthrough¶
VMSA-2020-0015 / ZDI materyalinden yüksek seviyeli yeniden inşa. Offset veya exploit kodu yok.
- Guest, guest physical memory'de bir EHCI transfer schedule'ı (QH + qTD) kurar ve controller'ı ona yönlendirir.
- Bir guest execution context'i (vCPU/thread) bir qTD'nin transfer length field'ını, küçük, "geçerli" bir değer ile büyük bir değer arasında tekrar tekrar toggle eder.
- Başka bir eylem controller'ı çalar ki host emulator descriptor'ı, küçük length'i gösterirken doğrulasın.
- Yarışan writer, host data copy'sini gerçekleştirmeden önce length'i büyük değere flip eder; kopya artık host heap buffer'ını aşar.
Conceptual race window (illustrative)
Yalnızca bir guest-mutable field'ın double-read'i load-bearing'dir; somut size'lar ve offset'ler kasıtlı olarak çıkarılmıştır.Warning
Bu race'i kazanmak probabilistic'tir ve "saldırganın kontrolü dışında ek koşullar" gerekir (VMware'e göre), ama birçok transfer boyunca tekrarlanan denemeler onu pratikte ulaşılabilir kılar.
Detection¶
- VMX crash'leri / core dump'lar: guest USB aktivitesi patlamalarıyla ilişkili,
vmware.log'daki aralıklı, yeniden üretilmesi zorvmxpanic'leri (Backtrace/CoreDump/MonitorPanic), heap'i overflow eden kazanılmış bir race'in imzasıdır. - ESXi vmkernel logları: bir VM için sporadik userworld (
vmx) termination'ları veya ZDUMP'lar, saldırgan retry yaptığı için çoğu zaman tek-atış yerine kümelenmiş halde. - Davranışsal sinyal: yüksek oranda EHCI controller ring/reset işlemi yayan veya USB descriptor memory'sini hızlıca yeniden yazan (aynı qTD bölgesine dokunan birden çok vCPU) bir guest anormaldir.
- EDR / host telemetrisi: tekrar eden per-VM
vmxrestart'ları ve VM dizini altında yeni core dump dosyaları.
Mitigation¶
- VMSA-2020-0015'ten fixed build'lere patch uygula:
- ESXi 6.5:
ESXi650-202005401-SG - ESXi 6.7:
ESXi670-202004101-SG - ESXi 7.0:
ESXi_7.0.0-1.20.16321839 - Workstation 15.x: 15.5.2
- Fusion 11.x: 11.5.2
- Attack surface'i azalt: kullanılmayan virtual USB/EHCI controller'larını VM yapılandırmalarından kaldır ki racing code path guest'e asla expose edilmesin.
- OS/compiler savunması: kalıcı fix sınıfı, guest tarafından sağlanan size field'larını tam olarak bir kez snapshot'lamak ve kullanmadan önce snapshot'ı doğrulamaktır (single-fetch), VMX userworld'ünde heap hardening ile birleştirilmiş.