PPID SPOOFING
UPDATEPROCTHREADATTRIBUTE
KERNEL-PROCESS
HANDLE ACCESS
DetectionBlue TeamSOCOctober 12, 2026•9 min read

Detecting Parent PID Spoofing: Creator Mismatch and Handle Access

Process trees are how analysts read an intrusion. Parent PID spoofing forges the tree, so you have to find where the forgery shows through.

Scroll

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

SignalWhereATT&CK
Creating process (event header) differs from the ParentProcessID recordedMicrosoft-Windows-Kernel-Process ETWT1134.004
Handle opened with PROCESS_CREATE_PROCESS (0x0080) just before a child appearsSysmon 10, EDRT1134.004
Child session ID differs from the claimed parent’s sessionProcess telemetryT1134.004
Impossible lineage: services.exe child of a user process, explorer child of winlogon-less treeSysmon 1, 4688T1036
Child created far from the claimed parent’s start time or token contextEDR process graphT1134

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

Vetted sources

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 EngineeringManaged Detection & ResponseThreat HuntingIncident ResponsePurple Teaming
  • 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.
Written by: Mjolnir Threat Research (MTAC)  |  Published: October 12, 2026  |  Last reviewed: October 12, 2026