Windows Code Integrity Guard¶
CIG, yalnızca düzgün signed image'ların (Microsoft / Windows Store / WHQL) bir process'e yüklenmesine izin veren, attacker DLL'lerini map zamanında bloklayan bir Windows process-mitigation policy'sidir.
Mechanism¶
Yaygın bir post-exploitation adımı, kötü amaçlı bir DLL'i bir hedef process'e yükletmektir (DLL hijacking, planting ya da injection). Binary-signature policy üzerinden sunulan Code Integrity Guard (CIG), Windows memory manager'ın her image'ın signature'ını map edilirken doğrulamasını ve izinli bir authority tarafından imzalanmamış her şeyi reddetmesini sağlar.
Neden çalışır
CIG, image mapping sırasında kernel memory manager'da zorlanır:
kernel, düzgün signed olmayan bir DLL'i yükleme girişimlerini başarısız kılar
burada "düzgün signed", seçilen policy bit'lerine göre Microsoft, Windows Store
ya da WHQL-signed anlamına gelir. Invariant şudur: yalnızca onaylı bir
dijital signature taşıyan image'lar process'e executable map edilebilir,
dolayısıyla bir saldırgan — LoadLibrary çağıran bir path'i kontrol etse ya da
executable'ın yanına bir DLL yerleştirse bile — unsigned native kodu
yükletemez. CIG, Arbitrary Code Guard'ı tamamlar: CIG hangi image'ların
yüklenebileceğini kontrol eder, ACG dynamic (runtime'da üretilen) kodu
kontrol eder.
Walkthrough¶
CIG, PROCESS_MITIGATION_BINARY_SIGNATURE_POLICY kullanılarak
SetProcessMitigationPolicy üzerinden (ya da process creation'da) yapılandırılır:
PROCESS_MITIGATION_BINARY_SIGNATURE_POLICY policy = { 0 };
policy.MicrosoftSignedOnly = 1; // only Microsoft-signed images may load
if (!SetProcessMitigationPolicy(ProcessSignaturePolicy,
&policy, sizeof(policy))) {
// GetLastError() -> diagnose
}
PROCESS_MITIGATION_BINARY_SIGNATURE_POLICY'nin belgelenmiş flag'leri:
MicrosoftSignedOnly Set (0x1) to prevent loading images not signed by
Microsoft.
StoreSignedOnly Set (0x1) to prevent loading images not signed by the
Windows Store.
MitigationOptIn Set (0x1) to prevent loading images not signed by
Microsoft, the Windows Store, and WHQL.
AuditMicrosoftSignedOnly Audit-only variant (log, do not block).
AuditStoreSignedOnly Audit-only variant (log, do not block).
CIG'yi process başlamadan önce uygulamak
Edge ekibi, CIG'nin process creation zamanında enable edilebileceğini (böylece
ilk DLL yüklenmeden önce yürürlükte olur) ve child-process creation'ı
engellemekle birleştirilebileceğini belirtir. Policy'yi process attribute list
üzerinden (PROC_THREAD_ATTRIBUTE_MITIGATION_POLICY /
PROCESS_CREATION_MITIGATION_POLICY_BLOCK_NON_MICROSOFT_BINARIES_*) set etmek,
early init sırasında unsigned bir DLL'in yüklenebileceği pencereyi önler.
PowerShell ile aynı policy kalıcı uygulanabilir / doğrulanabilir; uymayan bir image
section/map sırasında STATUS_INVALID_IMAGE_HASH ile reddedilir:
# audit mode: ihlalleri block etmeden Event Log'a yaz
Set-ProcessMitigation -Name app.exe -Enable AuditMicrosoftSignedOnly
# enforce: yalnızca Microsoft-signed binary'leri load et
Set-ProcessMitigation -Name app.exe -Enable BlockNonMicrosoftSignedBinaries
# aktif policy'yi doğrula
Get-ProcessMitigation -Name app.exe | Select-Object -ExpandProperty SignaturePolicy
Önce audit flag'lerini kullan
Third-party plugin/DLL'lere bağlı bir process'te MicrosoftSignedOnly'yi
enable etmek o load'ları bozar. Enforce etmeden önce neyin bloklanacağını
loglamak için AuditMicrosoftSignedOnly ile yay.
Detection¶
- Audit flag'leri, bloklanacak image'lar için Exploit Protection / Microsoft Defender event kanallarında ortaya çıkan olaylar üretir — enforcement'tan önce unsigned bağımlılıkları envanterlemek için kullanışlıdır.
Mitigation¶
CIG'nin durdurdukları ve residual risk:
- Durdurur: unsigned attacker DLL'lerini yüklemek (planting, search-order hijack, unsigned bir image'ı map eden klasik injection).
- Tek başına durdurmadıkları:
- Signed-ama-vulnerable / "bring your own" signed DLL'ler — exploit edilebilir bir flaw'a sahip meşru biçimde Microsoft/WHQL-signed bir binary hâlâ yüklenip suistimal edilebilir; CIG, image'ın güvenliğini değil signature'ını kontrol eder. Araştırmacılar, signature trust modelini suistimal eden bypass'lar (örneğin bir non-CIG process'ten CIG-korumalı process'e injection yapan, Morphisec'in tarif ettiği "CIGslip" tekniği) gösterdi; yani CIG mutlak değil, bir katmandır.
- Dynamic / runtime'da üretilen kod — CIG, in-process JIT'i ya da RWX allocation'ı kısıtlamaz; o, Arbitrary Code Guard'ın (windows-arbitrary-code-guard) işidir. CIG ve ACG'nin birlikte deploy edilmesi amaçlanır.
- Code-reuse (ROP/JOP) — yeni image gerektirmez; windows-control-flow-guard ve intel-cet-shadow-stack ile kısıtla.
- İlgili kernel-mode signing enforcement'ı: module-signature-enforcement (driver signing), aynı "yalnızca signed kod" prensibini kernel modüllerine uygular.
References¶
- Microsoft Learn, "PROCESS_MITIGATION_BINARY_SIGNATURE_POLICY (winnt.h)" — https://learn.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-process_mitigation_binary_signature_policy
- Microsoft Edge Blog, "Mitigating arbitrary native code execution in Microsoft Edge" — https://blogs.windows.com/msedgedev/2017/02/23/mitigating-arbitrary-native-code-execution/
- Microsoft Learn, "Exploit protection reference" — https://learn.microsoft.com/en-us/defender-endpoint/exploit-protection-reference
- Morphisec, "CIGslip — A New Method to Bypass Microsoft Code Integrity Guard (CIG)" — https://www.morphisec.com/blog/new-method-to-bypass-microsoft-cig/