Do not allow child processes¶
Bir process'in child process oluşturmasını engelleyen bir process-mitigation policy'si; code execution sonrası attacker'lara yaygın "spawn a shell/LOLBin" adımını reddeder.
Mechanism¶
Bug class / invariant
Sık görülen bir post-exploitation adımı yeni bir process spawn etmektir — bir command
shell, bir living-off-the-land binary'si ya da bir payload downloader. Bu mitigation,
belirlenmiş bir process'in asla child process oluşturamaması invariant'ını enforce eder.
Child-process policy'si UpdateProcThreadAttribute ile
PROC_THREAD_ATTRIBUTE_CHILD_PROCESS_POLICY attribute'una
PROCESS_CREATION_CHILD_PROCESS_RESTRICTED değeri verilerek set edilir; bunun Exploit
Protection karşılığı Set-ProcessMitigation -ChildProcessPolicy / -Enable ChildProcess'tir.
Bu kısıtlama set edildiğinde, process'in herhangi bir
CreateProcess denemesi kernel tarafından engellenir. Örneğin bir document viewer içinde
code execution elde eden bir attacker, chain'i sürdürmek için cmd.exe/powershell.exe
başlatamaz.
Walkthrough¶
Üst seviye, kavramsal (Microsoft'un public belgelerinden):
- Bir host uygulaması (örn. Office app, browser), child-process kısıtlama policy'si set edilmiş olarak başlatılır ya da kendini yeniden başlatır.
- Process çalışır ve untrusted içerik işler.
- Bir exploit, process içinde code execution elde eder ve bir shell ya da LOLBin spawn etmeye çalışır.
- Kernel, kısıtlama policy'si yüzünden process-creation isteğini reddeder.
- "Spawn payload/shell" adımı başarısız olur ve yaygın exploitation ile malicious-macro chain'lerini kırar.
Konfigürasyon iki şekilde yapılabilir. (a) Process kendini başlatırken
UpdateProcThreadAttribute ile child-process policy'sini set eder (illustrative-only, hata
denetimi atlandı):
// illustrative-only — child-process creation'ı bloklayan extended startup attribute
SIZE_T size = 0;
InitializeProcThreadAttributeList(NULL, 1, 0, &size);
LPPROC_THREAD_ATTRIBUTE_LIST attrList =
(LPPROC_THREAD_ATTRIBUTE_LIST)HeapAlloc(GetProcessHeap(), 0, size);
InitializeProcThreadAttributeList(attrList, 1, 0, &size);
DWORD64 policy = PROCESS_CREATION_CHILD_PROCESS_RESTRICTED;
UpdateProcThreadAttribute(
attrList, 0,
PROC_THREAD_ATTRIBUTE_CHILD_PROCESS_POLICY,
&policy, sizeof(policy), NULL, NULL);
// attrList daha sonra STARTUPINFOEX üzerinden CreateProcess'e geçirilir
(b) Operasyonel olarak Exploit Protection üzerinden, hedef binary'ye process-level mitigation atayarak (PowerShell, admin):
# enforce: app.exe child process oluşturamaz
Set-ProcessMitigation -Name app.exe -Enable ChildProcess
# audit-mode: bloklama yerine sadece event üret (workflow validation için)
Set-ProcessMitigation -Name app.exe -Enable ChildProcess -Audit
# doğrula
Get-ProcessMitigation -Name app.exe | Select-Object -ExpandProperty ChildProcess
Warning
Bazı meşru workflow'lar child process oluşturur; validation'dan sonra app bazında uygula. Kararlı attacker'lar başka bir process'e injection ya da spawn olmayan teknikler üzerinden pivot yapabilir, bu yüzden injection-blocking mitigation'larla birlikte kullan.
Detection¶
- Engellenen child-process oluşturma için audit-mode event'leri (Exploit Protection / process mitigation telemetry'si) — içerik işleyen bir app'te işaretlenmiş bir block güçlü bir exploit sinyalidir.
- EDR: bir document viewer/browser'ın
cmd/powershell/script host başlatmaya kalkışması.
Mitigation¶
- Yüksek riskli içerik işleyen app'ler için child-process kısıtlamasını Exploit Protection ya da process-creation attribute'u üzerinden etkinleştir.
- Disable Win32k system calls, Code Integrity Guard, Arbitrary Code Guard ve Attack Surface Reduction kuralları ile birleştir.
- Meşru child-process kullanımını bozmamak için audit mode'da validate et.