
El controlador de kernel pstrip64.sys expone un IOCTL que permite a usuarios con privilegios bajos mapear rangos arbitrarios de memoria física en su propio espacio de direcciones virtuales. Esta primitiva permite acceso completo de lectura/escritura a la RAM física del sistema, lo que permite a los atacantes modificar estructuras críticas del kernel y escalar privilegios a NT AUTHORITY\SYSTEM.
El controlador de kernel pstrip64.sys expone un IOCTL que permite a usuarios con bajos privilegios mapear rangos arbitrarios de memoria física en su propio espacio de direcciones virtuales. Esta primitiva otorga acceso completo de lectura/escritura a la RAM física del sistema, permitiendo a los atacantes modificar estructuras críticas del kernel y escalar privilegios a NT AUTHORITY\SYSTEM.
El controlador crea un objeto de dispositivo \Device\PSTRIP64 y un enlace simbólico \DosDevices\PSTRIP64 accesible por los usuarios.
La vulnerabilidad existe en la rutina DispatchDeviceControl, específicamente en el manejador del IOCTL 0x80002008. La función sub_11000 abre un handle a \Device\PhysicalMemory y lo mapea directamente en el espacio de direcciones del proceso llamante mediante ZwMapViewOfSection. Acepta una dirección física y una longitud del búfer de entrada, la traduce mediante HalTranslateBusAddress y la mapea usando ZwCurrentProcess(). Un atacante puede escanear la memoria física para encontrar la estructura _EPROCESS de su propio proceso y sobrescribir el token de seguridad con el de System, o parchear el código del kernel directamente.
Una vulnerabilidad similar se observó por primera vez en CVE-2008-5725, en el archivo pstrip.sys de versiones anteriores de la aplicación, donde el controlador PowerStrip, mediante el IOCTL 0x800020A8, permitía al atacante pasar una dirección de destino (como HalDispatchTable) y los datos a escribir en esa dirección. La encontrada esta vez en la última versión permite explícitamente a un usuario mapear cualquier memoria física en su propio proceso. El atacante mapea la RAM física, escanea en busca de la estructura de su propio proceso y edita manualmente su token para obtener privilegios de Administrador. Actuando directamente sobre la memoria.
RtlInitUnicodeString(&DestinationString, L"\\Device\\PhysicalMemory");
// ...
result = ZwOpenSection(&SectionHandle, 0xF001Fu, &ObjectAttributes);
// ...
v8 = ZwMapViewOfSection(..., (HANDLE)0xFFFFFFFFFFFFFFFFLL, ...);
Se desarrolló una PoC para demostrar la escalada de privilegios; sin embargo, no se publicará ningún código para evitar su uso indebido.

