Skip to content

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):

  1. Host operatörü guest için nested virtualization'ı etkinleştirir: Set-VMProcessor -VMName <VMName> -ExposeVirtualizationExtensions $true.
  2. Guest içindeki malicious bir driver VMX'i etkinleştirir ve bir VMXON region kurar.
  3. Driver, sıfırlarla doldurulmuş bir VP Assist Page allocate eder ve o page'in PFN'ini HV_X64_MSR_VP_ASSIST_PAGE MSR'a (0x40000073) yazar.
  4. Driver vmclear ardından vmlaunch çalıştırır.
  5. vmlaunch emulation 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).
  1. Impact: Host OS HYPERVISOR_ERROR ile bugcheck eder ve reboot olur — bir guest içinden tetiklenen tam bir host DoS.
  2. Patch: Eylül 2020 güvenlik update'i, vmlaunch devam 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_ERROR bugcheck'leri / beklenmedik host reboot'ları birincil sinyaldir. Host crash dump'larını toplayıp analiz edin; nested-virt handling'inde fault eden bir hvix64.exe noktası göstergedir.
  • Configuration audit: Hangi VM'lerin ExposeVirtualizationExtensions = $true olduğ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.

References