Skip to content

Windows Kernel CFG

Windows kernel'ine uygulanan Control Flow Guard: ntoskrnl içindeki indirect call'lar, meşru target'ların kCFG bitmap'ine göre doğrulanır; HVCI ile bitmap kernel-mode write'lara karşı immutable yapılır, böylece arbitrary bir kernel write bile target kümesini genişletemez.

Mechanism

Why it works

Kernel CFG (kCFG), Control Flow Guard'ın kernel-mode formudur: "The Windows kernel has been compiled with CFG ... since Windows 10 RS2 - when it came to the kernel." ntoskrnl içinde aynı forward-edge invariant'ını uygular — bir indirect call yalnızca build'in valid target olduğunu kanıtladığı bir fonksiyona ulaşabilir.

  • "The CFG bitmap consists of all 'valid' functions used in control-flow transfers. The CFG dispatch functions check this bitmap when an indirect- function call happens to ensure that a function pointer is not overwritten with a malicious function." Kernel bitmap'i nt!guard_icall_bitmap olarak referans edilir.
  • Kernel'deki zor problem, bitmap'in kendisini korumaktır: tarihsel olarak kernel "was the highest security boundary," yani bir kernel write primitive, malicious bir target'ı whitelist'lemek için basitçe bit'leri flip edebilirdi. Bu yüzden kCFG "only fully enabled when HVCI is enabled."
  • Virtualization-Based Security / HVCI altında bitmap'i SLAT/EPT korur: "although the PTE for the kCFG bitmap says it is writable, the EPTE can enforce that this page is not writable." Bitmap'i kernel mode'dan overwrite etme girişimi bir access violation alır, dolayısıyla arbitrary-write primitive bile valid call target kümesini genişletemez.

Invariant: bir kernel indirect call yalnızca build-time'da valid bir target'a çözülür ve "valid"i tanımlayan otorite (bitmap), ring-0 kodun düzenleyemeyeceği hypervisor'ın second-level translation'ının arkasında durur.

Walkthrough

1. Tam enforcement için kCFG, VBS/HVCI'ye bağlıdır. VBS olmadan kCFG yalnızca sınırlı işlevselliğe sahiptir; HVCI ile bitmap EPT-protected olur. Memory integrity (HVCI) durumu, Windows Security > Core isolation'da veya HypervisorEnforcedCodeIntegrity ayarları üzerinden görünür.

2. Dispatch check, kernel function pointer'larını korur. Bir kernel function pointer üzerinden yapılan indirect call, target için nt!guard_icall_bitmap'i index eden kCFG dispatch routine'ine yönlendirilir ve bit clear ise bug-check tetikler.

3. Bitmap, HVCI altında immutable'dır. Korumayı gösterelim: kCFG bitmap page'ine yönelmiş bir kernel write-what-where başarılı olmak yerine fault verir, "because ... the EPTE can enforce that this page is not writable."

kCFG pointer'ları korur, return address'leri değil

"kCFG protects function pointers but does not protect return addresses." Yalnızca bir forward-edge control'üdür.

Detection

HVCI/VBS durumu (msinfo32, Device Guard properties), kCFG'nin tam olarak enforce edilip edilmediğini gösterir. Bir kCFG violation, sessiz bir redirect yerine kendini bir kernel bug check olarak gösterir.

Mitigation

(Residual risk / nasıl bypass edilir.) "kCFG doesn't inspect backwards edge control-flow transfers like ret" olduğundan, kernel ROP kanonik bypass'tır: "A kernel-mode ROP chain can be instrumented to call into any kernel-mode API while redirecting execution in a way that doesn't trigger Kernel Control Flow Guard." Backward edge bunun yerine kernel-mode hardware-enforced stack protection (kendileri de HVCI gerektiren KCET shadow stack'leri) tarafından kapsanmalıdır. Forward edge'de whitelist kabadır — bitmap'te valid olan herhangi bir function entry ulaşılabilir — ve control flow'u saptırmadan state'i bozan data-only attack'ler HVCI-compliant kalır ve kCFG'yi tamamen atlatır. VBS/HVCI olmadan bitmap yazılabilir olur ve garanti çöker. kCFG, user-mode CFG/XFG'nin yanında tek bir katmandır.

References