Skip to content

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/