Windows Kernel Exploitation: Lo que Todo Analista de Malware Debe Saber
Introducción a la explotación del kernel de Windows desde la perspectiva del analista de malware. Arquitectura del kernel, tipos de vulnerabilidades (UAF, overflow, type confusion), mitigaciones (SMEP, SMAP, kCFG, VBS), y cómo analizar exploits de kernel en muestras reales.
El kernel como objetivo final
El kernel de Windows es el último bastión de seguridad. Todo lo que ocurre en user-mode (ring 3) está sujeto a restricciones: permisos de archivo, tokens de acceso, integridad de procesos. Pero el código que se ejecuta en kernel-mode (ring 0) tiene acceso absoluto: puede leer y escribir cualquier byte de memoria, manipular cualquier estructura del sistema, y ejecutar cualquier instrucción del procesador.
Para un atacante, llegar al kernel significa control total. Para un defensor, entender cómo se llega allí es necesario para evaluar el riesgo de vulnerabilidades, priorizar parches, y comprender las capacidades del malware más avanzado.
Este artículo no es un tutorial de escritura de exploits. Es una guía para analistas de malware que necesitan entender las técnicas de explotación del kernel cuando las encuentran en muestras reales.
Arquitectura del kernel de Windows
Rings de privilegio
Ring 3 (User Mode)
├── Aplicaciones normales (.exe)
├── DLLs de Windows (kernel32.dll, ntdll.dll)
├── Servicios de Windows
└── Procesos de seguridad (AV, EDR user-mode component)
Ring 0 (Kernel Mode)
├── ntoskrnl.exe (kernel ejecutivo)
├── HAL (Hardware Abstraction Layer)
├── Drivers del sistema (ntfs.sys, tcpip.sys)
├── Drivers de terceros (AV, EDR kernel component)
└── Win32k.sys (subsistema gráfico del kernel)
Ring -1 (Hypervisor, si VBS está activo)
├── Secure Kernel (securekernel.exe)
├── Credential Guard
└── HVCI
Componentes del kernel relevantes para exploits
| Componente | Función | Vulnerabilidades comunes |
|---|---|---|
| ntoskrnl.exe | Kernel ejecutivo principal | Raro: muy auditado |
| Win32k.sys | Subsistema gráfico (GDI, USER) | Muy frecuente: superficie de ataque enorme |
| NTFS.sys | Sistema de archivos | Ocasional |
| AFD.sys | Ancillary Function Driver (Winsock) | Ocasional |
| Drivers de terceros | Variable | Muy frecuente: menor auditoría |
| clfs.sys | Common Log File System | Múltiples CVEs recientes |
Win32k.sys: el target preferido
Win32k.sys es el subsistema gráfico del kernel de Windows. Maneja ventanas, menús, cursores, objetos GDI (bitmaps, brushes, fonts) y callbacks entre kernel y user-mode. Es el componente del kernel con más vulnerabilidades históricas por varias razones:
- Superficie de ataque enorme: miles de syscalls accesibles desde user-mode
- Código legacy: originalmente diseñado cuando la seguridad no era prioridad
- Callbacks a user-mode: el kernel llama a funciones en user-mode (user-mode callbacks), creando oportunidades para race conditions y UAF
- Objetos complejos: GDI objects con reference counting manual, propensos a UAF
Tipos de vulnerabilidades del kernel
Use-After-Free (UAF)
La vulnerabilidad más explotada en el kernel moderno:
1. Se crea un objeto del kernel (ej. un bitmap GDI)
2. Se obtiene una referencia al objeto
3. El objeto se libera (free) pero la referencia sigue existiendo (dangling pointer)
4. Se crea un nuevo objeto que ocupa la misma memoria liberada
5. Se usa la referencia antigua (use-after-free)
6. El atacante controla el contenido del nuevo objeto, manipulando lo que la referencia antigua "ve"
Ejemplo real: CVE-2021-1732 (Win32k UAF), explotado in the wild por BITTER APT. Usaba un UAF en el manejo de objetos USER de Win32k para obtener escalada de privilegios local.
Integer Overflow / Buffer Overflow
Un overflow en el cálculo de tamaño de un buffer resulta en un buffer más pequeño de lo esperado. Cuando se copian datos al buffer, se sobrescriben datos adyacentes en el kernel pool.
Type Confusion
El kernel trata un objeto como si fuera de un tipo diferente, permitiendo al atacante acceder a campos que no debería:
Objeto A (tipo Bitmap): [header][width][height][pixels_ptr]
Objeto B (tipo Palette): [header][size][entries_ptr][flags]
Si el kernel confunde A con B:
Leer "entries_ptr" del objeto devuelve "pixels_ptr" del bitmap
→ Permite leer/escribir memoria arbitraria via el bitmap
Race Conditions
Condiciones de carrera entre threads del kernel o entre kernel y user-mode:
Thread 1 (kernel): verifica que un puntero es valido
--- context switch ---
Thread 2 (user): modifica el puntero para apuntar a otra ubicacion
--- context switch ---
Thread 1 (kernel): usa el puntero (que ahora apunta a ubicacion controlada por atacante)
Técnicas de explotación del kernel
Token stealing (la técnica más importante)
El objetivo más común de un kernel exploit es robar el token de SYSTEM:
1. El exploit obtiene read/write arbitrario en kernel memory
2. Lee la estructura EPROCESS del proceso actual
3. Navega a la lista de procesos para encontrar el proceso System (PID 4)
4. Lee el TOKEN del proceso System
5. Copia el TOKEN de System al EPROCESS del proceso del atacante
6. El proceso del atacante ahora ejecuta como SYSTEM
Estructuras relevantes:
EPROCESS (estructura de proceso en kernel)
├── UniqueProcessId (PID)
├── ActiveProcessLinks (lista doblemente enlazada de procesos)
├── Token (puntero al TOKEN de seguridad)
└── Protection (PPL level)
TOKEN (token de seguridad)
├── Privileges (privilegios habilitados)
├── UserAndGroups (SIDs del usuario y grupos)
└── IntegrityLevelSid (nivel de integridad)
Offsets por versión de Windows
Los offsets de campos en EPROCESS y TOKEN cambian entre versiones de Windows. El exploit necesita detectar la versión y usar los offsets correctos:
| Campo | Windows 10 1903 (x64) | Windows 11 22H2 (x64) |
|---|---|---|
| EPROCESS.UniqueProcessId | 0x440 | 0x440 |
| EPROCESS.ActiveProcessLinks | 0x448 | 0x448 |
| EPROCESS.Token | 0x4B8 | 0x4B8 |
| EPROCESS.Protection | 0x87A | 0x87A |
Los offsets pueden cambiar con actualizaciones menores. El malware que explota el kernel típicamente incluye tablas de offsets para múltiples versiones de Windows.
Mitigaciones del kernel
Evolución de mitigaciones
| Mitigación | Windows versión | Protección |
|---|---|---|
| DEP/NX | XP SP2+ | No ejecución de datos en kernel memory |
| kASLR | Vista+ | Randomización del base address del kernel |
| SMEP | 8+ (hardware) | Kernel no puede ejecutar código de páginas user-mode |
| SMAP | 10+ (hardware) | Kernel no puede leer datos de páginas user-mode |
| kCFG | 10 1703+ | Control Flow Guard para código del kernel |
| VBS | 10 1607+ | Hypervisor protege kernel memory |
| HVCI | 10 1709+ | Hypervisor valida integridad de código del kernel |
| kASLR improvements | Continuo | Mejor randomización, menos info leaks |
| Arbitrary Code Guard | 10+ | Bloquea código generado dinámicamente |
SMEP y SMAP
SMEP (Supervisor Mode Execution Prevention): feature del procesador que impide que código ejecutándose en kernel mode (ring 0) ejecute instrucciones en páginas marcadas como user-mode. Esto bloquea la técnica clásica de "poner shellcode en user-mode y saltar a él desde el kernel".
SMAP (Supervisor Mode Access Prevention): similar pero para lectura/escritura. El kernel no puede leer datos de páginas user-mode sin desactivar temporalmente SMAP.
VBS y Secure Kernel
Virtualization-Based Security usa el hypervisor de Windows para crear un entorno aislado (Secure World) donde se ejecuta un Secure Kernel. Las protecciones de VBS no pueden bypassearse desde el kernel normal:
- Credential Guard: las credenciales (NTLM hashes, Kerberos tickets) se almacenan en el Secure Kernel. Un kernel exploit en el kernel normal no puede acceder a ellas
- HVCI: el hypervisor verifica que el código del kernel es legítimo antes de permitir su ejecución. Bloquea modificación de código del kernel y carga de drivers no firmados
Indicadores de kernel exploitation en malware
En el análisis estático
| Indicador | API/Pattern | Significado |
|---|---|---|
DeviceIoControl | kernel32.dll | Comunicación con driver (posible BYOVD) |
NtQuerySystemInformation | ntdll.dll | Info leak del kernel (obtener base address) |
NtDuplicateToken | ntdll.dll | Manipulación de tokens |
AdjustTokenPrivileges con SeDebugPrivilege | advapi32.dll | Preparación para escalada |
| Offsets hardcodeados | Constantes numéricas (0x4B8, 0x440) | Offsets de EPROCESS fields |
| Version checks | GetVersionEx, RtlGetVersion | Seleccionar offsets por versión |
| Shellcode con token stealing | Pattern: read KTHREAD → EPROCESS → Token | Shellcode de kernel exploit |
En análisis dinámico
| Indicador | Herramienta |
|---|---|
| BSOD (Blue Screen of Death) | Exploit fallido: el kernel crasheó |
| Proceso que cambia de token repentinamente | Process Hacker: token changes |
| Driver nuevo cargado antes de la escalada | Sysmon Event ID 6 |
| NtQuerySystemInformation con clase SystemModuleInformation | API Monitor |
CVEs del kernel explotados in-the-wild
| CVE | Componente | Tipo | Explotado por | Año |
|---|---|---|---|---|
| CVE-2021-1732 | Win32k | UAF | BITTER APT | 2021 |
| CVE-2021-40449 | Win32k | UAF | MysterySnail (APT) | 2021 |
| CVE-2022-21882 | Win32k | UAF | In-the-wild | 2022 |
| CVE-2023-28252 | clfs.sys | Elevation of privilege | Nokoyawa ransomware | 2023 |
| CVE-2023-36802 | MSKSSRV.sys | Proxy | In-the-wild | 2023 |
| CVE-2024-21338 | AppLocker | Kernel elevation | Lazarus Group | 2024 |
| CVE-2024-30088 | Win32k | UAF | In-the-wild | 2024 |
CVE-2023-28252: ransomware explotando el kernel
Caso notable: el grupo Nokoyawa ransomware explotó CVE-2023-28252 (vulnerabilidad en clfs.sys, Common Log File System) como zero-day para escalada de privilegios. Fue descubierto por Kaspersky. Es uno de los pocos casos documentados de un grupo de ransomware usando un zero-day del kernel (la mayoría usa BYOVD que es más simple).
Para el analista: qué hacer cuando encuentras un kernel exploit
- Identificar el CVE: buscar offsets, constantes y patterns en bases de datos de exploits
- Determinar el vector: ¿es un exploit directo del kernel o BYOVD?
- Verificar si está parcheado: comprobar si el parche de Microsoft está aplicado en los sistemas afectados
- Evaluar el impacto: ¿qué capacidades obtiene el atacante? (LPE, PPL bypass, rootkit)
- Documentar IOCs: hashes del exploit, del driver vulnerable (si BYOVD), offsets usados
- Recomendar mitigaciones: parchear, habilitar HVCI/VBS, actualizar driver blocklist
Mapeo MITRE ATT&CK
| Técnica | ID | Contexto kernel |
|---|---|---|
| Exploitation for Privilege Escalation | T1068 | Exploit de vulnerabilidad del kernel |
| Rootkit | T1014 | Instalación de rootkit post-exploit |
| Access Token Manipulation | T1134 | Token stealing tras kernel exploit |
| Impair Defenses | T1562 | Desactivar EDR desde kernel |
Fuentes y referencias
- Yosifovich, P. "Windows Kernel Programming." 2023.
- Russinovich, M. et al. "Windows Internals Part 1." Microsoft Press, 2017.
- Microsoft. "Kernel Security Mitigations." Microsoft Docs.
- Kaspersky. "CVE-2023-28252: Nokoyawa Ransomware Kernel Exploit." Kaspersky GReAT, 2023.
- Project Zero. "Windows Kernel Exploitation." Google Project Zero Blog.
- MSRC. "Microsoft Security Response Center: Kernel Advisories." 2024.
- j00ru (Mateusz Jurczyk). "Windows Kernel Exploitation Research." Google Project Zero.
- connormcgarr. "Windows Kernel Exploitation Blog." 2021-2024.
- MITRE ATT&CK. "Exploitation for Privilege Escalation (T1068)." https://attack.mitre.org/techniques/T1068/
Preguntas frecuentes
Libros recomendados
Artículos relacionados
BYOVD: Bring Your Own Vulnerable Driver y Drivers Maliciosos en Windows
EDR Internals: Cómo Funcionan y Cómo se Evaden
Windows API Calls Más Usadas por Malware: Guía de Referencia para Analistas
Analisis de DLLs y Handles en Memoria: dlllist, handles y Deteccion de Inyeccion
Analisis de Procesos en Memoria Windows: pslist, pstree y Deteccion de Anomalias
Registro de Windows en Memoria: hivelist, printkey y Extraccion de Artefactos
Este contenido tiene fines exclusivamente educativos y de investigación en ciberseguridad defensiva. No se proporcionan binarios maliciosos ni payloads ejecutables. El uso indebido de esta información es responsabilidad exclusiva del usuario. Leer disclaimer completo.