
CVE-2026-29923 の概念実証コード。カーネルドライバー pstrip64.sys におけるローカル特権昇格の脆弱性を利用します。IOCTL を介した物理メモリの読み書きプリミティブを用いて、Windows 上で非特権ユーザーから NT AUTHORITY\SYSTEM へ昇格することを示します。
CVE-2026-29923 の最小限の概念実証です。これは pstrip64.sys カーネルドライバ(EnTech Taiwan PowerStrip ≤ 3.90.736)の脆弱性で、非特権ユーザーモードプロセスが NT AUTHORITY\SYSTEM に昇格できるものです。
pstrip64.sys は IOCTL(0x80002008)を公開しており、ユーザー提供の物理アドレスを受け取り、\Device\PhysicalMemory を開いて現在のプロセスハンドルで ZwMapViewOfSection を呼び出すことで、呼び出し元プロセスの仮想アドレス空間に直接マッピングします。特権チェックはなく、HalTranslateBusAddress が強制する以上のアドレス検証もなく、シンボリックリンク \\.\PSTRIP64 に対するアクセス制御もありません。
その結果、非特権プロセスから無制限の物理メモリ読み取り/書き込みプリミティブが獲得できます。
任意の物理読み取り/書き込みが可能になると、このエクスプロイトは次の4つの手順を踏みます。
1. EPROCESS 構造体のスキャン
物理 RAM を 2MB チャンク単位で走査します。各チャンクはカーネルプールタグ Proc(0x636F7250)についてスキャンされます。このタグはプロセスの _EPROCESS 構造体を含むプール割り当てを示します。候補のヒットは、PID を信頼する前に3つの軽量ヒューリスティックで検証されます。
PriorityClass == 0x2 — すべての稼働プロセスは Normal 優先度で実行されますProcessLock == 0x0 — 安定したプロセスではロックフィールドがクリアされていますImageFileName[0] は印刷可能な ASCII — ガベージメモリがこれに適合することはほとんどありません2. 両方のトークンポインタの特定
2つのターゲットが必要です:
_EPROCESS 内にある Token フィールドの物理アドレス_EPROCESS に保存されているトークン値3. 自プロセストークンの上書き
自プロセスの Token フィールドが含まれる4KBページをマッピングし、そのフィールドを System トークン値で上書きします。この時点から、Windows カーネルは自プロセスを NT AUTHORITY\SYSTEM として扱います。
4. シェルの起動
CreateProcessA を介して cmd.exe を起動します。子プロセスは親のトークンを継承するため、結果として得られるシェルは SYSTEM として実行されます。
x86 システムでは、3GB~4GB の物理アドレス範囲は MMIO 用に予約されています。この範囲内のページをマッピングしようとすると、ドライバはエラー 74(HalTranslateBusAddress の失敗)を返します。スキャンはこの範囲をスキップし、0x100000000 から再開して、Windows が4GB を超えて配置するカーネル構造体を捕捉します。
ドライバのマップハンドラは、返された仮想アドレスを DWORD フィールド(LowPart)に書き込むため、64ビットの VA が32ビットに切り詰められます。64ビットビルドは破損したポインタを受け取り、即座にクラッシュします。x86 としてコンパイルしてください。
| ソフトウェア | バージョン |
|---|---|
| EnTech Taiwan PowerStrip | ≤ 3.90.736 |
ドライバ ハッシュ(SHA-256):
ab01485bb7c8bc1a9c86096eeea6d31d8fad557bf4d44072b46373d2203faa6e
ハードコードされたオフセットは Windows 10 22H2 x64 を対象としています。他のビルドでは更新された値が必要です — WinDbg で dt nt!_EPROCESS を使用して確認してください。
Visual Studio の x86 開発者コマンド プロンプトを開き、次のコマンドを実行します。
cl /EHsc /O2 exploit.c /Fe:poc.exe
または、Visual Studio でプラットフォームターゲットを x86 に設定し、Release モードでビルドします。このバイナリは Windows SDK 以外の外部依存関係は必要ありません。
最初に pstrip64.sys をロードします(ドライバのロードには管理者権限が必要ですが、ロード後のエクスプロイト自体の実行には管理者権限は不要)。その後、次のコマンドを実行します。
poc.exe
NT AUTHORITY\SYSTEM として実行される新しい cmd.exe ウィンドウが開きます。
ドライバのロードをブロック(推奨)
進行中の悪用を検出
SYSTEM レベルの子プロセスを生成するのを監視するNT AUTHORITY\SYSTEM に変更されたプロセスをフラグするこのコードは教育および防御研究目的でのみ公開されています。所有しているシステム、または明示的な書面によるテスト許可を得たシステムでのみ使用してください。著者は誤用について一切責任を負いません。
| フィールド | オフセット |
|---|
PriorityClass | 0x5B7 |
ProcessLock | 0x438 |
UniqueProcessId | 0x440 |
ImageFileName | 0x5A8 |
Token | 0x4B8 |