
Mapper manuale di driver kernel per Windows x64 che sfrutta CVE-2025-8061 in LnvMSRIO.sys di Lenovo per eseguire un attacco BYOVD, mappando driver PE64 nel ring 0.
Mapper manuale BYOVD per Windows x64 · CVE-2025-8061
MSRMapper è un mapper manuale di driver kernel per Windows x64 che sfrutta CVE-2025-8061 nel driver vulnerabile Lenovo LnvMSRIO.sys per eseguire un attacco BYOVD (Bring Your Own Vulnerable Driver).
Il progetto mappa un driver PE64 direttamente nella memoria del kernel senza utilizzare sc create o un servizio, ed esegue il suo DriverEntry in ring 0. L'intero processo si basa su:
LnvMSRIO.sys.SuperfetchPfnQuery di NtQuerySystemInformation.LSTAR per eseguire shellcode in ring 0.NtAddAtom per chiamare funzioni del kernel come ExAllocatePoolWithTag, RtlCopyMemory e DriverEntry.Stato: Testato su Windows 10 22H2 (OS Build 19045.6466). Il driver viene mappato con successo e
DriverEntryrestituisceSTATUS_SUCCESS(0x0).
ExAllocatePoolWithTag.KiSystemCall64, NtAddAtom, ecc.) scaricando i PDB dal Microsoft Symbol Server.NtQuerySystemInformation classe 0x4F), senza necessità di un page-table walker personalizzato.LSTAR, FMASK) e memoria fisica tramite LnvMSRIO.sys.LSTAR originale.MmGetPhysicalAddress per ottenere il PA di NtAddAtom.swapgs; sysret.\\.\WinMsrDev (servizio esposto da LnvMSRIO.sys).ntoskrnl tramite EnumDeviceDrivers e la convalida con LSTAR.PdbResolver per risolvere gli RVA dei simboli del kernel.NtAddAtomLSTAR viene dirottato.swapgs; iretq in LSTAR.PrepareStack e abilita AC=1 in modalità utente tramite EnableACUserMode.syscall, la CPU salta al gadget, esegue lo shellcode, chiama MmGetPhysicalAddress(NtAddAtom) e memorizza il PA in un buffer utente.LSTAR e ritorna alla modalità utente con swapgs; sysret.ExAllocatePoolWithTag (invocato tramite l'hook temporaneo di NtAddAtom).RtlCopyMemory.DriverEntry con DriverObject = NULL e RegistryPath = NULL.NtAddAtom..asm.LnvMSRIO.sys vulnerabile (CVE-2025-8061) installato e il servizio WinMsrDev in esecuzione.C:\Symbols.Questo progetto utilizza CMake. Per compilare dalla riga di comando:
Genera la soluzione Visual Studio 2022:
cmake -B build -G "Visual Studio 17 2022" -A x64
Compila in modalità Release:
cmake --build build --config Release
I binari di output saranno in build/bin/Release/ (o un percorso simile a seconda della configurazione CMake).
In alternativa, puoi aprire il file build/KernelLoader.sln generato in Visual Studio 2022 e compilare da lì.
Assicurati che ShellcodeAsm.asm e EnableAC.asm siano compilati con MASM. Il file CMakeLists.txt fornito gestisce questo automaticamente.
Se devi modificare la configurazione di compilazione, modifica CMakeLists.txt.
Installa e avvia il servizio LnvMSRIO.sys:
sc create WinMsrDev type= kernel binPath= C:\path\to\LnvMSRIO.sys
sc start WinMsrDev
Esegui KernelLoader.exe come Amministratore:
KernelLoader.exe
Per visualizzare l'output DbgPrint del driver mappato, usa DebugView (Sysinternals) come Amministratore con:
Capture → Capture KernelOptions → Enable Verbose Kernel OutputHKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Debug Print Filter
DWORD chiamato Default con valore .DBGHELP: ... - unmatched che appare in alcuni log di PdbResolver è solo estetico. Il PDB viene caricato a una base virtuale artificiale e SymFromName funziona comunque correttamente. Non influisce sulla risoluzione dei simboli.EnumDeviceDrivers può restituire una base errata. Questo progetto calcola la base reale con LSTAR - KiSystemCall64.NtAddAtom è temporaneo e viene ripristinato dopo ogni chiamata. Tuttavia, usalo solo in ambienti controllati.SMEP/SMAP siano abilitati. Vengono temporaneamente disabilitati tramite CR4 e ripristinati prima di ritornare alla modalità utente.NtAddAtomjmp raxEnumDeviceDrivers può restituire una base errata; la base reale del kernel viene calcolata con LSTAR - KiSystemCall64.0xFFFFFFFF