
ThrottleStop.sys Lectura/Escritura Arbitraria de Memoria Física
Prueba de concepto completa para el controlador ThrottleStop.sys de TechPowerUp (CVE-2025-7771). Un controlador de kernel firmado y aún cargable expone lectura y escritura no validadas de memoria física a través de dos IOCTL. Este repositorio convierte esa primitiva en una escalada de privilegios local funcional de administrador a SYSTEM y documenta una peculiaridad en la nomenclatura de dispositivos que rompe la mayoría de detecciones basadas en rutas y nombres de archivo.
Ya existía una PoC para los mismos IOCTL (ver Créditos). Esta es una cadena de explotación completa e independiente, no una demostración de la primitiva.
| Campo | Valor |
|---|---|
| SHA256 | 16F83F056177C4EC24C7E99D01CA9D9D6713BD0497EEEDB777A3FFEFA99C97F0 |
| SHA1 | 82ED942A52CDCF120A8919730E00BA37619661A3 |
| MD5 | 6BC8E3505D9F51368DDF323ACB6ABC49 |
| Versión | 3.0.0.0 ("Controlador de bajo nivel", 2004-2020) |
| Firmante | TechPowerUp LLC, DigiCert EV Code Signing |
| Huella del certificado | 524EDA9C819321C66E22C7BABEB23DAEAFFB2182 |
| Validez del certificado | 2019-08-10 al 2022-06-15 |
El certificado caducó en 2022, pero la firma incluye una marca de tiempo de contrafirma de confianza, por lo que Windows todavía lo carga. La revocación solo ayuda si su fecha es anterior a la hora de firma, algo poco frecuente en controladores antiguos como este.
El recurso de versión no tiene CompanyName, OriginalFilename ni InternalName, por lo que no se puede atribuir el archivo a un proveedor a partir de sus propios metadatos.
Dos IOCTL leen y escriben memoria física sin validación de límites ni de direcciones:
| IOCTL | Operación |
|---|---|
0x80006498 | Lectura física |
0x8000649C | Escritura física |
Ambos son METHOD_BUFFERED, por lo que no hay desreferencia de puntero de usuario; el defecto es la falta de validación de la dirección física suministrada por el llamante, no un puntero sin comprobar.
Cabe destacar: el manejador de escritura 0x8000649C está declarado como FILE_READ_ACCESS. Un handle abierto en modo solo lectura aún puede realizar escrituras físicas, por lo que la máscara de acceso declarada no se corresponde con lo que realmente hace el manejador.
Abrir el dispositivo requiere derechos de administrador, por lo que esto no es por sí solo un cruce del límite de privilegios. Lo que proporciona a un atacante que ya es administrador es lectura/escritura arbitraria del kernel desde el modo usuario, lo que anula las protecciones que se supone deben mantenerse por encima del administrador: integridad de código de HVCI, PPL y autoprotección de EDR/AV. El clásico BYOVD ("trae tu propio controlador vulnerable").
Como demostración concreta, la PoC utiliza la primitiva de L/E para robar el token de SYSTEM y lanzar un shell de SYSTEM.
CVSS 4.0: AV:L/AC:H/AT:N/PR:H/UI:N/VC:H/VI:H/VA:H/SC:H/SI:H/SA:H (8.7, Alta).
Todo se ejecuta desde el modo usuario contra los IOCTL de L/E física del controlador. No hay recorrido de tablas de páginas ni CR3 de por medio; ambos procesos se localizan escaneando directamente la memoria física:
ImageFileName sea System y UniqueProcessId sea 4. El escaneo se limita a los rangos de RAM ocupados leídos de la clave de registro HARDWARE\RESOURCEMAP\...\Physical Memory del firmware, no a una ventana supuesta, por lo que nunca se tocan los huecos MMIO y no se omite nada por encima de la RAM instalada.Token (EPROC_TOKEN) del EPROCESS localizado.Token. El token es un _EX_FAST_REF, por lo que los bits bajos del contador de referencias se enmascaran por defecto (--mask selecciona este comportamiento).cmd.exe; whoami devuelve .Los desplazamientos (EPROC_TOKEN, EPROC_PID, EPROC_IMG_NAME, etc.) corresponden a una compilación específica y deben confirmarse con dt nt!_EPROCESS en la versión de Windows objetivo.
El nombre del ejecutable importa. El paso 3 localiza nuestro propio proceso comparando su ImageFileName en la memoria física, y ese campo está limitado a 15 caracteres, coincidiendo el escaneo con los primeros 8. Mantén el nombre compilado corto y distintivo; si renombras el binario, mantente dentro de ese límite o el autoescaneo no encontrará el proceso.
El controlador no utiliza un nombre de dispositivo fijo. Deriva el nombre del objeto de dispositivo del nombre del servicio bajo el que está registrado; el nombre del archivo en disco es irrelevante. Registrar el binario bajo el servicio TRIXX produce \\.\TRIXX sin importar cómo se llame el archivo en disco.
Por lo tanto, cualquier detección basada en \Device\ThrottleStop o ThrottleStop.sys se evade de forma trivial. La detección debe basarse en el hash del archivo o en el certificado de firma:
SHA256: 16F83F056177C4EC24C7E99D01CA9D9D6713BD0497EEEDB777A3FFEFA99C97F0
Thumbprint: 524EDA9C819321C66E22C7BABEB23DAEAFFB2182
Subject: CN=TechPowerUp LLC, O=TechPowerUp LLC, L=Spokane, S=Washington, C=US
La lista DEVICE_NAMES en el código fuente es solo una sonda para instalaciones conocidas del producto. Pasa un nombre de dispositivo como argumento para apuntar a un servicio que hayas registrado tú mismo.
| CVE | Controlador |
|---|---|
| CVE-2019-7245 | GPU-Z.sys |
| CVE-2025-5324 | GPU-Z.sys |
| CVE-2025-7771 | ThrottleStop.sys (este repositorio) |
El binario no se distribuye aquí. Verifica cualquier copia con el SHA256 anterior. La muestra está catalogada en LOLDrivers.
cl /nologo /EHsc /W4 /O2 src\ThrottleStop.cpp /Fe:myLittleLpe.exe /link advapi32.lib
Solo para uso en laboratorio. Ejecútalo dentro de una VM aislada con una instantánea a la que poder revertir.
sc.exe create <name> type= kernel binPath= C:\path\to\ThrottleStop.sys
sc.exe start <name>
myLittleLpe.exe
sc.exe stop <name>
sc.exe delete <name>
El binario no acepta argumentos. Imprime el mapa de memoria física, escanea en busca del EPROCESS de SYSTEM y del local, intercambia el token y lanza cmd.exe ejecutándose como NT AUTHORITY\SYSTEM.

Otro trabajo público sobre el mismo controlador, para comparación:
Publicado para investigación defensiva e ingeniería de detección. La vulnerabilidad ya es pública como CVE-2025-7771. Todo lo que se muestra aquí fue probado en sistemas propiedad del autor. No ejecutes esto contra sistemas que no poseas o para los que no estés autorizado a realizar pruebas.
NT AUTHORITY\SYSTEM