
Ручной маппер драйверов ядра для Windows x64, эксплуатирующий CVE-2025-8061 в LnvMSRIO.sys от Lenovo для проведения BYOVD-атаки с отображением PE64-драйверов в ring 0.
Ручной маппер BYOVD для Windows x64 · CVE-2025-8061
MSRMapper — это ручной маппер драйверов ядра для Windows x64, который эксплуатирует CVE-2025-8061 в уязвимом драйвере Lenovo LnvMSRIO.sys для проведения атаки BYOVD (Bring Your Own Vulnerable Driver).
Проект отображает драйвер PE64 напрямую в память ядра без использования sc create или службы и выполняет его DriverEntry в ring 0. Весь процесс опирается на:
LnvMSRIO.sys.SuperfetchPfnQuery функции NtQuerySystemInformation.LSTAR для выполнения ring-0 шелл-кода.NtAddAtom для вызова функций ядра, таких как ExAllocatePoolWithTag, RtlCopyMemory и DriverEntry.Статус: Протестировано на Windows 10 22H2 (сборка ОС 19045.6466). Драйвер успешно отображается, и
DriverEntryвозвращаетSTATUS_SUCCESS(0x0).
ExAllocatePoolWithTag.KiSystemCall64, NtAddAtom и т. д.) путём загрузки PDB-файлов с сервера символов Microsoft.NtQuerySystemInformation класс 0x4F) без необходимости в собственном обходчике таблиц страниц.LSTAR, FMASK) и физической памяти через LnvMSRIO.sys.LSTAR.MmGetPhysicalAddress для получения PA NtAddAtom.swapgs; sysret.NtAddAtom (12-байтовый jmp rax) для вызова произвольных функций ядра.EnumDeviceDrivers может возвращать неверную базу; реальная база ядра вычисляется как LSTAR - KiSystemCall64.\\.\WinMsrDev (служба, предоставляемая LnvMSRIO.sys).ntoskrnl через EnumDeviceDrivers и проверяет её с помощью LSTAR.PdbResolver для разрешения RVA символов ядра.NtAddAtomLSTAR.swapgs; iretq в LSTAR.PrepareStack и включает AC=1 в пользовательском режиме через EnableACUserMode.syscall процессор переходит на гаджет, выполняет шелл-код, вызывает MmGetPhysicalAddress(NtAddAtom) и сохраняет PA в пользовательский буфер.LSTAR и возвращается в пользовательский режим через swapgs; sysret.ExAllocatePoolWithTag (вызывается через временный хук NtAddAtom).RtlCopyMemory.DriverEntry с DriverObject = NULL и RegistryPath = NULL.NtAddAtom..asm файлов.LnvMSRIO.sys (CVE-2025-8061) и запущенная служба WinMsrDev.C:\Symbols.Этот проект использует CMake. Для сборки из командной строки:
Сгенерируйте решение Visual Studio 2022:
cmake -B build -G "Visual Studio 17 2022" -A x64
Соберите в режиме Release:
cmake --build build --config Release
Выходные бинарные файлы будут находиться в build/bin/Release/ (или по аналогичному пути в зависимости от конфигурации CMake).
В качестве альтернативы вы можете открыть сгенерированный build/KernelLoader.sln в Visual Studio 2022 и собрать оттуда.
Убедитесь, что ShellcodeAsm.asm и EnableAC.asm компилируются с помощью MASM. Предоставленный CMakeLists.txt обрабатывает это автоматически.
Если вам нужно изменить конфигурацию сборки, отредактируйте CMakeLists.txt.
Установите и запустите службу LnvMSRIO.sys:
sc create WinMsrDev type= kernel binPath= C:\path\to\LnvMSRIO.sys
sc start WinMsrDev
Запустите KernelLoader.exe от имени администратора:
KernelLoader.exe
Чтобы увидеть вывод DbgPrint отображённого драйвера, используйте DebugView (Sysinternals) от имени администратора с:
Capture → Capture KernelOptions → Enable Verbose Kernel OutputHKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Debug Print Filter
создав DWORD с именем Default и значением 0xFFFFFFFF.DBGHELP: ... - unmatched, появляющееся в некоторых логах PdbResolver, является косметическим. PDB загружается по искусственной виртуальной базе, и SymFromName всё равно работает корректно. Это не влияет на разрешение символов.EnumDeviceDrivers может возвращать неверную базу. Этот проект вычисляет реальную базу как LSTAR - KiSystemCall64.NtAddAtom является временным и восстанавливается после каждого вызова. Тем не менее используйте это только в контролируемых средах.SMEP/SMAP включены. Они временно отключаются через CR4 и восстанавливаются перед возвратом в пользовательский режим.