Windows Kernel CFG¶
Windows kernel'ine uygulanan Control Flow Guard:
ntoskrnliç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_bitmapolarak 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¶
- Connor McGarr. Exploit Development: No Code Execution? No Problem! Living The Age of VBS, HVCI, and Kernel CFG. — https://connormcgarr.github.io/hvci/
- Connor McGarr. Exploit Development: Investigating Kernel Mode Shadow Stacks on Windows. — https://connormcgarr.github.io/km-shadow-stacks/
- Microsoft Learn. Control Flow Guard for platform security. — https://learn.microsoft.com/en-us/windows/win32/secbp/control-flow-guard