RoguePlanet — Microsoft Defender SYSTEM Escalation Zero-Day
Executive Summary
RoguePlanet weaponizes a time-of-check / time-of-use (TOCTOU) race in Microsoft Defender's antimalware engine (MsMpEng.exe / mpengine.dll). The engine validates a file path and then operates on it as two non-atomic steps; an unprivileged user flips a directory to an NTFS junction/symlink (a reparse point) in the gap, so Defender's SYSTEM-level write or remediation lands on an attacker-chosen target — yielding code execution as SYSTEM. The public PoC was released 2026-06-10 by the "Nightmare Eclipse" group and works on fully patched Windows 10/11 (including Canary), bypassing Microsoft's mid-May hardening of the mpengine!SysIO* APIs.
Two modes are documented. The original RCE variant coerces a victim into opening a crafted .vhd(x) from a remote SMB share, causing Defender to overwrite its own files. After the May hardening, the author pivoted to a local privilege escalation variant using local symlink redirection — the higher-probability, in-scope risk for most enterprises, since any commodity malware foothold or low-priv user can attempt it. Predecessors from the same group (BlueHammer / CVE-2026-33825, RedSun) used the identical junction-redirection primitive and have already appeared in live intrusions.
MsMpEng.exe → shell lineage detection (Q1) as a Custom IOA today. There is no patch; treat this as an exposure to mitigate, not remediate. Earliest high-fidelity signal: Q1 (Defender engine spawns a shell); Q3 (SYSTEM write into System32) confirms the redirect — escalate on any hit.Source Review & Web Hunter Notes
| Tier | Source | Key Finding | Carry |
|---|---|---|---|
| 1 · Vendor research | Picus Security — Anatomy of the Nightmare Eclipse Defender Zero-Day | TOCTOU mechanism, junction/symlink redirection, mpengine!SysIO* bypass, Sigma/KQL lineage detection, infra IOCs | yes |
| 1 · News of record | BleepingComputer | RCE→LPE pivot after May hardening; fully patched Win10/11 incl. KB5094126; Microsoft "investigating"; reliability varies by host | yes |
| 2 · Corroborating | The Hacker News / SecurityWeek / Cybersecurity News | SYSTEM shell on patched Windows; PoC GitHub→self-hosted; Patch-Tuesday timing | partial |
| 2 · Control efficacy | ThreatLocker | Allowlisting blocks execution; exploit viability confirmed independently | yes |
| 3 · Aggregator | Threat-Modeling.com | References CVE-2026-47281 (VS Code vector claim) — unconfirmed vs MS | partial |
Decisions: treat the LPE variant as the primary risk (needs only a low-priv foothold); do not rely on the CVE (no official MS advisory/patch — CVE-2026-47281 is single-source); lead defenses with WDAC/AppLocker (the one control independently confirmed to stop the payload). Pack is keyed on behavior, not patch state.
Hunt Brief & Attack Chain
Working hypothesis: A standard-user process stages a reparse point (junction/symlink) in a user-writable directory and races Defender's file operation so that MsMpEng.exe (SYSTEM) writes/executes into an attacker-chosen path, after which a SYSTEM-integrity shell or payload runs.
| Step | Behavior | Telemetry | Hunt Angle |
|---|---|---|---|
| 1 · Foothold | Low-priv code execution (commodity malware / local user) | ProcessRollup2 | Baseline |
| 2 · Stage reparse | Create dir in %TEMP%/%LOCALAPPDATA%/ProgramData, flip to junction/symlink | Sysmon EID 11 | N1; proxy via protected-dir write |
| 3 · Trigger op | Induce Defender to scan/remediate crafted content during the race | — | Race invisible; detect the outcome |
| 4 · SYSTEM write | MsMpEng.exe follows the link, writes into System32/Program Files | PeFileWritten | Q3 |
| 5 · SYSTEM exec | Shell / payload runs at SYSTEM, parented by Defender engine | ProcessRollup2 | Q1 / Q2 / Q6 |
| RCE-A · Remote image | Victim mounts/opens crafted .vhd(x) from external SMB | NetworkConnectIP4; VHDMP log | Q4 + N2 |
| Post · Persist/spread | New local admin, service, or task with new SYSTEM rights | ServiceInstalled, ScheduledTaskRegistered | Containment §11 |
Affected surface & telemetry
| Surface | Required Telemetry | Priority | Gap Risk |
|---|---|---|---|
| Windows 10/11 workstations (fully patched) | Process lineage + command line (ProcessRollup2) | Critical | Low — standard sensor |
| Defender-engine file ops | PE write w/ writing-process context (PeFileWritten) | High | Medium — non-PE (junction) writes not captured |
| Reparse / junction creation | FileCreate w/ reparse attribute | Medium | High — needs Sysmon EID 11 |
| Remote SMB / VHD mount (RCE) | NetworkConnectIP4 445 + VHDMP log | Medium | Medium — route to native log |
Consolidated IOC Table
| Type | Value | Conf | Action | Context |
|---|---|---|---|---|
| Domain | projectnightcrawler.dev | medium | hunt | Nightmare Eclipse self-hosted exploit repo |
| Domain | deadeclipse666.blogspot.com | medium | hunt | Group blog / disclosure channel |
| Account | GitHub: MSNightmare | low | enrich | Historical repo host; likely removed |
| Behavior | MsMpEng.exe → cmd/powershell/conhost/cscript/wscript (SYSTEM) | high | detect | Primary signal — no benign equivalent |
| Behavior | MsMpEng.exe writing PE into \System32\ or \Program Files\ | high | detect | Redirected SYSTEM write outcome |
ATT&CK Mapping
| Tactic | Technique | Observed Behavior | Query / Control |
|---|---|---|---|
| Privilege Escalation | T1068 — Exploitation for Privilege Escalation | TOCTOU race in Defender engine yields SYSTEM | Q1, Q2, Q3, Q6 |
| PrivEsc / Defense Evasion | T1574 — Hijack Execution Flow | Junction/symlink redirects a privileged file op | Q3, Q6; N1 |
| Privilege Escalation | T1548 — Abuse Elevation Control Mechanism | Standard user obtains SYSTEM integrity | Q1, Q6 |
| Execution | T1059.001 / .003 — PowerShell / Windows Command Shell | SYSTEM shell spawned by Defender engine | Q1 |
| Lateral Movement | T1080 — Taint Shared Content | Crafted .vhd(x) / symlink on SMB share (RCE) | Q4; N2 |
| Execution | T1204.002 — User Execution: Malicious File | Victim opens remote disk image | Q4; N2 |
| Defense Evasion | T1211 — Exploitation for Defense Evasion | Subverts the AV product to gain trust/execution | WDAC/AppLocker §10 |
Native Audit-Log Hunts
| Hunt | Source | Logic | Response |
|---|---|---|---|
| N1 · Reparse point in temp | Sysmon EID 11 (FileCreate) | Junction/symlink creation in %TEMP%/%LOCALAPPDATA%/ProgramData preceding a Defender write | High-fidelity if Sysmon deployed; pairs with Q3 |
| N2 · Remote VHD/ISO mount | Microsoft-Windows-VHDMP/Operational | Disk-image attach where the backing file is a UNC/remote path or user-writable temp | Correlate with Q1/Q3; investigate mount source |
| N3 · Out-of-band Defender update | Get-MpComputerStatus / update history | Engine/platform version changes outside normal channel cadence | Confirm provenance; baseline expected versions |
| N4 · WDAC/AppLocker block | AppLocker/*, CodeIntegrity/Operational | Blocked execution of an unsigned SYSTEM binary from a user path | Confirms control working; investigate payload |
CrowdStrike LogScale CQL Hunt Queries
SyntheticProcessRollup2. Validate the Defender helper-exclusion list (Q2) per platform version. Do not run the live PoC in production — validate detections in a lab.Looks for: MsMpEng.exe as the parent of a shell or scripting host. Accomplishes: catches the moment of SYSTEM code execution — the flagship signal, no benign equivalent.
// HUNT: Defender engine spawning an interactive shell or script host // MITRE: T1068, T1059.001, T1059.003, T1548 | CONF: high FP: low COST: low // FP NOTES: Defender legitimately launches MpCmdRun.exe / MsMpEngCP.exe, never interactive shells #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/ | ParentBaseFileName=/^MsMpEng\.exe$/i | FileName=/^(cmd|powershell|powershell_ise|pwsh|conhost|cscript|wscript|mshta|rundll32|regsvr32)\.exe$/i | table([@timestamp, ComputerName, UserName, ParentBaseFileName, FileName, CommandLine, AuthenticationId, SHA256HashData], limit=200) | sort(@timestamp, order=desc)
Looks for: any child of MsMpEng.exe that is not a known Defender helper. FP: Defender helpers (MpCmdRun.exe, NisSrv.exe) — excluded; validate per platform version.
// HUNT: Anomalous child process of the Microsoft Defender engine // MITRE: T1068, T1574 | CONF: high FP: low-med COST: low // TUNING: exclude the known Defender helper set; alert on anything else parented by MsMpEng.exe #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/ | ParentBaseFileName=/^MsMpEng\.exe$/i | FileName!=/^(MpCmdRun|MsMpEngCP|NisSrv|MpDlpService|MsSense|SenseIR|SenseCncProxy|MpDefenderCoreService)\.exe$/i | table([@timestamp, ComputerName, UserName, FileName, ImageFileName, CommandLine, SHA256HashData], limit=200) | sort(@timestamp, order=desc)
Looks for: MsMpEng.exe as the writing process for a PE in System32/SysWOW64/Program Files. Accomplishes: catches the redirected SYSTEM write — the outcome of the junction race.
// HUNT: Defender engine writing a PE into a protected system directory // MITRE: T1574, T1068 | CONF: medium FP: low COST: low-med // FP NOTES: Defender writes signatures/platform binaries into its OWN dirs, excluded below #event_simpleName=/PeFileWritten|NewExecutableWritten/ | ContextBaseFileName=/^MsMpEng\.exe$/i | TargetFileName=/\\(System32|SysWOW64|Program Files( \(x86\))?)\\/i | TargetFileName!=/\\(Windows Defender|Microsoft\\Windows Defender|Microsoft\\Windows Security)\\/i | table([@timestamp, ComputerName, ContextBaseFileName, TargetFileName, SHA256HashData], limit=200)
Looks for: endpoints making SMB (TCP 445) connections to public IPs. FP: Azure Files / cloud SMB — exclude known cloud-SMB CIDRs.
// HUNT: Outbound SMB from an endpoint to an external (non-RFC1918) host // MITRE: T1021.002, T1080 | CONF: medium FP: medium COST: medium // TUNING: exclude RFC1918 + sanctioned cloud-SMB CIDRs; scope to workstation host groups #event_simpleName=NetworkConnectIP4 | RemotePort=445 | RemoteAddressIP4!=/^(10\.|192\.168\.|172\.(1[6-9]|2[0-9]|3[01])\.|169\.254\.|127\.)/ | table([@timestamp, ComputerName, ContextBaseFileName, LocalAddressIP4, RemoteAddressIP4, RemotePort], limit=200)
Looks for: resolution of the group's known exploit-hosting / disclosure domains. Investigate-only, perishable infrastructure.
// HUNT: DNS resolution of known Nightmare Eclipse / RoguePlanet infrastructure // MITRE: T1071 | CONF: high FP: low COST: low // FP NOTES: security researchers / sandboxes intentionally resolving the domains #event_simpleName=DnsRequest | DomainName=/(^|\.)projectnightcrawler\.dev$|(^|\.)deadeclipse666\.blogspot\.com$/i | table([@timestamp, ComputerName, ContextBaseFileName, DomainName], limit=200)
Looks for: a process running as SYSTEM (AuthenticationId 999) whose image sits in a user temp / ProgramData path. FP: SYSTEM-context installers from %TEMP% — pair with Q1/Q3 on same host.
// HUNT: SYSTEM-integrity process launched from a user-writable directory // MITRE: T1068, T1574, T1059 | CONF: low-med FP: medium COST: low-med // TUNING: correlate to Q1/Q3 on same aid; exclude known signed installer/update paths #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/ | AuthenticationId=999 | ImageFileName=/\\(Users\\[^\\]+\\AppData\\Local\\Temp|ProgramData)\\.+\.(exe|dll|scr)$/i | table([@timestamp, ComputerName, UserName, ImageFileName, CommandLine, ParentBaseFileName, SHA256HashData], limit=200)
CrowdStrike Custom IOA Recommendations
| IOA Name | Field Patterns | Benign Exclusions | Deployment Path |
|---|---|---|---|
| RoguePlanet — Defender engine spawns shell | Parent Image *\MsMpEng.exe; Child cmd/powershell/conhost/cscript/wscript/mshta.exe | None expected — promote high severity, Detect+Block | Endpoint Security → Custom IOA → Process Creation |
| RoguePlanet — Defender writes PE to System32 | Writing Image *\MsMpEng.exe; Target *\System32\* / *\Program Files\* excl. Defender dirs | Defender's own directories (excluded) | Custom IOA → File Write (or scheduled-search detect) |
Machine-Readable IOC Appendix
Grouped IOC Quick-Copy
One-click blocks for Falcon IOC Management, scheduled searches, or hardening audits. RoguePlanet is behavior-keyed — no payload hashes published; add per-incident IOCs to the CSV block.
type,value,action,severity,expiration,description,tags domain,projectnightcrawler.dev,detect,high,2026-09-12,RoguePlanet - Nightmare Eclipse exploit host,campaign:RoguePlanet domain,deadeclipse666.blogspot.com,detect,medium,2026-09-12,RoguePlanet - disclosure channel,campaign:RoguePlanet sha256,REPLACE_WITH_PAYLOAD_SHA256,prevent,critical,2027-06-12,RoguePlanet - SYSTEM payload,campaign:RoguePlanet
MsMpEng.exe spawns cmd/powershell/conhost/cscript/wscript at SYSTEM (flagship) MsMpEng.exe writes a PE into \System32 or \Program Files (redirected SYSTEM write) Junction/symlink (reparse point) created in %TEMP%/%LOCALAPPDATA%/ProgramData pre-Defender write SYSTEM-integrity process (AuthenticationId 999) executing from %TEMP%/ProgramData .vhd(x)/.iso mounted from a remote/UNC path (RCE variant precursor) Outbound SMB (TCP 445) from a workstation to a public IP
RoguePlanet # the exploit (Defender TOCTOU LPE/RCE) Nightmare Eclipse # disclosure group BlueHammer # predecessor, same junction-redirect primitive (CVE-2026-33825) RedSun # predecessor (Defender-targeted) MsMpEng.exe # Defender engine — abused SYSTEM writer CVE-2026-47281 # unconfirmed tracker reference (no official MS advisory)
# No vendor patch at time of writing — mitigate, don't remediate WDAC / AppLocker enforce # blocks the SYSTEM payload (ThreatLocker-confirmed) fsutil behavior set SymlinkEvaluation R2L:0 R2R:0 # remove remote-symlink primitive Block outbound SMB TCP 445/139 from workstations # kill remote .vhd(x) fetch Defender Tamper Protection ON; watch out-of-band engine version (N3) Disable std-user ISO/VHD auto-mount; restrict Virtual Disk service to admins
Hardening — Tiered & Deployable
No patch exists. The objective is to make the exploit fail-closed: stop the SYSTEM payload from running, and remove the redirection primitives.
- Application allowlisting (WDAC / AppLocker), enforce mode — M1038. Independently confirmed to block the RoguePlanet payload. Highest-leverage control. Deploy Audit → Enforce; do not blanket-allow %TEMP%/%ProgramData%.
- Disable remote symlink evaluation — M1042:
fsutil behavior set SymlinkEvaluation R2L:0 R2R:0(verify withfsutil behavior query SymlinkEvaluation). - Block outbound SMB (445/139) from workstations — M1037:
New-NetFirewallRule -DisplayName "Block Outbound SMB" -Direction Outbound -Action Block -Protocol TCP -RemotePort 445 -Profile Any. - Defender on current channel + Tamper Protection ON — M1054. Watch for out-of-band engine version changes (N3).
- Block standard-user disk-image mounting — M1042. Disable ISO/VHD auto-mount; restrict the Virtual Disk service to admins (
sc.exe sdset vds "D:(A;;CCLCSWRPWPDTLOCRRC;;;BA)(A;;CCLCSWLOCRRC;;;SY)"). - Attack Surface Reduction (ASR) — M1042. Enable prevalence/age/trusted-list execution block + script-host constraints.
- Remove standing local admin; deploy LAPS — M1026. Limits the value of a SYSTEM foothold.
- PowerShell Constrained Language Mode + script-block logging — M1038 / M1040. Raises cost of the SYSTEM shell; improves Q1 evidence.
- Enterprise WDAC signed-only code-integrity policy — M1045 / M1038.
- HVCI + Credential Guard — M1043. Contain blast radius if SYSTEM is reached.
- Continuous AV-tamper / config-drift monitoring — M1054. Alert on Defender engine self-modification fleet-wide.
Containment Runbook
| Phase | Actions | Owner | Evidence |
|---|---|---|---|
| Isolate | Network-contain the host in Falcon; do not power off (preserve volatile SYSTEM-shell state) | SOC L2 | Containment timestamp; Q1 event |
| Triage | Pull the MsMpEng.exe child-process tree; capture the SYSTEM shell command line and any written PE in System32/Program Files | SOC L2 | Process tree; Q1/Q3 rows |
| Eradicate | Kill SYSTEM payload; remove planted binaries; delete staged junctions; check for new local admin, service, or task created post-escalation | IR | Service/task/group review |
| Recover | Rotate credentials for every account used on the host; verify Defender config/Tamper Protection intact; re-image if SYSTEM execution confirmed | IR + IT | Cred-rotation log; rebuild ticket |
| Harden | Push §10 Immediate controls fleet-wide; promote Q1 IOA | Detection Eng | WDAC/AppLocker status; IOA enabled |
Detection Coverage Map & Validation
| Technique | Behavior | CQL | IOA | Coverage |
|---|---|---|---|---|
| T1068 / T1059 | SYSTEM shell from Defender engine | Q1, Q2 | IOA-1 | Good |
| T1574 | Redirected SYSTEM write to System32 | Q3, Q6 | IOA-2 | Good |
| T1574 | Reparse/junction staging | — | — | GAP needs Sysmon EID 11 (N1) |
| T1080 / T1204.002 | Remote VHD/SMB fetch (RCE) | Q4 | — | Partial VHDMP log (N2) |
| T1071 | Nightmare Eclipse infra contact | Q5 | — | Good perishable |
| — | Defender engine version tampering | — | — | GAP manual Get-MpComputerStatus (N3) |
Validation gates: (1) confirm ProcessRollup2 + PeFileWritten context fleet-wide; (2) Q1 returns zero hits in a 30-day benign lookback before promotion; (3) lab-validate lineage firing with a benign parent-spoof harness — never the live PoC; (4) promote Q1 to Custom IOA Detect+Block, keep Q4/Q6 as scheduled hunts (target FP < 1/week).
Hunt Summary Ticket
TITLE: Hunt — RoguePlanet (Microsoft Defender SYSTEM Escalation Zero-Day)
SEVERITY: High (public PoC, no patch; SYSTEM on fully-patched Win10/11)
SCOPE: Windows 10/11 endpoints (fully patched); Server lower-priority
HYPOTHESIS: Standard-user process redirects a Defender (SYSTEM) file op via NTFS
junction/symlink -> SYSTEM code exec. Evidence = Defender-engine-parented
shells + SYSTEM writes into protected dirs.
QUERIES RUN: Q1 Defender->shell (IOA) | Q2 anomalous child | Q3 PE write to System32 |
Q4 outbound SMB | Q5 infra DNS | Q6 SYSTEM exec from user path
+ Native N1-N4 (reparse EID11, VHDMP, Defender version, AppLocker block)
DO FIRST: Q1, Q3 — escalate any hit immediately
FINDINGS: <pending analyst execution>
GAPS: Reparse-point + VHD mount telemetry weak in EDR; no CVE/patch
ACTIONS: WDAC/AppLocker enforce; disable remote symlink eval; block outbound SMB;
promote Q1 to Custom IOA Detect+Block
OWNER: HuntPack
VERSION: v0.2 - 2026-06-12
Changelog
table() calls now carry an explicit row limit: the default is 200 and truncation is silent, so a capped result was indistinguishable from a complete one. Atomic-IOC sweeps (filters over 5+ hashes or C2 IPs) use limit=max so a wide infection is never silently under-scoped; behavioural hunts use limit=200, where exceeding the cap indicates the query needs tuning. Where present, event names that do not exist in the Falcon data model were corrected (e.g. ServiceInstalled is a Sysmon concept, not a Falcon event; ElfFileWritten is ELFFileWritten) — such queries could never return a row. No detection logic, fields, or IOCs changed.References
| Tier | Source | Used For |
|---|---|---|
| 1 | Picus Security — RoguePlanet anatomy | Mechanism, IOCs, detection logic, mitigations |
| 1 | BleepingComputer — RoguePlanet grants SYSTEM | RCE→LPE pivot, affected builds, MS response |
| 2 | The Hacker News — Defender RoguePlanet zero-day | Corroboration, release timing |
| 2 | SecurityWeek — RoguePlanet released · ThreatLocker — allowlisting efficacy | Corroboration; control validation |
| 3 | Threat-Modeling.com | Unconfirmed CVE-2026-47281 reference |
HuntPack v0.1 · RoguePlanet · Generated 2026-06-12 · Defensive use only — no exploit code. Validate field names and tune exclusions in your tenant before promoting any query to alerting. No official Microsoft patch at time of writing.