
Windows x64용 수동 커널 드라이버 매퍼로, Lenovo의 LnvMSRIO.sys에 있는 CVE-2025-8061을 악용하여 BYOVD 공격을 수행하고 PE64 드라이버를 링 0에 매핑합니다.
Windows x64용 BYOVD 수동 매퍼 · CVE-2025-8061
MSRMapper는 Windows x64용 수동 커널 드라이버 매퍼로, 취약한 Lenovo 드라이버 LnvMSRIO.sys의 CVE-2025-8061을 악용하여 BYOVD(Bring Your Own Vulnerable Driver) 공격을 수행합니다.
이 프로젝트는 sc create나 서비스를 사용하지 않고 PE64 드라이버를 커널 메모리에 직접 매핑하고, 링 0에서 해당 드라이버의 DriverEntry를 실행합니다. 전체 과정은 다음에 의존합니다:
LnvMSRIO.sys를 통한 MSR 및 물리 메모리 읽기/쓰기.NtQuerySystemInformation의 SuperfetchPfnQuery 클래스를 통한 VA → PA 변환.LSTAR 하이재킹.ExAllocatePoolWithTag, RtlCopyMemory, DriverEntry와 같은 커널 함수를 호출하기 위한 일시적 NtAddAtom 후킹.상태: Windows 10 22H2 (OS Build 19045.6466) 에서 테스트되었습니다. 드라이버가 성공적으로 매핑되고
DriverEntry가STATUS_SUCCESS(0x0)를 반환합니다.
ExAllocatePoolWithTag를 사용한 커널 내 수동 PE64 매핑.KiSystemCall64, NtAddAtom 등) 해석.NtQuerySystemInformation 클래스 0x4F)를 통한 VA → PA 변환.LnvMSRIO.sys를 통한 MSR(LSTAR, FMASK) 및 물리 메모리 읽기/쓰기.LSTAR를 복원.MmGetPhysicalAddress를 호출하여 NtAddAtom의 PA를 획득.swapgs; sysret을 통해 사용자 모드로 제어권을 반환.NtAddAtom 후크(12바이트 ).\\.\WinMsrDev(LnvMSRIO.sys가 노출하는 서비스)를 엽니다.EnumDeviceDrivers를 통해 ntoskrnl 베이스를 가져오고 LSTAR로 검증합니다.PdbResolver를 초기화합니다.NtAddAtom의 PA 획득LSTAR가 하이재킹될 때 링 0에서 실행될 셸코드를 작성합니다.swapgs; iretq 가젯을 LSTAR에 씁니다.PrepareStack으로 스택을 준비하고 EnableACUserMode를 통해 사용자 모드에서 AC=1을 활성화합니다.syscall 시 CPU가 가젯으로 점프하여 셸코드를 실행하고, MmGetPhysicalAddress(NtAddAtom)를 호출한 뒤 PA를 사용자 버퍼에 저장합니다.LSTAR를 복원하고 swapgs; sysret으로 사용자 모드로 복귀합니다.ExAllocatePoolWithTag(일시적 NtAddAtom 후크를 통해 호출됨)로 비페이징 풀을 할당합니다.RtlCopyMemory로 PE 이미지를 풀에 복사합니다.DriverObject = NULL 및 RegistryPath = NULL로 DriverEntry를 호출합니다.NtAddAtom의 원래 바이트를 복원합니다..asm 파일을 빌드하기 위한 MASM(Microsoft Macro Assembler).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 구성에 따라 유사한 경로)에 생성됩니다.
또는 Visual Studio 2022에서 생성된 build/KernelLoader.sln을 열고 빌드할 수도 있습니다.
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
Default라는 이름의 DWORD를 값 로 생성하여 조정합니다.PdbResolver 로그에 나타나는 DBGHELP: ... - unmatched 메시지는 외관상의 문제입니다. PDB는 인위적인 가상 베이스에 로드되며 SymFromName은 여전히 올바르게 작동합니다. 심볼 해석에는 영향을 미치지 않습니다.EnumDeviceDrivers는 잘못된 베이스를 반환할 수 있습니다. 이 프로젝트는 LSTAR - KiSystemCall64로 실제 베이스를 계산합니다.NtAddAtom 후크는 일시적이며 각 호출 후 복원됩니다. 그래도 통제된 환경에서만 사용하세요.SMEP/SMAP이 활성화되어 있다고 가정합니다. 이들은 CR4를 통해 일시적으로 비활성화되고 사용자 모드로 복귀하기 전에 복원됩니다.jmp raxEnumDeviceDrivers가 잘못된 베이스를 반환할 수 있는 Windows 11 24H2 지원; 실제 커널 베이스는 LSTAR - KiSystemCall64로 계산됩니다.0xFFFFFFFF