
Mappeur manuel de pilote noyau pour Windows x64 qui exploite CVE-2025-8061 dans LnvMSRIO.sys de Lenovo pour réaliser une attaque BYOVD, en mappant des pilotes PE64 dans le ring 0.
BYOVD Manual Mapper pour Windows x64 · CVE-2025-8061
MSRMapper est un mapper manuel de pilote noyau pour Windows x64 qui exploite CVE-2025-8061 dans le pilote vulnérable Lenovo LnvMSRIO.sys pour réaliser une attaque BYOVD (Bring Your Own Vulnerable Driver).
Le projet mappe un pilote PE64 directement dans la mémoire du noyau sans utiliser sc create ni de service, et exécute son DriverEntry en ring 0. L'ensemble du processus repose sur :
LnvMSRIO.sys.SuperfetchPfnQuery de NtQuerySystemInformation.LSTAR pour exécuter du shellcode en ring 0.NtAddAtom pour appeler des fonctions du noyau telles que ExAllocatePoolWithTag, RtlCopyMemory et DriverEntry.Statut : Testé sur Windows 10 22H2 (OS Build 19045.6466). Le pilote est mappé avec succès et
DriverEntryretourneSTATUS_SUCCESS(0x0).
ExAllocatePoolWithTag.KiSystemCall64, NtAddAtom, etc.) en téléchargeant les PDB depuis le Microsoft Symbol Server.NtQuerySystemInformation classe 0x4F), sans nécessiter de parcours personnalisé des tables de pages.LSTAR, FMASK) et de la mémoire physique via LnvMSRIO.sys.LSTAR d'origine.MmGetPhysicalAddress pour obtenir l'adresse physique de NtAddAtom.swapgs; sysret.\\.\WinMsrDev (service exposé par LnvMSRIO.sys).ntoskrnl via EnumDeviceDrivers et la valide avec LSTAR.PdbResolver pour résoudre les RVA des symboles du noyau.NtAddAtomLSTAR est détourné.swapgs; iretq dans LSTAR.PrepareStack et active AC=1 en mode utilisateur via EnableACUserMode.syscall, le CPU saute vers le gadget, exécute le shellcode, appelle MmGetPhysicalAddress(NtAddAtom) et stocke l'adresse physique dans un buffer utilisateur.LSTAR et retourne en mode utilisateur avec swapgs; sysret.ExAllocatePoolWithTag (invoqué via le hook temporaire de NtAddAtom).RtlCopyMemory.DriverEntry avec DriverObject = NULL et RegistryPath = NULL.NtAddAtom..asm.LnvMSRIO.sys vulnérable (CVE-2025-8061) installé et le service WinMsrDev en cours d'exécution.C:\Symbols.Ce projet utilise CMake. Pour compiler depuis la ligne de commande :
Générez la solution Visual Studio 2022 :
cmake -B build -G "Visual Studio 17 2022" -A x64
Compilez en mode Release :
cmake --build build --config Release
Les binaires de sortie se trouveront dans build/bin/Release/ (ou un chemin similaire selon la configuration CMake).
Alternativement, vous pouvez ouvrir le fichier build/KernelLoader.sln généré dans Visual Studio 2022 et compiler à partir de là.
Assurez-vous que ShellcodeAsm.asm et EnableAC.asm sont compilés avec MASM. Le CMakeLists.txt fourni gère cela automatiquement.
Si vous devez ajuster la configuration de compilation, modifiez CMakeLists.txt.
Installez et démarrez le service LnvMSRIO.sys :
sc create WinMsrDev type= kernel binPath= C:\path\to\LnvMSRIO.sys
sc start WinMsrDev
Exécutez KernelLoader.exe en tant qu'Administrateur :
KernelLoader.exe
Pour voir la sortie DbgPrint du pilote mappé, utilisez DebugView (Sysinternals) en tant qu'Administrateur avec :
Capture → Capture KernelOptions → Enable Verbose Kernel OutputHKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Debug Print Filter
DWORD nommé Default avec la valeur .DBGHELP: ... - unmatched qui apparaît dans certains logs de PdbResolver est cosmétique. Le PDB est chargé à une base virtuelle artificielle et SymFromName fonctionne toujours correctement. Cela n'affecte pas la résolution des symboles.EnumDeviceDrivers peut retourner une base incorrecte. Ce projet calcule la vraie base avec LSTAR - KiSystemCall64.NtAddAtom est temporaire et restauré après chaque appel. Néanmoins, utilisez ceci uniquement dans des environnements contrôlés.SMEP/SMAP sont activés. Ils sont temporairement désactivés via CR4 et restaurés avant de retourner en mode utilisateur.NtAddAtom (jmp rax de 12 octets) pour appeler des fonctions arbitraires du noyau.EnumDeviceDrivers peut retourner une base incorrecte ; la vraie base du noyau est calculée avec LSTAR - KiSystemCall64.0xFFFFFFFF