
Mapeador manual de controladores de kernel para Windows x64 que explota CVE-2025-8061 en LnvMSRIO.sys de Lenovo para realizar un ataque BYOVD, mapeando controladores PE64 en el anillo 0.
Mapeador manual BYOVD para Windows x64 · CVE-2025-8061
MSRMapper es un mapeador manual de controladores de kernel para Windows x64 que explota CVE-2025-8061 en el controlador vulnerable de Lenovo LnvMSRIO.sys para realizar un ataque BYOVD (Bring Your Own Vulnerable Driver).
El proyecto mapea un controlador PE64 directamente en la memoria del kernel sin usar sc create ni un servicio, y ejecuta su DriverEntry en ring 0. Todo el proceso se basa en:
LnvMSRIO.sys.SuperfetchPfnQuery de NtQuerySystemInformation.LSTAR para ejecutar shellcode en ring 0.NtAddAtom para llamar a funciones del kernel como ExAllocatePoolWithTag, RtlCopyMemory y DriverEntry.Estado: Probado en Windows 10 22H2 (OS Build 19045.6466). El controlador se mapea correctamente y
DriverEntrydevuelveSTATUS_SUCCESS(0x0).
ExAllocatePoolWithTag.KiSystemCall64, NtAddAtom, etc.) descargando PDBs desde el Servidor de Símbolos de Microsoft.NtQuerySystemInformation clase 0x4F), sin necesidad de un recorrido personalizado de tablas de páginas.LSTAR, FMASK) y memoria física a través de LnvMSRIO.sys.LSTAR original.MmGetPhysicalAddress para obtener la PA de NtAddAtom.swapgs; sysret.\\.\WinMsrDev (servicio expuesto por LnvMSRIO.sys).ntoskrnl mediante EnumDeviceDrivers y la valida con LSTAR.PdbResolver para resolver las RVA de los símbolos del kernel.NtAddAtomLSTAR.swapgs; iretq en LSTAR.PrepareStack y habilita AC=1 en modo usuario mediante EnableACUserMode.syscall, la CPU salta al gadget, ejecuta el shellcode, llama a MmGetPhysicalAddress(NtAddAtom) y almacena la PA en un búfer de usuario.LSTAR y regresa al modo usuario con swapgs; sysret.ExAllocatePoolWithTag (invocado a través del enganche temporal de NtAddAtom).RtlCopyMemory.DriverEntry con DriverObject = NULL y RegistryPath = NULL.NtAddAtom..asm.LnvMSRIO.sys vulnerable (CVE-2025-8061) instalado y el servicio WinMsrDev en ejecución.C:\Symbols.Este proyecto usa CMake. Para compilar desde la línea de comandos:
Genera la solución de Visual Studio 2022:
cmake -B build -G "Visual Studio 17 2022" -A x64
Compila en modo Release:
cmake --build build --config Release
Los binarios de salida estarán en build/bin/Release/ (o una ruta similar según la configuración de CMake).
Alternativamente, puedes abrir el build/KernelLoader.sln generado en Visual Studio 2022 y compilar desde ahí.
Asegúrate de que ShellcodeAsm.asm y EnableAC.asm se compilen con MASM. El CMakeLists.txt proporcionado lo gestiona automáticamente.
Si necesitas ajustar la configuración de compilación, edita CMakeLists.txt.
Instala e inicia el servicio LnvMSRIO.sys:
sc create WinMsrDev type= kernel binPath= C:\path\to\LnvMSRIO.sys
sc start WinMsrDev
Ejecuta KernelLoader.exe como Administrador:
KernelLoader.exe
Para ver la salida de DbgPrint del controlador mapeado, usa DebugView (Sysinternals) como Administrador con:
Capture → Capture KernelOptions → Enable Verbose Kernel OutputHKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Debug Print Filter
DWORD llamado Default con valor .DBGHELP: ... - unmatched que aparece en algunos registros de PdbResolver es cosmético. El PDB se carga en una base virtual artificial y SymFromName sigue funcionando correctamente. No afecta a la resolución de símbolos.EnumDeviceDrivers puede devolver una base incorrecta. Este proyecto calcula la base real con LSTAR - KiSystemCall64.NtAddAtom es temporal y se restaura después de cada llamada. Aun así, usa esto solo en entornos controlados.SMEP/SMAP están habilitados. Se deshabilitan temporalmente mediante CR4 y se restauran antes de regresar al modo usuario.NtAddAtom (jmp rax de 12 bytes) para llamar a funciones arbitrarias del kernel.EnumDeviceDrivers puede devolver una base incorrecta; la base real del kernel se calcula con LSTAR - KiSystemCall64.0xFFFFFFFF