App Control for Business / WDAC¶
Windows'un policy-driven code-integrity enforcement'ı (eskiden Windows Defender Application Control / Device Guard configurable code integrity); hangi driver ve application'ların load olmasına izin verileceğine karar veren, kernel'ın Code Integrity engine'i tarafından zorlanan machine-wide bir allowlist.
Mechanism¶
Invariant
Default Windows, bir administrator'ın diske koyabildiği herhangi bir code'a güvenir. App Control bunu tersine çevirir: code default olarak reddedilir ve yalnızca açık bir policy rule'una uyarsa çalışabilir. Enforcement noktası kernel'ın Code Integrity (CI) engine'idir; bu engine her image'ı — kernel-mode driver'ları ve user-mode binary'leri — load zamanında, derlenmiş bir policy'ye göre değerlendirir. Check, image-loading path'inde oturduğu için, policy'yi geçemeyen bir binary asla executable olarak map'lenmez; dolayısıyla diske zararlı bir DLL/EXE/driver yazabilen bir attacker yine de onu çalıştıramaz. App Control policy'leri bilgisayarın tamamına uygulanır ve tüm kullanıcıları etkiler; per-user değildir. Code Integrity check'leri boot'un çok erken aşamasında çalışır, böylece kernel, boot driver'lar ve policy'nin kendisi, untrusted code çalışmadan önce doğrulanır.
Rule'lar, izin verilen code'u şu yollarla tanımlayabilir:
- code-signing certificate'in attribute'ları (publisher / signer);
- dosyanın signed metadata'sından gelen attribute'lar (Original Filename, version) ya da file hash;
- Microsoft'un Intelligent Security Graph (ISG)'i üzerinden app'in reputation'ı;
- yükleyen process'in kimliği (managed installer);
- diskteki file path (Windows 10 1903+);
- binary'yi başlatan process.
Signed bir App Control policy en güçlü formdur: administrative tampering'i (örn. admin olarak çalışan malware'in policy'yi takas etmeye çalışması) tespit etmek üzere tasarlanmıştır ve sessiz bir bypass yerine bir boot failure / bugcheck ile sonuçlanır.
Walkthrough¶
Policy'ler XML olarak yazılır, binary bir .cip/.p7b'ye derlenir ve deploy edilir.
ConfigCI PowerShell modülü oluşturmayı yürütür:
# 1. Generate a policy from a known-good "golden" reference machine
New-CIPolicy -Level Publisher -FilePath .\AppControl.xml `
-ScanPath C:\ -UserPEs
# 2. Start in AUDIT mode — nothing is blocked, violations are only logged
Set-RuleOption -FilePath .\AppControl.xml -Option 3 # "Audit Mode"
# 3. Compile XML -> binary policy
ConvertFrom-CIPolicy -XmlFilePath .\AppControl.xml `
-BinaryFilePath .\AppControl.cip
Audit-mode violation'ları event log'da görünür ve enforce edilen bir policy'nin neyi block edeceğini, sen commit etmeden önce bulmanı sağlar:
Event Viewer:
Applications and Services Logs >
Microsoft > Windows > CodeIntegrity > Operational
Event ID 3076 (audit) — would have been blocked
Event ID 3077 (enforce) — blocked from loading
Enforcement'a geçmek option 3'ü kaldırır ve yeniden deploy eder. Modern Windows'ta policy, CI policy store'una bırakılır ve refresh edilir:
Set-RuleOption -FilePath .\AppControl.xml -Option 3 -Delete # leave Audit
ConvertFrom-CIPolicy .\AppControl.xml .\AppControl.cip
# deploy to: C:\Windows\System32\CodeIntegrity\CiPolicies\Active\<GUID>.cip
CiTool --update-policy .\AppControl.cip # Win11
Runtime'da block edilmiş load
Detection¶
- CodeIntegrity/Operational log: Event ID 3076 (audit, block edilecekti) ve 3077 (enforce edilmiş block), sorunlu image'ı ve ihlal ettiği rule'u adlandırır.
- Tampering yapılmış bir signed policy, sessiz bir allow yerine bir boot failure / bugcheck olarak kendini gösterir; bu da başlı başına bir tamper sinyalidir.
Mitigation¶
App Control kendisi bir mitigation'dır, ama dokümante edilmiş bir attack surface'i vardır:
Bypass sınıfları
- Allowlist'lenmiş ama istismar edilebilir signed binary'ler (LOLBins) —
Microsoft, signed executable'ların bir recommended block list'ini tutar (örn.
bazı script host'lar,
msbuild, eski vulnerable driver'lar); çünkü bunlar bir publisher rule'unu karşılarken keyfi logic çalıştırmaya zorlanabilir. - Path rule'ları, path user-writable ise signer/hash rule'larından daha zayıftır.
- Policy, hardware/boot trust tarafından desteklenmelidir (Secure Boot ve
ideal olarak hypervisor-protected code integrity) ki kernel-level bir attacker'a
direnebilsin;
hypervisor-protected-code-integrity,code-integrity-guard,arbitrary-code-guardvesecure-boot-bypass'a bak.