Hyper-V vmswitch RNDIS OID arbitrary host read (Azure region takedown)¶
Guest-supplied bir RNDIS OID request, vmswitch.sys'te doğrulanmamış bir pointer dereference'e ulaşır ve bir VM'in host kernel belleğini okumasına/çökertmesine izin verir — tüm bir Azure region'ını çökertebilecek bir CVSS 9.9 guest-to-host bug'ı (CVE-2021-28476).
Mechanism¶
Note
vmswitch.sys, host kernel'de çalışan Hyper-V virtual-switch driver'ıdır. Guest synthetic
NIC'leri onunla VMBus üzerinden RNDIS, yani Remote NDIS protokolünü kullanarak konuşur;
buna adapter'ı yapılandıran/sorgulayan OID (Object Identifier) request'leri dahildir. Bazı
OID'ler meşru olarak hardware seviyesindeki yapılara (offloading, IPsec, SR-IOV) atıf yapar ve
bu nedenle host'un NDIS stack'i için anlamlı pointer'lar/handle'lar taşır.
CVE-2021-28476, OID_SWITCH_NIC_REQUEST'e bağlı handler'dadır
(VmsIfrInfoParams_OID_SWITCH_NIC_REQUEST). İki açık birleşir:
- Trust/design flaw — host, bir guest VM bunları asla originate etmemesi gerekse de
OID_SWITCH_NIC_REQUESTmesajlarını bir guest'ten kabul eder. - Missing validation — handler, request'te taşınan bir pointer'ı doğrulamadan dereference
eder. Public PoC, crash'i
r10deadbeefbaadc0degibi bir attacker değeri tutarkenmov ecx, dword ptr [r10+20h]'de gösterir.
Guest o pointer'ı kontrol ettiği ve host onu bir host virtual address olarak dereference ettiği için, guest doğrudan host kernel context'inde bir arbitrary read primitive (ve bir crash/DoS) elde eder — VM isolation boundary'sini tek bir tenant'tan shared host'a aşar. Birçok tenant'ın Hyper-V host'larını paylaştığı Azure'da, bu bir VM'in host belleğini okuyabileceği ya da host'ları ölçekte çökertebileceği anlamına geliyordu — "tüm cloud region'larını çökertmek." Microsoft bunu CVSS 9.9 olarak derecelendirdi ve Mayıs 2021'de patch'ledi.
Warning
Bug, yaklaşık Ağustos 2019'dan itibaren build'lerde gönderildi ve Mayıs 2021 fix'inden önce bir yıldan fazla production'da kaldı. Primitive arbitrary read / DoS'tur; onu tam RCE'ye çevirmek ek çalışma gerektirir ama co-tenant host'larının DoS'u anlıktır.
Walkthrough¶
Ophir Harpaz (Guardicore) ve Peleg Hadar (SafeBreach) tarafından, coverage-guided fuzzing'in hypervisor-aware bir adaptasyonu olan hAFL1 kullanılarak bulundu. Crash, modifiye edilmiş Hyper-V driver'larına sahip bir Linux guest'ten erişilebilir.
Conceptual trigger path (from the public PoC write-up)
Guest (modified netvsc): cause an OID_SWITCH_NIC_REQUEST to be emitted, e.g.
ifconfig eth0 hw ether 00:11:22:33:44:55 # hits netvsc_set_mac_addr
Host vmswitch.sys dispatch (illustrative):
RndisDevHostHandleSetMessage
-> VmsIfrInfoParamsNdisOidRequestBuffer
-> VmsIfrInfoParams_OID_SWITCH_NIC_REQUEST <-- vulnerable
Crash site (windbg, from PoC):
vmswitch!VmsIfrInfoParams_OID_SWITCH_NIC_REQUEST:
mov ecx, dword ptr [r10+20h] ; r10 = deadbeefbaadc0de (guest-controlled)
=> MEMORY_MANAGEMENT / arbitrary read of host VA
Vulnerable bir host'ta beklenen etki: Guest-controlled bir değer bir host kernel pointer olarak dereference edilir ve bir host-kernel read ya da bugcheck (host DoS) üretir.
Detection¶
- Belirli bir guest'in network aktivitesiyle ilişkilendirilmiş
vmswitch.sys'ten kaynaklanan host bugcheck'leri; OID-request dispatch path'ine atıf yapan host kernel crash dump'larını toplayın ve triyaj edin. - Anormal RNDIS trafiği:
OID_SWITCH_NIC_REQUESTyayan bir guest (guest'lerin originate etmemesi gereken) başlı başına güçlü bir göstergedir. - Shared bir host'ta tek bir tenant'a izole edilmiş tekrarlanan host network-stack instability.
Mitigation¶
- CVE-2021-28476 için Mayıs 2021 Microsoft güvenlik update'ini uygulayın; fix, guest-originated/invalid OID request'leri pointer dereference edilmeden önce reddedilecek şekilde validation ekler. Etkilenen ürünler Hyper-V'ye sahip Windows 7/8.1/10 ve Windows Server 2008–2019 sürümlerini kapsar.
- Hyper-V host'larını patch'lenmiş bir servicing baseline'da tutun; multi-tenant host'larda guest network driver'larını host kernel'a untrusted input olarak ele alın.