Skip to content

HalDispatchTable hijack via NtQueryIntervalProfile

Kanonik Windows write-what-where execution hedefinin kavramsal kataloğu: bir HalDispatchTable slot'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):

  1. Hedefi resolve et. User mode'dan ntoskrnl/HAL base'ini bul (EnumDeviceDrivers), image'ı lokal yükle, HalDispatchTable slot adresini resolve et.
  2. 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).
  3. Trigger. User mode'dan NtQueryIntervalProfile'ı çağır; kernel poison'lanan slot üzerinden indirect call yapar.
  4. Cleanup. Stability için orijinal slot değerini geri yükle; payload token theft gerçekleştirir.

Detection

  • HalDispatchTable entry'lerine (normalde statik) yapılan, hemen ardından bir NtQueryIntervalProfile çağrısı gelen herhangi bir write.
  • HalDispatchTable modifikasyonunun 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).

References