
Mapeador manual de driver de kernel para Windows x64 que explora a CVE-2025-8061 no LnvMSRIO.sys da Lenovo para realizar um ataque BYOVD, mapeando drivers PE64 para o ring 0.
Mapeador Manual BYOVD para Windows x64 · CVE-2025-8061
MSRMapper é um mapeador manual de driver de kernel para Windows x64 que explora a CVE-2025-8061 no driver vulnerável da Lenovo LnvMSRIO.sys para realizar um ataque BYOVD (Bring Your Own Vulnerable Driver).
O projeto mapeia um driver PE64 diretamente na memória do kernel sem usar sc create ou um serviço, e executa seu DriverEntry em ring 0. Todo o processo depende de:
LnvMSRIO.sys.SuperfetchPfnQuery de NtQuerySystemInformation.LSTAR para executar shellcode em ring 0.NtAddAtom para chamar funções do kernel como ExAllocatePoolWithTag, RtlCopyMemory e DriverEntry.Status: Testado no Windows 10 22H2 (OS Build 19045.6466). O driver é mapeado com sucesso e
DriverEntryretornaSTATUS_SUCCESS(0x0).
ExAllocatePoolWithTag.KiSystemCall64, NtAddAtom, etc.) baixando PDBs do Microsoft Symbol Server.NtQuerySystemInformation classe 0x4F), sem precisar de um page-table walker personalizado.LSTAR, FMASK) e memória física através do LnvMSRIO.sys.LSTAR original.MmGetPhysicalAddress para obter o PA de NtAddAtom.swapgs; sysret.NtAddAtom (12 bytes ) para chamar funções arbitrárias do kernel.\\.\WinMsrDev (serviço exposto por LnvMSRIO.sys).ntoskrnl via EnumDeviceDrivers e a valida com LSTAR.PdbResolver para resolver os RVAs dos símbolos do kernel.NtAddAtomLSTAR for sequestrado.swapgs; iretq no LSTAR.PrepareStack e habilita AC=1 no modo usuário via EnableACUserMode.syscall, a CPU salta para o gadget, executa o shellcode, chama MmGetPhysicalAddress(NtAddAtom) e armazena o PA em um buffer do usuário.LSTAR e retorna ao modo usuário com swapgs; sysret.ExAllocatePoolWithTag (invocado através do hook temporário em NtAddAtom).RtlCopyMemory.DriverEntry com DriverObject = NULL e RegistryPath = NULL.NtAddAtom..asm.LnvMSRIO.sys vulnerável (CVE-2025-8061) instalado e o serviço WinMsrDev em execução.C:\Symbols.Este projeto usa CMake. Para compilar pela linha de comando:
Gere a solução do Visual Studio 2022:
cmake -B build -G "Visual Studio 17 2022" -A x64
Compile em modo Release:
cmake --build build --config Release
Os binários de saída estarão em build/bin/Release/ (ou um caminho similar dependendo da configuração do CMake).
Alternativamente, você pode abrir o build/KernelLoader.sln gerado no Visual Studio 2022 e compilar por lá.
Certifique-se de que ShellcodeAsm.asm e EnableAC.asm sejam compilados com MASM. O CMakeLists.txt fornecido cuida disso automaticamente.
Se precisar ajustar a configuração de compilação, edite CMakeLists.txt.
Instale e inicie o serviço LnvMSRIO.sys:
sc create WinMsrDev type= kernel binPath= C:\path\to\LnvMSRIO.sys
sc start WinMsrDev
Execute KernelLoader.exe como Administrador:
KernelLoader.exe
Para ver a saída de DbgPrint do driver mapeado, use o DebugView (Sysinternals) como Administrador com:
Capture → Capture KernelOptions → Enable Verbose Kernel OutputHKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Debug Print Filter
DWORD chamado Default com valor .DBGHELP: ... - unmatched que aparece em alguns logs do PdbResolver é cosmética. O PDB é carregado em uma base virtual artificial e SymFromName ainda funciona corretamente. Isso não afeta a resolução de símbolos.EnumDeviceDrivers pode retornar uma base incorreta. Este projeto calcula a base real com LSTAR - KiSystemCall64.NtAddAtom é temporário e restaurado após cada chamada. Ainda assim, use isso apenas em ambientes controlados.SMEP/SMAP estão habilitados. Eles são temporariamente desabilitados via CR4 e restaurados antes de retornar ao modo usuário.jmp raxEnumDeviceDrivers pode retornar uma base incorreta; a base real do kernel é calculada com LSTAR - KiSystemCall64.0xFFFFFFFF