Resumen ejecutivo#
RoguePlanet (CVE-2026-50656) es una escalada local a SYSTEM en Microsoft Defender que, a fecha de este post, sigue sin parche (Microsoft confirmó el fallo y dijo que el fix está en desarrollo). A diferencia de BlueHammer/RedSun, Microsoft no ha reportado explotación in-the-wild: por ahora es un PoC público, aunque el índice de explotabilidad de Microsoft lo marca como “Exploitation More Likely”.
Es la cuarta pieza de la campaña que ataca a Defender y confirma la tesis de toda la serie: el actor no depende de un CVE, depende de una clase de vulnerabilidad. Parcheado BlueHammer, apareció RedSun; endurecida la remediación, apareció RoguePlanet por el pipeline de cuarentena. El mismo primitive —TOCTOU con oplock + junction— por una puerta nueva.
(Actualización, 7-jul-2026: sigue sin parche. Microsoft mantiene el fix “en desarrollo” sin fecha pública, y se espera que llegue en el Patch Tuesday del 14 de julio o en un OOB antes —los precedentes de esta campaña (RedSun, UnDefend) fueron OOB, así que conviene no descartarlo—. Sigue sin explotación in-the-wild confirmada por Microsoft; continúa validado contra Windows 10/11 totalmente parcheados (June 2026). Dato de color con peso defensivo: RoguePlanet fue la pieza que “drenó” al actor —lo llevó a cancelar la divulgación masiva que había amenazado para el 14 de julio—. Es decir, la complejidad de este bug compró tiempo tanto a Microsoft como a los defensores. Mientras tanto, la detección comportamental de abajo sigue siendo el único control real.)
Mecanismo (nivel conceptual)#
RoguePlanet encadena varios primitives legítimos de Windows. Cyderes lo resume bien: “abusa del pipeline de escaneo en tiempo real y cuarentena de Defender, junctions de directorio NTFS, oplocks, Volume Shadow Copy y la tarea programada QueueReporting de Windows Error Reporting.”
- La brecha TOCTOU. El bug vive en el hueco entre cuando Defender crea un artefacto de cuarentena y cuando valida dónde aterrizó realmente. No es corrupción de memoria y no requiere privilegios para iniciarse.
- La ventana determinista. Los oplocks pausan a Defender en el instante preciso; los junctions NTFS redirigen dónde se escribe. Así, una carrera probabilística se vuelve una ventana determinista.
- El disparo final vía WER. El exploit construye una estructura de directorios que imita
System32y convierte el directorio de trabajo en un junction haciaC:\Windows, de modo que la ruta se vuelve transparentemente idéntica aC:\Windows\System32\wermgr.exe. Luego usa el Task Scheduler para lanzar la tareaQueueReportingde Windows Error Reporting —que corre como SYSTEM— y termina ejecutando suwermgr.exesuplantado.
Requiere solo que la protección en tiempo real de Defender esté activa y que la infraestructura de tareas de WER esté presente (lo está por defecto).
flowchart TD
A["Usuario sin privilegios"] --> B["Dispara escaneo/cuarentena de Defender (RTP activa)"]
B --> C["Oplock congela la operación en el punto crítico"]
C --> D["Junction: dir de trabajo → C:\\Windows
ruta ≡ C:\\Windows\\System32\\wermgr.exe"]
D --> E["Task Scheduler lanza QueueReporting (WER, SYSTEM)"]
E --> F["Ejecuta wermgr.exe suplantado → shell SYSTEM"]Lo que el mecanismo deja ver (analizado en laboratorio)#
Analizado el PoC público en un entorno aislado —a nivel de qué observa un defensor, no de cómo se arma—, la cadena imprime una huella de telemetría bastante nítida, y más resiliente que los nombres de fichero o el named pipe. Cuatro artefactos de comportamiento destacan:
- El PoC conduce al propio motor de Defender. Para forzar la cuarentena que luego secuestra, carga
MpClient.dlldesde el directorio de instalación de Defender y llama a su API de gestión (MpManagerOpen→MpScanStart→MpScanResult→MpThreatOpen/MpThreatEnumerate→MpCleanOpen/MpCleanStart). Un proceso ajeno a Defender que cargaMpClient.dlly dispara un scan+clean programático es una anomalía muy pocas veces benigna. - El disparador de la cuarentena es un EICAR disfrazado. El fichero que se hace detectar es un EICAR (
Virus:DOS/EICAR_Test_File) escrito con el nombrewermgr.exedentro de un directorio temporal del usuario. La combinación «EICAR + nombrewermgr.exe+ ruta%TEMP%» prácticamente no ocurre por accidente. - Se monta una imagen ISO desde
%TEMP%. El PoC escribe un.isoembebido en%TEMP%\RP_<GUID>y lo adjunta con VirtDisk (OpenVirtualDisk/AttachVirtualDisk, sin letra de unidad). El README del autor lo confirma sin querer: no funciona en Windows Server porque un usuario estándar no puede montar una ISO ahí —montarla en cliente es justo la condición. - La ejecución final es una tarea WER lanzada a mano. El paso a SYSTEM es un
Run()on-demand de la tarea\Microsoft\Windows\Windows Error Reporting\QueueReportingdesde un token de usuario interactivo. Esa tarea normalmente la dispara el sistema; un arranque manual por un usuario, justo antes de que aparezca un proceso SYSTEM, es un artefacto estable y de alta fidelidad.
Estos cuatro son la base de las señales de abajo. Ninguno depende del nombre RoguePlanet.
Por qué el allowlisting por ruta no basta (y qué sí)#
El borrador del que partí citaba “WDAC en modo enforced” como el único control preventivo validado. Hay que matizarlo, porque es importante: RoguePlanet suplanta la ruta de wermgr.exe vía junction, haciendo que un binario atacante parezca estar en System32. Un allowlisting basado en ruta puede ser engañado por esa suplantación. Conclusión práctica:
- WDAC/AppLocker sí ayuda, pero con reglas de publisher/hash, no de ruta. Una política que confíe en “cualquier cosa en System32” es precisamente lo que el junction ataca.
- Cyderes, de hecho, no apuesta por allowlisting como control primario sino por detección comportamental contra los TTPs. Sin parche, esa es la primera línea.
Un allowlisting por ruta confía en que un binario es lo que su ubicación dice que es. RoguePlanet gana precisamente ahí: hace que lo ajeno parezca estar en System32 y deja que el sistema confíe en el nombre en vez de en la cosa. Es el mismo error de contabilidad de siempre — validar la etiqueta y no el contenido. Y como no hay parche, la lección se vuelve práctica: no se puede impedir que ocurra, así que la pregunta deja de ser “¿cómo lo bloqueo?” y pasa a ser “¿qué se ve cuando ocurra?”. Un proceso que promete una ruta y escribe en otra siempre deja una sombra: un hijo que no debería existir, un
wermgr.exedonde no vive. Esa sombra es lo único que no se puede renombrar.
Ingeniería de detección (el control real aquí)#
Sin parche, la detección comportamental es la defensa. Estas señales están ordenadas de más a menos robusta; las dos primeras salieron del análisis del PoC real y son las de mayor rédito, porque cazan pasos que el atacante no puede renombrar.
1. MpClient.dll cargado por un proceso ajeno a Defender (muy alta)#
El PoC no espera a que Defender detecte algo: conduce al propio motor para forzar la cuarentena. Carga MpClient.dll (la biblioteca cliente del servicio antimalware) desde el directorio de instalación de Defender y encadena su API de gestión —MpManagerOpen, MpScanStart, MpScanResult, MpThreatOpen/MpThreatEnumerate, MpCleanOpen/MpCleanStart—. Fuera de los binarios de Defender (MsMpEng.exe, MpCmdRun.exe, NisSrv.exe) casi nada carga esa DLL, y menos aún llama a MpScanStart/MpCleanStart. Cázalo con la carga de módulo (Sysmon EventID 7):
title: RoguePlanet — MpClient.dll cargado por proceso no-Defender
id: ne-rp-002-mpclient-load
status: experimental
description: >
Proceso ajeno a Defender que carga MpClient.dll para conducir el motor
antimalware (MpScanStart/MpCleanStart). Señal comportamental de RoguePlanet
(CVE-2026-50656): fuerza la cuarentena que luego secuestra.
references:
- https://www.cyderes.com/howler-cell/rogueplanet-windows-zero-day
author: Serie Nightmare Eclipse — detección defensiva
date: 2026-07-08
tags:
- attack.privilege_escalation
- attack.t1068
- attack.defense_evasion
logsource:
product: windows
category: image_load
detection:
selection:
ImageLoaded|endswith: '\MpClient.dll'
filter_defender:
Image|endswith:
- '\MsMpEng.exe'
- '\MpCmdRun.exe'
- '\NisSrv.exe'
- '\MpDefenderCoreService.exe'
condition: selection and not filter_defender
falsepositives:
- Herramientas de administración/EDR que instrumenten Defender. Validar baseline.
level: high
2. QueueReporting ejecutada on-demand por un usuario interactivo (muy alta)#
El salto final a SYSTEM es un arranque manual de la tarea \Microsoft\Windows\Windows Error Reporting\QueueReporting. Esa tarea normalmente la dispara el sistema tras un fallo; un Run() on-demand originado por un token de usuario, e inmediatamente seguido de un proceso wermgr.exe SYSTEM, es un artefacto muy estable —independiente del nombre del PoC—. El log operativo del Task Scheduler lo registra:
// KQL — QueueReporting lanzada a mano y seguida de wermgr SYSTEM
DeviceEvents
| where Timestamp > ago(24h)
| where ActionType == "ScheduledTaskExecuted" or ActionType == "ScheduledTaskStarted"
| where AdditionalFields has "QueueReporting"
| where InitiatingProcessAccountName !in ("system","local service","network service")
| project Timestamp, DeviceName, InitiatingProcessFileName,
InitiatingProcessAccountName, AdditionalFields
En el canal Microsoft-Windows-TaskScheduler/Operational, la señal equivalente es un EventID 119/100/200 para \Microsoft\Windows\Windows Error Reporting\QueueReporting cuyo contexto de usuario no sea SYSTEM.
3. wermgr.exe ejecutado desde una ruta no estándar (alta confianza)#
wermgr.exe legítimo vive en System32/SysWOW64. Cázalo cuando se escribe o ejecuta desde cualquier otra ruta:
DeviceProcessEvents
| where Timestamp > ago(24h)
| where FileName =~ "wermgr.exe"
| where not(FolderPath has_any (@"\Windows\System32\", @"\Windows\SysWOW64\"))
| project Timestamp, DeviceName, FolderPath, ProcessCommandLine,
InitiatingProcessFileName, AccountName
4. Shell / conhost anómalo desde contexto SYSTEM (alta)#
El PoC deja un patrón peculiar: conhost.exe con padre de integridad SYSTEM inyectado en la sesión de usuario, sin cmd.exe en el árbol. Complementa la regla de la pieza BlueHammer (shell hijo de MsMpEng.exe).
title: RoguePlanet — conhost/shell anómalo de contexto SYSTEM
id: ne-rp-001-system-conhost
status: experimental
description: >
conhost.exe con padre SYSTEM en sesión de usuario sin cmd.exe en el árbol,
o shell hijo de MsMpEng.exe. Artefacto de RoguePlanet (CVE-2026-50656).
Comportamental: no depende del nombre del named pipe del PoC.
references:
- https://www.cyderes.com/howler-cell/rogueplanet-windows-zero-day
author: Serie Nightmare Eclipse — detección defensiva
date: 2026-07-05
tags:
- attack.privilege_escalation
- attack.t1068
- attack.t1053.005
logsource:
product: windows
service: sysmon
detection:
msmpeng_child:
EventID: 1
ParentImage|endswith: '\MsMpEng.exe'
Image|endswith: ['\cmd.exe', '\powershell.exe', '\conhost.exe']
wermgr_offpath:
EventID: 1
Image|endswith: '\wermgr.exe'
Image|contains: '\Temp\'
condition: msmpeng_child or wermgr_offpath
falsepositives:
- Bajo. Validar contra baseline.
level: high
5. Montaje de imagen ISO desde %TEMP% por un usuario estándar (media-alta)#
El PoC monta un .iso embebido para fabricar una copia limpia de wermgr.exe que Defender no marca. Un usuario estándar que escribe un .iso en %TEMP% y lo adjunta (VirtDisk) es infrecuente y precede a la carrera. El canal Microsoft-Windows-VHDMP-Operational registra el surface attach; en EDR, la escritura de un .iso en un perfil de usuario seguida de su montaje es la correlación a cazar.
// KQL — .iso creado en un perfil de usuario y luego montado
DeviceFileEvents
| where Timestamp > ago(24h)
| where FileName endswith ".iso"
| where FolderPath has_any (@"\AppData\Local\Temp\", @"\Users\")
| where InitiatingProcessAccountName !in ("system","local service","network service")
| project Timestamp, DeviceName, FolderPath, FileName,
InitiatingProcessFileName, InitiatingProcessAccountName
6. Cuarentena de EICAR sobre un fichero llamado wermgr.exe en temp de usuario (media)#
El gatillo de la carrera es un EICAR (Virus:DOS/EICAR_Test_File) escrito con el nombre wermgr.exe dentro de un directorio temporal del usuario. La detección de EICAR es rutinaria (pruebas de AV); lo anómalo es la combinación: detección de EICAR cuyo fichero se llama wermgr.exe y vive bajo %TEMP%/perfil de usuario. Correlaciona los eventos de Defender 1116/1117 por nombre y ruta.
7. Enumeración de Volume Shadow Copy desde espacio de usuario (media)#
Llamadas inusuales tipo NtQueryDirectoryObject contra dispositivos HarddiskVolumeShadowCopy desde user-space —seguidas de un oplock (FSCTL_REQUEST_OPLOCK) sobre una ruta de shadow copy— son parte del patrón: así el PoC congela a Defender en el punto crítico.
8. El named pipe del PoC (baja — solo cosmético)#
\\.\pipe\RoguePlanet existe durante toda la ejecución del PoC como canal de señal de éxito. Es un artefacto del PoC público, no un IoC de intrusión real, y se renombra en un segundo. Úsalo para detectar el PoC tal cual, jamás como control primario.
DeviceEvents
| where ActionType == "NamedPipeEvent"
| where AdditionalFields has "RoguePlanet"
| project Timestamp, DeviceName, InitiatingProcessFileName,
InitiatingProcessAccountName, AdditionalFields
9. YARA — triaje del binario (complementaria, no control primario)#
Estas reglas cazan ficheros en reposo, y por eso son el eslabón más frágil: el actor recompila y renombra en minutos. Sirven para triaje de una muestra (una descarga, un adjunto, un artefacto de sandbox), nunca como defensa. La primera recopila cadenas verificadas del binario del PoC público —extraídas del ejecutable, no de nombres reportados—; entre ellas, un artefacto forense involuntario: la ruta del PDB delató el nombre interno del proyecto, ScanMan. El author refleja quién las recopiló, no autoría de técnica.
/* RECOPILACIÓN, no autoría. Cadenas verificadas del ejecutable del PoC público
de RoguePlanet (analizado en laboratorio). Firma FRÁGIL/de conveniencia: un
solo cambio la evade. Úsese para triaje, jamás como control primario. */
rule NightmareEclipse_RoguePlanet_PoC
{
meta:
author = "dust115 — recopilación (fennek.org)"
description = "Cadenas del ejecutable del PoC público RoguePlanet (CVE-2026-50656)"
source = "artefactos del binario del PoC público analizado en laboratorio"
confidence = "low — IoC frágil, renombrable; complementario"
strings:
$pdb = "ScanMan\\x64\\Release\\RoguePlanet.pdb" ascii
$pipe = "\\\\.\\pipe\\RoguePlanet" wide // artefacto de PoC, NO IoC de intrusión real
$ads = ":WDFOO" wide // ADS que el PoC crea sobre el wermgr señuelo
$tmp = "\\??\\%TEMP%\\RP_" wide // prefijo del dir/ISO temporal
$wd = "wdtest_temp" wide
$ok = "Exploit succeeded." ascii
condition:
uint16(0) == 0x5A4D and 2 of them
}
import "pe"
/* ADAPTACIÓN de un patrón público, no técnica propia. */
rule Suspicious_Unsigned_Wermgr
{
meta:
author = "dust115 — adaptación (fennek.org)"
description = "wermgr.exe sin firma Authenticode — posible suplantación WER (T1036)"
credit = "patrón público: cf. signature-base APT_HAFNIUM_ForensicArtefacts_WER (Nextron/F. Roth)"
confidence = "medium — requiere triaje de ruta y firma"
condition:
pe.is_pe
and (pe.version_info["OriginalFilename"] == "wermgr.exe"
or pe.version_info["InternalName"] == "wermgr.exe")
and pe.number_of_signatures == 0
}
Mitigación (sin parche a 2026-07-01)#
| Control | Detalle |
|---|---|
| Detección comportamental | Primera línea: reglas #1 y #2 de arriba. Es el control real mientras no hay parche |
| WDAC/AppLocker por publisher/hash | Ayuda, pero no confíes en reglas basadas en ruta (el junction las burla) |
| Vigilar wermgr.exe fuera de System32 | Escritura o ejecución desde rutas no estándar = alta prioridad |
| Reducir cuentas con logon interactivo local | Menos superficie para iniciar la carrera |
| Aplicar el parche en cuanto salga | Microsoft lo tiene en desarrollo; priorízalo |
MITRE ATT&CK#
| Táctica | Técnica |
|---|---|
| Privilege Escalation | T1068 — Exploitation for Privilege Escalation |
| Execution / PrivEsc | T1053.005 — Scheduled Task/Job (QueueReporting de WER, lanzada on-demand) |
| Defense Evasion | T1036 — Masquerading (wermgr.exe suplantado vía junction) |
| Defense Evasion | T1553.005 — Subvert Trust Controls: bypass vía contenedor montable (ISO) |
| Defense Evasion | T1564.004 — Hide Artifacts: NTFS ADS (:WDFOO sobre el señuelo) |
Referencias#
- Cyderes — RoguePlanet: Windows Zero-Day Weaponizes Defender Quarantine Pipeline: https://www.cyderes.com/howler-cell/rogueplanet-windows-zero-day
- Picus — RoguePlanet: Anatomy of the Nightmare Eclipse Defender Zero-Day: https://www.picussecurity.com/resource/blog/rogueplanet-anatomy-of-the-nightmare-eclipse-microsoft-defender-zero-day
- Help Net Security — Microsoft working on patch for RoguePlanet (CVE-2026-50656): https://www.helpnetsecurity.com/2026/06/17/rogueplanet-zero-day-cve-2026-50656/
- The Hacker News — Microsoft Confirms RoguePlanet Defender Zero-Day: https://thehackernews.com/2026/06/microsoft-confirms-rogueplanet-defender_02022423645.html
- NVD — CVE-2026-50656: https://nvd.nist.gov/vuln/detail/CVE-2026-50656
- (act. 7-jul) BleepingComputer — Microsoft working on Defender patch for RoguePlanet zero-day: https://www.bleepingcomputer.com/news/microsoft/microsoft-working-on-defender-patch-for-rogueplanet-zero-day/
- (act. 7-jul) BleepingComputer (foro) — Nightmare Eclipse’s mass zeroday reveal on July 14 is off the table: https://www.bleepingcomputer.com/forums/t/816627/nightmare-eclipses-mass-zeroday-reveal-on-july-14-is-off-the-table/