
Process Explorer 脆弱なドライバによる PPL バイパス
SysInternals Process Explorer のドライバ(PSEXP152.sys)の古いバージョン(17.x より前)が脆弱であり、PPL プロセスへのフルアクセスプロセスハンドルを開くために悪用可能であることはよく知られていますが(IOCTL: 0x8335003c)、新しいバージョン(17.x 以降)も依然として脆弱であり、別のドライバ関数(IOCTL: 0x83350014)を使って同じことが可能です。 この IOCTL 関数は任意のハンドルを複製し、ドライババージョン 17.00 でシステムプロセスおよび保護されたプロセス(PP/PPL)をフィルタリングするパッチも適用されました。しかし、この関数には重大な見落としがあり、自身の非 PPL プロセスから任意のプロセスおよびスレッドハンドルを複製することが依然として可能でした。PROCESS_QUERY_LIMITED_INFORMATION のような低い権限で PPL プロセスを開き、そのハンドルを自身のプロセスから Process Explorer ドライバ経由で複製するだけで、フィルタをバイパスし、PPL プロセスへのフルアクセスハンドルを取得するのに十分でした。 私は数年前にこの方法を使って PPL プロセス保護をバイパスしましたが、Microsoft はドライババージョン 17.11 でこのバイパスを修正し、対象のハンドルが PPL プロセスまたはスレッドハンドルであるかどうかをチェックするようになりました。それでも、17.00 から 17.09 までのドライババージョン(17.10 は存在しません)は Microsoft の脆弱なドライバブロックリストに含まれておらず、一部の EDR ベンダーもこれらのバージョンを(今のところ)検出していないのではないかと推測しています。
これは PPL プロセスを終了させるための単なる PoC 実装です。同じ強力なハンドル複製 IOCTL は、スレッドなどの他のハンドルタイプを複製したり、他の PPL プロセスにシェルコードを注入したりするためにも使用できます。
使用方法:
1. 古い SysInternals Process Explorer(17.00 から 17.10)をダウンロードする
2. procexp64.exe を管理者として実行し、脆弱なドライバをロードする
3. Process Explorer で例えば MsMpEng.exe の PID を確認する(例: 3660)
4. ps_ppl_bypass.exe PID("ps_ppl_bypass.exe 3660")を管理者として実行し、対象プロセスを終了させる
また、公式 SysInternals ウェブサイトから SysInternals Handles ツールから抽出することで、古いドライババージョンを入手することも依然として可能です: https://learn.microsoft.com/en-us/sysinternals/downloads/handle