
pstrip64.sys カーネルドライバーは、低特権ユーザーが物理メモリの任意の範囲を自身の仮想アドレス空間にマッピングできるようにする IOCTL を公開しています。このプリミティブにより、システムの物理 RAM への完全な読み取り/書き込みアクセスが可能になり、攻撃者は重要なカーネル構造を変更して NT AUTHORITY\SYSTEM へ権限を昇格させることができます。
pstrip64.sys カーネルドライバは、低権限ユーザーが任意の範囲の物理メモリを自身の仮想アドレス空間にマッピングできる IOCTL を公開しています。このプリミティブにより、システムの物理 RAM への完全な読み取り/書き込みアクセスが可能となり、攻撃者はカーネルの重要な構造を改変し、NT AUTHORITY\SYSTEM への権限昇格を実行できます。
このドライバはデバイスオブジェクト \Device\PSTRIP64 とシンボリックリンク \DosDevices\PSTRIP64 を作成し、ユーザーからアクセス可能にします。
脆弱性は DispatchDeviceControl ルーチン内、特に IOCTL 0x80002008 のハンドラに存在します。関数 sub_11000 は \Device\PhysicalMemory へのハンドルを開き、ZwMapViewOfSection を介して呼び出しプロセスのアドレス空間に直接マッピングします。入力バッファから物理アドレスと長さを受け取り、HalTranslateBusAddress で変換し、ZwCurrentProcess() を使用してマッピングします。攻撃者は物理メモリをスキャンして自身のプロセスの _EPROCESS 構造を見つけ、セキュリティトークンを System に上書きしたり、カーネルコードを直接パッチしたりすることができます。
同様の脆弱性は、以前のバージョンのアプリケーションにおける pstrip.sys ファイルの CVE-2008-5725 で最初に見られました。PowerStrip ドライバは IOCTL 0x800020A8 を使用しており、攻撃者が宛先アドレス(HalDispatchTable など)とそのアドレスに書き込むデータを渡すことを許可していました。今回最新バージョンで発見された脆弱性は、ユーザーが任意の物理メモリを自身のプロセスにマッピングすることを明示的に許可するものです。攻撃者は物理 RAM をマッピングし、自身のプロセス構造をスキャンし、手動でトークンを編集して管理者権限を取得します。メモリに直接作用します。
RtlInitUnicodeString(&DestinationString, L"\\Device\\PhysicalMemory");
// ...
result = ZwOpenSection(&SectionHandle, 0xF001Fu, &ObjectAttributes);
// ...
v8 = ZwMapViewOfSection(..., (HANDLE)0xFFFFFFFFFFFFFFFFLL, ...);
権限昇格を実証する PoC が開発されましたが、悪用を防ぐためコードは公開されません。
_EPROCESS 構造をスキャンします。_EPROCESS を見つけると、System トークンの値を攻撃者の Token フィールドにコピーします。
