
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 ドライバをカーネルメモリへ直接マッピングし、その DriverEntry をリング0で実行します。プロセス全体は以下に依存しています:
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 の構成に応じた同様のパス) に生成されます。
あるいは、生成された 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
Default という名前の DWORD を作成し、値 を設定します。PdbResolver ログに表示される DBGHELP: ... - unmatched メッセージは 見た目上のもの です。PDB は人工的な仮想ベースにロードされ、SymFromName は依然として正しく動作します。シンボル解決には影響しません。EnumDeviceDrivers が誤ったベースを返す可能性があります。本プロジェクトは LSTAR - KiSystemCall64 で実際のベースを計算します。NtAddAtom フックは一時的なもので、各呼び出し後に復元されます。それでも、これは制御された環境でのみ使用してください。SMEP/SMAP が有効であることを前提としています。これらは CR4 を介して一時的に無効化され、ユーザーモードへ戻る前に復元されます。jmp raxEnumDeviceDrivers が誤ったベースを返す可能性があり、実際のカーネルベースは LSTAR - KiSystemCall64 で計算されます。0xFFFFFFFF