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:
- Valid-target bitmap'i. Compiler her meşru indirect-call hedefini kaydeder.
Kernel'de bu metadata
nt!guard_icall_bitmapile temsil edilir: her bit, hizalı bir adresin geçerli bir call hedefi olup olmadığını gösterir. - 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. - 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_icallvent!guard_icall_bitmapvarlığı, 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.