A caller can name any process it holds a handle to as the parent of a new one by passing PROC_THREAD_ATTRIBUTE_PARENT_PROCESS to UpdateProcThreadAttribute before CreateProcess. The child then appears under explorer.exe or a service host instead of under the real launcher, defeating parent-child rules. The forgery is complete at the field level but not at the event level.
Signals at a Glance
| Signal | Where | ATT&CK |
|---|---|---|
| Creating process (event header) differs from the ParentProcessID recorded | Microsoft-Windows-Kernel-Process ETW | T1134.004 |
| Handle opened with PROCESS_CREATE_PROCESS (0x0080) just before a child appears | Sysmon 10, EDR | T1134.004 |
| Child session ID differs from the claimed parent’s session | Process telemetry | T1134.004 |
| Impossible lineage: services.exe child of a user process, explorer child of winlogon-less tree | Sysmon 1, 4688 | T1036 |
| Child created far from the claimed parent’s start time or token context | EDR process graph | T1134 |
Finding the Real Creator
Sysmon Event 1 and Security Event 4688 report the parent as recorded in the new process, which is exactly the field the attacker controls. The Microsoft-Windows-Kernel-Process ETW provider is different: its process-start event is stamped with the real creating process in the event header, alongside the recorded parent ID. When the two differ, the parent was spoofed. Several EDRs surface this directly; if yours does, a KQL-style check looks like this:
// KQL over an EDR table exposing both the real creator and the reported parent
// (field names vary by product; map them to your schema)
ProcessCreateEvents
| where RealCreatorPid != ReportedParentPid
| where not(RealCreatorImage has_any ("\\svchost.exe", "\\services.exe", "\\WmiPrvSE.exe"))
| project Timestamp, DeviceName, RealCreatorImage, ReportedParentImage,
ChildImage, ChildCommandLine
| order by Timestamp desc
// tune/validate: shell extensions, UAC elevation and some launchers legitimately differ.
If you do not have creator-versus-parent data, move one step earlier. To spoof a parent, the caller must hold a handle to it with the create-process right. Sysmon Event 10 records that handle request:
title: Process Handle Opened with PROCESS_CREATE_PROCESS
logsource:
product: windows
category: process_access
detection:
selection:
GrantedAccess|endswith:
- '0x0080'
- '0x1fffff'
TargetImage|endswith:
- '\explorer.exe'
- '\svchost.exe'
- '\winlogon.exe'
filter_system:
SourceImage|startswith:
- 'C:\Windows\System32\'
- 'C:\Program Files\'
condition: selection and not filter_system
level: medium
# tune/validate: expect launchers, elevation helpers and EDR agents.
Contextual Checks
- Compare the child’s integrity level and session with the claimed parent; a spoofed child often inherits properties from the real caller instead.
- Flag children of explorer.exe or svchost.exe that are command-line tools launched with no user interaction, such as cmd.exe with a long encoded argument.
- Hunt unsigned binaries that open a handle to a high-value process and spawn a child within a second.
- Never allowlist a parent-child pair globally; allowlist the pair together with the signing and path of the child.
Use the SigmaHQ process-access and suspicious-lineage rules, Elastic’s parent process spoofing detections (which compare the real and reported parent), MITRE ATT&CK T1134.004 procedure examples and the Atomic Red Team tests for lab validation. Baseline your own environment — elevation and launcher software commonly reparent children.
Build Detections That Fire
Mjolnir Security helps blue teams turn threat intelligence into high-fidelity detections across endpoint, network, identity and cloud telemetry.
- Detection Engineering We build and tune detections mapped to ATT&CK from your own telemetry.
- Threat Hunting as a Service Hypothesis-driven hunts for the behaviours on this page.
- 24/7 Incident Response Containment when a detection fires. Call +1 833 403 5875.
Stay ahead of emerging threats. Get notified when we publish new intelligence reports and advisories.
Subscribe to Alerts