Skip to content

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):

  1. 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.
  2. Process çalışır ve untrusted içerik işler.
  3. Bir exploit, process içinde code execution elde eder ve bir shell ya da LOLBin spawn etmeye çalışır.
  4. Kernel, kısıtlama policy'si yüzünden process-creation isteğini reddeder.
  5. "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

References