Skip to content

Windows kernel stack overflow exploitation (HEVD intro)

Klasik giriş seviyesi kernel exploit'i: bir IOCTL handler'ı, kullanıcı girdisini bounds check yapmadan sabit boyutlu kernel-mode stack buffer'ına kopyalar; bu da saved return address'i ezerek execution'ı bir token-stealing payload'ına yönlendirir.

Mechanism

Bug class / invariant

Bir kernel stack buffer overflow, ring 0 içindeki klasik bir spatial-safety violation'dır (CWE-121). HackSys Extreme Vulnerable Driver (HEVD) bunu kasıtlı olarak açığa çıkarır: IOCTL handler'ı, user-supplied length'i hiçbir uzunluk kontrolü yapmadan doğrudan RtlCopyMemory/memcpy ile sabit boyutlu bir kernel stack buffer'ına geçirir. İhlal edilen invariant şudur: bir fonksiyon yalnızca kendi stack frame'i içine yazmalıdır; kopyalama taşınca, saved return address dahil komşu stack belleğini ezer. Fonksiyon return ettiğinde, kontrol saldırganın seçtiği bir adrese aktarılır. Corruption kernel mode'da olduğu için, execution'ı privileged bir process token'ını kopyalayan küçük bir payload'a yönlendirmek SYSTEM verir. Modern build'lerde bu naif yol /GS stack cookie'leri, SMEP ve kCFG/kCET ile engellenir; dolayısıyla çıplak overflow esas olarak eğitsel bir primitive'dir ve gerçek exploit'ler bunu ROP ve info-leak'lerle birleştirir.

Walkthrough

Connor McGarr'ın "Debugging Environment and Stack Overflow" HEVD yazısından kavramsal bir reprodüksiyon. Yalnızca mantıksal adımlar — kesin offset'ler veya çalışan exploit yok.

  1. Kernel debugging'i kur. Bir debuggee VM, named pipe üzerinden WinDbg çalıştıran bir host'a bağlanır; böylece crash incelenebilir ve symbol'ler çözülebilir — standart öğrenme döngüsü.

  2. Vulnerable path'e ulaş. User mode, CreateFile ile driver'ın symbolic link'ine bir handle açar, ardından (bir IRP aracılığıyla) vulnerable handler'a yönlendiren IOCTL ile DeviceIoControl çağırır.

    Conceptual trigger (high level)
    HANDLE h = CreateFile("\\\\.\\HackSysExtremeVulnerableDriver", ...);
    // oversized buffer >> kernel stack buffer size
    DeviceIoControl(h, IOCTL_STACK_OVERFLOW, buf, big_len, ...);
    
  3. Saved return address'i overflow et. Aşırı boyutlu kopya, sabit stack buffer'ı geçer ve return address'i ezer. Bir pattern (örn. 0x42424242), debugger'da instruction pointer kontrolünü doğrular.

  4. Bir payload'a yönlendir. Legacy/öğretici yolda return address, shellcode tutan bir user-mode page'e işaret eder (legacy/korumasız sistemlerde DEP zorunlu kılınmadığı ya da RWX allocation ile aşıldığı için o user-mode page executable'dır). Hardened sistemlerde bu adım bir kernel ROP chain ile değiştirilir, çünkü SMEP ring 0'da user page'lerin yürütülmesini yasaklar.

  5. Bir token çal. payload, mevcut _KTHREAD -> _EPROCESS'i okur, ActiveProcessLinks listesini SYSTEM process'e kadar dolaşır, onun Token pointer'ını mevcut process'inkinin üzerine kopyalar, sonra stack'i restore eder ve temizçe return eder. Sonrasında spawn edilen bir cmd.exe, NT AUTHORITY\SYSTEM olarak çalışır.

Detection

  • Driver Verifier / bugcheck telemetry: başarısız denemeler kernel stop'ları üretir (GS cookie yakaladığında KERNEL_SECURITY_CHECK_FAILURE / 0x139, ya da IP-corruption fault'ları). Üçüncü taraf bir driver'a referans veren tekrarlayan aynı crash'ler güçlü bir sinyaldir.
  • Şüpheli IOCTL trafiği: EDR'ın, non-administrative bir process'in bilinen-vulnerable/unsigned bir driver'a anormal derecede büyük input buffer'larla DeviceIoControl gönderdiğini gözlemlemesi.
  • Token anomalileri: token'ı aniden SYSTEM process token'ıyla eşleşen bir process, ya da meşru bir elevation olmadan gerçekleşen bir integrity-level sıçraması, post-exploitation token hırsızlığına işaret eder.
  • RWX user allocation'ları kernel context'inden yürütüldüğünde (HVCI/EDR tarafından yakalanır) legacy shellcode tekniğini işaretler.

Mitigation

  • Vulnerable driver ship etme; herhangi bir kopyadan önce user-supplied boyutları validate et ve /GS stack cookie'leriyle derle.
  • SMEP (user page'lerin ring 0'da yürütülmesini engeller) ve SMAP, kCFG/kCET'i (kernel return'leri/indirect call'lar için control-flow integrity) etkinleştir.
  • VBS/HVCI dağıt; böylece unsigned kernel kodu ve birçok RWX hilesi başarısız olur.
  • Bilinen-vulnerable driver'ları Microsoft vulnerable driver blocklist ve WDAC ile blokla.

References

See also