HalDispatchTable hijack via NtQueryIntervalProfile¶
Kanonik Windows write-what-where execution hedefinin kavramsal kataloğu: bir
HalDispatchTableslot'unu poison'la, sonra indirect call'ıNtQueryIntervalProfileüzerinden tetikle.
Mechanism¶
Poison'lanan trusted pointer
HalDispatchTable, bir kernel function-pointer table'ıdır.
HalDispatchTable+0x8 (x64; x86'da +0x4) slot'u, indirect olarak ulaşılan bir
pointer tutar: user-callable syscall NtQueryIntervalProfile,
KeQueryIntervalProfile'ı çağırır; bu da o slot'u dereference edip çağırır
(tarihsel olarak hal!HaliQuerySystemInformation).
Bu kendi başına bir bug değildir — ayrı bir write-what-where primitive'i için favori hedeftir. Boundary aşılır çünkü o slot'a tek bir pointer yazabilen bir attacker, sadece dokümante edilmiş bir syscall çağırarak kernel mode'a temiz, user-triggerable bir control transfer kazanır.
Walkthrough¶
Üst-seviye, public HEVD write-up'larından (Connor McGarr ve diğerleri):
- Hedefi resolve et. User mode'dan
ntoskrnl/HAL base'ini bul (EnumDeviceDrivers), image'ı lokal yükle,HalDispatchTableslot adresini resolve et. - Pointer'ı yaz. Slot'u staged bir payload'a (ya da modern sistemlerde
kontrollü bir pivot'a) bir pointer'la overwrite etmek için write-what-where
primitive'ini kullan (bkz.
hevd-arbitrary-write-scenario). - Trigger. User mode'dan
NtQueryIntervalProfile'ı çağır; kernel poison'lanan slot üzerinden indirect call yapar. - Cleanup. Stability için orijinal slot değerini geri yükle; payload token theft gerçekleştirir.
Detection¶
HalDispatchTableentry'lerine (normalde statik) yapılan, hemen ardından birNtQueryIntervalProfileçağrısı gelen herhangi bir write.HalDispatchTablemodifikasyonunun PatchGuard/KPP tespiti.KeQueryIntervalProfile'dan user-mode'a ya da non-image memory'ye resolve olan indirect call.
Mitigation¶
- PatchGuard/KPP
HalDispatchTable'ı korur. - SMEP, kernel CFG/kCET; böylece poison'lanan pointer user shellcode'una ya da geçersiz bir hedefe referans veremez.
- KASLR table'ı bulmanın maliyetini yükseltir.
- Upstream write-what-where bug'ını ortadan kaldır (bkz.
convert-write-where-to-write-what-where-via-gdi-objects).