Hyper-V vkrnlintvsp.sys heap overflow + I/O ring (CVE-2025-21333)¶
vkrnlintvsp.sys'teki bir paged-pool heap overflow'u (
VkiRootAdjustSecurityDescriptorForVmwp, buradamemmoveuser kontrollü birDacl->AclSize'a güvenir) WNF state data ile groom edilir ve komşu bir I/O ring'inRegBuffersarray'inin bir entry'sini bozarak kernel R/W'ye dönüştürülür.
Mechanism¶
vkrnlintvsp.sys Hyper-V'nin "NT Kernel Integration VSP"sidir. VkiRootAdjustSecurityDescriptorForVmwp'de driver, bir security descriptor'ın DACL'ini bir paged-pool allocation'a kopyalar, ama memmove length'i attacker'ın sağladığı Dacl->AclSize field'ından gelir ve bu allocation size'a karşı asla doğrulanmaz.
Note
Kırılan invariant "DACL kendi size'ını bildirir ve driver buna güvenir"dir. Destination buffer meşru descriptor için boyutlandırılmıştır, ama copy length'i caller'ın user kontrollü SecurityDescriptor'a koyduğu AclSize ne ise odur (OBJECT_ATTRIBUTES üzerinden geçer, cross-VM event creation path'i / NtCreateCrossVmEvent üzerinden erişilir). Daha büyük bir AclSize paged-pool chunk'ını komşu allocation'lara overflow eder. Bug attacker byte'larının bounded bir copy'si olduğu için, hassas, içeriği kontrol edilen bir overflow'dur — sadece structure'ı smashing etmek yerine komşu bir object'teki seçilmiş bir pointer'ı overwrite etmek için idealdir. Exploit, komşuyu bir I/O-ring RegBuffers pointer array'i yaparak bunu kernel R/W'ye dönüştürür (bkz. single-entry overwrite).
Overflow paged-pool LFH'de gerçekleşir; gösterilen PoC 0x50 size bucket'ında çalışır ve ~0xFFF0 byte'a ulaşabilir (subsegment size ile sınırlı — onu aşmak crash verir).
Walkthrough¶
MrAle98 PoC'sinin (Win11 23H2) dizisi:
- Paged pool'u WNF state data ile groom et. Çok sayıda Windows Notification Facility state-data object'i allocate et (
NtCreateWnfStateName/NtUpdateWnfStateData) ki target LFH bucket'ı yoğun ve öngörülebilir biçimde dizilsin. - Hole'lar aç. Yakında overflow olacak allocation'ın hemen ardında konumlanan iki belirli WNF state-data object'ini free et.
- Target object'lerle reclaim et. İki hole'a reallocate et:
- bir I/O-ring
RegBuffersarray'i (pool tagIrRB,IOP_MC_BUFFER_ENTRY'ye giden pointer'lardan oluşan bir array), ve - bir
PipeAttributeobject'i. - Overflow.
VkiRootAdjustSecurityDescriptorForVmwp'yi aşırı büyük birDacl->AclSizeile tetikle ki copy source chunk'ı aşsın ve komşuRegBuffersarray'i içinde bir pointer'ı overwrite ederek onu bir usermodeIOP_MC_BUFFER_ENTRY'ye (Address= kernel target,Type=0xC02,Size=0x80) yönlendirsin.RegBuffersCount,BuildIoRingRegisterBuffersüzerinden user kontrollüdür (tek kısıt: nihai size0xFFFFFFFF'ten küçük olmalı). - Kernel R/W. Hijack edilen buffer index'ine karşı I/O submit et:
BuildIoRingWriteFile-> arbitrary kernel write;BuildIoRingReadFile-> arbitrary kernel read; ikisi de bir named pipe üzerindenNtSubmitIoRingile sürülür.PipeAttributekomşusu leak/staging'e yardımcı olur. - SYSTEM. R/W'yi SYSTEM
_EPROCESStoken'ını bulmak için kullan ve mevcut process'in_EPROCESS.Token'ını overwrite et, ardından bir SYSTEM shell spawn et.
Warning
Overflow size'ı LFH subsegment ile sınırlıdır; onu aşmak alakasız chunk'ları bozar ve bugcheck verir. Güvenilirlik, WNF spray'inin iki free edilen slot'u overflow source'unun hemen ardına düşürmesine bağlıdır, bu yüzden (sadece toplu spray değil) hassas grooming gereklidir. User'ın Hyper-V cross-VM creation path'ine erişebilmesini gerektirir (Hyper-V/VBS enabled olan yerlerde default-on).
Detection¶
CVE-2025-21333 14 Ocak 2025'te patch'lendi (22H2/23H2 için KB5050021) ve in the wild exploit edildiği raporlandı. Gözlemlenebilirler: aşırı büyük bir DACL ile cross-VM event creation yapan düşük yetkili bir process, ardından çözümlenen buffer adresleri kernel-space olan I/O-ring buffer registration ve submission'larla birlikte yoğun WNF state-name çalkalanması (NtCreateWnfStateName/NtUpdateWnfStateData). EDR, WNF-spray + I/O-ring + token-swap zincirini ilişkilendirebilir.
Mitigation¶
Ocak 2025 cumulative update'ini uygula; bu, VkiRootAdjustSecurityDescriptorForVmwp'ye size doğrulamasını ekler. Mümkün olduğunda Hyper-V / Virtualization-Based Security'yi disable etmek attack surface'i kaldırır. HVCI bu data-only zinciri durdurmaz, dolayısıyla patching birincil kontroldür.