
Manueller Kernel-Treiber-Mapper für Windows x64, der CVE-2025-8061 in Lenovos LnvMSRIO.sys ausnutzt, um einen BYOVD-Angriff durchzuführen und PE64-Treiber in Ring 0 einzubinden.
BYOVD Manual Mapper für Windows x64 · CVE-2025-8061
MSRMapper ist ein manueller Kernel-Treiber-Mapper für Windows x64, der CVE-2025-8061 im verwundbaren Lenovo-Treiber LnvMSRIO.sys ausnutzt, um einen BYOVD-Angriff (Bring Your Own Vulnerable Driver) durchzuführen.
Das Projekt mappt einen PE64-Treiber direkt in den Kernel-Speicher, ohne sc create oder einen Dienst zu verwenden, und führt dessen DriverEntry in Ring 0 aus. Der gesamte Prozess stützt sich auf:
LnvMSRIO.sys.SuperfetchPfnQuery-Klasse von NtQuerySystemInformation.LSTAR-Hijacking zur Ausführung von Ring-0-Shellcode.NtAddAtom-Hooking zum Aufruf von Kernel-Funktionen wie ExAllocatePoolWithTag, RtlCopyMemory und DriverEntry.Status: Getestet auf Windows 10 22H2 (OS Build 19045.6466). Der Treiber wird erfolgreich gemappt und
DriverEntrygibtSTATUS_SUCCESS(0x0) zurück.
ExAllocatePoolWithTag.KiSystemCall64, NtAddAtom, etc.) durch Herunterladen von PDBs vom Microsoft Symbol Server.NtQuerySystemInformation-Klasse 0x4F), ohne einen benutzerdefinierten Page-Table-Walker zu benötigen.LSTAR, FMASK) und physischer Speicher-Lese-/Schreibzugriff über LnvMSRIO.sys.LSTAR wiederherstellt.MmGetPhysicalAddress aufruft, um die PA von NtAddAtom zu erhalten.swapgs; sysret an den User-Mode zurückgibt.\\.\WinMsrDev (Dienst, der von LnvMSRIO.sys bereitgestellt wird).ntoskrnl-Basis über EnumDeviceDrivers und validiert sie mit LSTAR.PdbResolver, um Kernel-Symbol-RVAs aufzulösen.NtAddAtomLSTAR gehijackt wird.swapgs; iretq-Gadget in LSTAR.PrepareStack vor und aktiviert AC=1 im User-Mode über EnableACUserMode.syscall springt die CPU zum Gadget, führt den Shellcode aus, ruft MmGetPhysicalAddress(NtAddAtom) auf und speichert die PA in einem User-Buffer.LSTAR wieder her und kehrt mit swapgs; sysret in den User-Mode zurück.ExAllocatePoolWithTag (aufgerufen über den temporären NtAddAtom-Hook).RtlCopyMemory in den Pool.DriverEntry mit DriverObject = NULL und RegistryPath = NULL auf.NtAddAtom wieder her..asm-Dateien.LnvMSRIO.sys (CVE-2025-8061) installiert und der WinMsrDev-Dienst läuft.C:\Symbols.Dieses Projekt verwendet CMake. Um über die Kommandozeile zu bauen:
Generieren Sie die Visual Studio 2022-Lösung:
cmake -B build -G "Visual Studio 17 2022" -A x64
Bauen Sie im Release-Modus:
cmake --build build --config Release
Die Ausgabebinärdateien befinden sich in build/bin/Release/ (oder einem ähnlichen Pfad, abhängig von der CMake-Konfiguration).
Alternativ können Sie die generierte build/KernelLoader.sln in Visual Studio 2022 öffnen und von dort aus bauen.
Stellen Sie sicher, dass ShellcodeAsm.asm und EnableAC.asm mit MASM kompiliert werden. Die bereitgestellte CMakeLists.txt übernimmt dies automatisch.
Wenn Sie die Build-Konfiguration anpassen müssen, bearbeiten Sie CMakeLists.txt.
Installieren und starten Sie den LnvMSRIO.sys-Dienst:
sc create WinMsrDev type= kernel binPath= C:\path\to\LnvMSRIO.sys
sc start WinMsrDev
Führen Sie KernelLoader.exe als Administrator aus:
KernelLoader.exe
Um die DbgPrint-Ausgabe des gemappten Treibers zu sehen, verwenden Sie DebugView (Sysinternals) als Administrator mit:
Capture → Capture KernelOptions → Enable Verbose Kernel OutputHKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Debug Print Filter
DWORD namens mit dem Wert erstellen.DBGHELP: ... - unmatched, die in einigen PdbResolver-Logs erscheint, ist kosmetisch. Die PDB wird an einer künstlichen virtuellen Basis geladen und SymFromName funktioniert weiterhin korrekt. Sie beeinträchtigt die Symbolauflösung nicht.EnumDeviceDrivers eine falsche Basis zurückgeben. Dieses Projekt berechnet die echte Basis mit LSTAR - KiSystemCall64.NtAddAtom-Hook ist temporär und wird nach jedem Aufruf wiederhergestellt. Verwenden Sie dies dennoch nur in kontrollierten Umgebungen.SMEP/SMAP aktiviert sind. Sie werden vorübergehend über CR4 deaktiviert und vor der Rückkehr in den User-Mode wiederhergestellt.NtAddAtom-Hook (12-Byte jmp rax) zum Aufruf beliebiger Kernel-Funktionen.EnumDeviceDrivers eine falsche Basis zurückgeben kann; die echte Kernel-Basis wird mit LSTAR - KiSystemCall64 berechnet.Default0xFFFFFFFF