Hyper-V nested virtualization VP Assist Page null-dereference DoS¶
Başlık hakkında
Bu açık tarihsel olarak "stack overflow DoS" diye anılmıştır (slug bu alias'ı korur), ancak public olarak belgelenmiş root cause bir stack overflow değil, hypervisor context'inde unvalidated bir VP Assist Page overlay'inin null-dereference'idir.
CVE-2020-0890: Hyper-V'nin nested-virtualization path'inde guest tarafından tetiklenebilen bir denial of service. Nested virt etkinken, malicious bir guest doğrulanmamış bir VP Assist Page sağlayıp
vmlaunchçalıştırarak hypervisor'ı (hvix64.exe) fault'a sokup host'u bugcheck edebilir (HYPERVISOR_ERROR). Eylül 2020'de patch'lendi.
Mechanism¶
Bug class ve boundary
Component: Guest VMX operasyonlarının nested-virtualization (L1) handling'inde
hypervisor'ın kendisi, hvix64.exe. Açık, hypervisor'ın vmlaunch emulation sırasında
VP Assist Page overlay'ini nasıl işlediğindedir.
Trust boundary: L1 guest → host hypervisor. Bir guest'e virtualization extension'ları
(nested virt) verildiğinde, kendi VMX/vmlaunch sequence'ını çalıştırabilir. Hypervisor bunu
guest adına emulate eder. O emulation path'indeki bir fault hypervisor context'inde
yürütülür, yani guest tarafı bir trigger tüm host'u crash eder.
Vuln class: Guest-controlled veride (null/zeroed bir overlay page) eksik validation,
hypervisor context'inde bir null-pointer dereference'e yol açar — yani code execution değil,
bir guest-to-host denial of service. (hvinternals write-up'ı root cause'u hypervisor'ın
vmlaunch öncesi VP Assist Page içeriğini doğrulamaması olarak çerçeveler; başlığın "stack
overflow" çerçevelemesi bir alias'tır — public olarak belgelenmiş root cause bir
unvalidated-overlay null-deref'tir, bu yüzden bu CVE için "stack overflow"u doğrulanmamış
olarak ele alın.)
Walkthrough¶
Public hvinternals analizinden kavramsal reproduction path'i (çalışan bir DoS PoC araştırmacı tarafından yayınlandı; aşağıdaki adımlar belgelenmiş trigger'dır, illustrative):
- Host operatörü guest için nested virtualization'ı etkinleştirir:
Set-VMProcessor -VMName <VMName> -ExposeVirtualizationExtensions $true. - Guest içindeki malicious bir driver VMX'i etkinleştirir ve bir VMXON region kurar.
- Driver, sıfırlarla doldurulmuş bir VP Assist Page allocate eder ve o page'in PFN'ini
HV_X64_MSR_VP_ASSIST_PAGEMSR'a (0x40000073) yazar. - Driver
vmclearardındanvmlaunchçalıştırır. vmlaunchemulation sırasında hypervisor overlay page içeriğini doğrulamadan dereference eder; page fiilen null/zeroed olduğundan null-tabanlı bir offset'te okuma yapar ve fault'a girer.
Sadece illustrative
Bu fragment tam bir driver değil, belgelenmiş trigger shape'idir. Yalnızca bir host crash'ine (DoS) neden olur. Tam crash offset'i public write-up'ın belirli build'inden gelir ve sürümler arasında farklılık gösterebilir.
Trigger shape and crash site (illustrative)
Guest (nested virt enabled), inside a kernel driver:
1. enable VMX, set up VMXON region
2. alloc VP Assist Page (zeroed)
3. wrmsr HV_X64_MSR_VP_ASSIST_PAGE (0x40000073) = PFN(zeroed page)
4. vmclear ; vmlaunch
Hypervisor (hvix64.exe) emulating vmlaunch dereferences the overlay
without validating contents; documented crash instruction:
cmp byte ptr [rdx+49h], al ; with rdx = 0 -> access at offset 0x49
Result: HYPERVISOR_ERROR bugcheck; host reboots (even if auto-reboot is off).
- Impact: Host OS
HYPERVISOR_ERRORile bugcheck eder ve reboot olur — bir guest içinden tetiklenen tam bir host DoS. - Patch: Eylül 2020 güvenlik update'i,
vmlaunchdevam etmeden önce VP Assist Page içeriğinin validation'ını ekler. (İkincil bir sorun da not edildi: guest-provided değerler hypervisor'ın overlay buffer'ına kopyalanmadığı için overlay-page initialization stale data bırakabilirdi.)
Etkilenen (hvinternals'a göre): Windows Server 2019, ~1803'ten Ağustos 2020 update'lerine kadar Windows 10 build'leri ve 10.0.20206.1000'e kadar Insider preview build'leri.
Detection¶
- Patch state: Hyper-V host'larında Eylül 2020 cumulative update'inin yüklü olduğunu doğrulayın (
Get-HotFix,winver); MSRC advisory'sinin affected-build listesine karşı doğrulayın. - Host crash signature: Tekrarlanan
HYPERVISOR_ERRORbugcheck'leri / beklenmedik host reboot'ları birincil sinyaldir. Host crash dump'larını toplayıp analiz edin; nested-virt handling'inde fault eden birhvix64.exenoktası göstergedir. - Configuration audit: Hangi VM'lerin
ExposeVirtualizationExtensions = $trueolduğunu listeleyin (Get-VMProcessor); bu path'e ancak nested virt etkin olan untrusted guest'ler ulaşabilir. - Guest behavior: Host reboot'larını, alışılmadık bir kernel driver yükleyen ya da VMX operasyonları yapan belirli bir guest ile ilişkilendirin.
Mitigation¶
- Eylül 2020 güvenlik update'ini uygula — VP Assist Page içeriğini doğrulayan yetkili fix.
- Untrusted VM'ler için nested virtualization'ı devre dışı bırak: Public analize göre en basit mitigation —
Set-VMProcessor -VMName <VMName> -ExposeVirtualizationExtensions $false. Nested virt'i yalnızca güvendiğiniz ve gerçekten ihtiyaç duyan guest'ler için etkinleştirin. - Defense-in-depth: Guest'lerde kimin kernel driver çalıştırabileceğini kısıtlayın; host bugcheck'lerini ve yukarıdaki nested-virt configuration audit'ini izleyin.