Skip to content

Kernel Control Flow Guard (kCFG)

Windows kernel-mode forward-edge control-flow integrity'si; indirect call hedeflerini meşru fonksiyon entry point'lerinden oluşan bir bitmap'e karşı doğrular ve bitmap virtualization-based security ile korunur.

Mechanism

User-mode CFG'den farkı

kCFG, user-mode Windows Control Flow Guard ile aynı forward-edge invariant'ını paylaşır ama farklı bir teknik: bitmap ve dispatch kernel'dedir (nt!guard_icall_bitmap/nt!guard_dispatch_icall), enforcement anlamlı olması için VBS/HVCI gerektirir ve ihlal bir bugcheck (KERNEL_SECURITY_CHECK_FAILURE, 0x139) ile sonuçlanır — user-mode'daki process-fast-fail yerine. Bu yüzden ikisi merge edilmez.

Güvenlik invariant'ı

kCFG, kernel'deki her korunan indirect call'un kontrolü yalnızca compile/link zamanında geçerli bir fonksiyon entry point'i olarak kaydedilmiş bir adrese aktarmasını zorunlu kılar. Bir kernel function pointer'ını corrupt eden bir saldırgan (klasik bir untrusted pointer dereference, CWE-822) artık onu rastgele bir gadget'a ya da fonksiyon ortası bir adrese yönlendiremez: dispatch rutini önce hedefi bir bitmap'e karşı kontrol eder ve geçersiz olanda fault verir (KERNEL_SECURITY_CHECK_FAILURE). Bu, control-flow hijacking'in forward edge'ini kırarak çıtayı yükseltir ve saldırganları yalnızca-geçerli-hedef call-oriented tekniklere ya da data-only saldırılara iter.

kCFG'nin gücü, validity bitmap'inin integrity'sine bağlıdır. Virtualization-Based Security altında bitmap ve dispatch korunur, böylece VTL0 kernel kodu bir hedefi basitçe "geçerli"ye çeviremez.

Walkthrough

Windows kernel'inin public reversing'inden ve CFG dokümantasyonundan yola çıkarak:

  1. Valid-target bitmap'i. Compiler her meşru indirect-call hedefini kaydeder. Kernel'de bu metadata nt!guard_icall_bitmap ile temsil edilir: her bit, hizalı bir adresin geçerli bir call hedefi olup olmadığını gösterir.
  2. Indirect call'larda dispatch. Compiler-instrumented indirect call'lar nt!guard_dispatch_icall üzerinden geçer; bu, aday hedefi bitmap'te arar ve yalnızca bit set'liyse devam eder; aksi halde bir security check failure tetikler.
  3. VBS enforcement'ı. Kernel, Windows 10 1703 (RS2)'den beri kCFG ile compile ediliyor, ama anlamlı enforcement VBS/HVCI gerektirir: hypervisor ve secure kernel, bitmap'i ve CFG makinesini VTL0 tampering'inin erişiminden uzak tutar. VBS olmadan kCFG yalnızca sınırlı işlevselliğe sahiptir.
Public olarak belgelenmiş bypass sınıfları

Forward-edge CFI coarse-grained'dir, bu da belgelenmiş yollar bırakır:

  • Geçerli ama amaçlanmamış hedefler. Bitmap tüm fonksiyonları geçerli olarak işaretlediğinden, corrupt edilmiş bir pointer üzerinden ulaşılabilen herhangi bir hassas geçerli fonksiyon suistimal edilebilir (call-oriented programming) ve backward edge'ler (return'ler) CFG tarafından kapsanmaz — bunlar bunun yerine kernel shadow stack'leri (KCET) ile ele alınır.
  • Data-only / non-control saldırılar. Call hedefinin kendisi yerine meşru bir call'u süren data'yı corrupt etmek, kontrolü atlatır.
  • Coarse granularity. Bu, XFG/eXtended Flow Guard'ın motivasyonudur; o, tek başına bir bitmap'ten daha ince eşleştirme için call signature'larının type tabanlı hash'lemesini ekler. Yeni araştırmalar ("Out Of Control: How KCFG and KCET Redefine Control Flow") bu mekanizmaların etkileşimini inceliyor.

Detection

  • Posture: VBS/HVCI'nin açık olduğunu doğrula (msinfo32 → Device Security / Virtualization-based security; Get-CimInstance Win32_DeviceGuard). kCFG enforcement'ı VBS durumunu izler.
  • Semboller: yüklü kernel'de nt!guard_dispatch_icall ve nt!guard_icall_bitmap varlığı, CFG-instrumented bir build'e işaret eder.
  • Telemetri: başarısız indirect-call doğrulamasında bugcheck'ler / KERNEL_SECURITY_CHECK_FAILURE (0x139) ve security audit event'leri, bloklanmış bir control-flow hijack girişiminin sinyalidir.

Mitigation

  • VBS ve HVCI'yi etkinleştir ki kCFG gerçekten enforce edilsin ve bitmap'i hypervisor-protected olsun.
  • CFG'nin kapsamadığı backward edge'i kapatmak için KCET / kernel shadow stack'leri ile katmanla ve daha ince taneli forward-edge kontrolleri için mevcut olduğunda XFG kullanan build'leri tercih et (windows-kernel-cfg.md, kernel-control-flow-integrity.md, control-flow-guard.md).
  • KDP (kernel-data-protection.md) ve KASLR (kaslr-kernel-heap-aslr.md) ile birleştir ki data-only ve adres-tahmini fallback'leri de kısıtlansın.
  • Üçüncü parti driver'ları CFG-compatible tut; instrument edilmemiş module'ler genel garantiyi zayıflatır.

References