
ThrottleStop.sysにおけるCVE-2025-7771の完全なエクスプロイトチェーン。検証されていない物理メモリ読み書きIOCTLを悪用し、Windows上で管理者からSYSTEMへ権限昇格します。
TechPowerUp の ThrottleStop.sys ドライバー(CVE-2025-7771)の完全な概念実証。
署名済みで現在もロード可能なカーネルドライバーが、検証されていない物理メモリの読み取りと
書き込みを 2 つの IOCTL を通じて公開している。このリポジトリは、そのプリミティブを
動作する管理者から SYSTEM へのローカル特権昇格に変え、ほとんどのパスおよびファイル名
ベースの検出を無効化するデバイス命名の癖を文書化する。
同じ IOCTL に対する PoC はすでに存在していた(クレジット参照)。これはプリミティブの デモンストレーションではなく、独立した完全なエクスプロイトチェーンである。
| フィールド | 値 |
|---|---|
| SHA256 | 16F83F056177C4EC24C7E99D01CA9D9D6713BD0497EEEDB777A3FFEFA99C97F0 |
| SHA1 | 82ED942A52CDCF120A8919730E00BA37619661A3 |
| MD5 | 6BC8E3505D9F51368DDF323ACB6ABC49 |
| バージョン | 3.0.0.0 ("Low-Level Driver", 2004-2020) |
| 署名者 | TechPowerUp LLC, DigiCert EV Code Signing |
| 証明書サムプリント | 524EDA9C819321C66E22C7BABEB23DAEAFFB2182 |
| 証明書有効期間 | 2019-08-10 から 2022-06-15 |
証明書は 2022 年に失効しているが、署名には信頼されたカウンター署名タイムスタンプが 付いているため、Windows は依然としてロードする。失効が有効なのは、その日付が署名時刻 より前である場合のみであり、このような古いドライバーでは稀である。
バージョンリソースには CompanyName、OriginalFilename、InternalName が存在しない
ため、ファイル自体のメタデータからベンダーを特定することはできない。
2 つの IOCTL が、境界チェックやアドレス検証なしに物理メモリを読み書きする:
| IOCTL | 操作 |
|---|---|
0x80006498 | 物理読み取り |
0x8000649C | 物理書き込み |
どちらも METHOD_BUFFERED であるため、ユーザーポインターの逆参照は存在しない。
欠陥は、呼び出し元が指定した物理アドレスの検証が欠如していることであり、
チェックされていないポインターではない。
注目すべき点: 書き込みハンドラー 0x8000649C は FILE_READ_ACCESS として宣言されている。
読み取り専用で開かれたハンドルでも物理書き込みを発行できるため、宣言されたアクセス
マスクはハンドラーが実際に行う動作と一致していない。
デバイスを開くには管理者権限が必要であるため、これ自体は特権境界の越境ではない。 すでに管理者である攻撃者に与えるものは、ユーザーモードからの任意のカーネル読み書きであり、 これは管理者の上位で維持されるべき保護、すなわち HVCI コード整合性、PPL、および EDR/AV の自己保護を無効化する。典型的な bring-your-own-vulnerable-driver である。
具体的なデモンストレーションとして、PoC は R/W プリミティブを使用して SYSTEM トークンを 窃取し、SYSTEM シェルを起動する。
CVSS 4.0: AV:L/AC:H/AT:N/PR:H/UI:N/VC:H/VI:H/VA:H/SC:H/SI:H/SA:H (8.7, High)。
すべてはドライバーの物理 R/W IOCTL に対してユーザーモードから実行される。ページテーブル の走査や CR3 は関与せず、両方のプロセスは物理メモリを直接スキャンすることで特定される:
ImageFileName が System で UniqueProcessId が 4 である
EPROCESS を求めて物理メモリをスキャンする。スキャンは、推測されたウィンドウではなく、
ファームウェアの HARDWARE\RESOURCEMAP\...\Physical Memory レジストリキーから読み取った
実装済み RAM 範囲に限定されるため、MMIO ホールには決して触れず、インストール済み RAM
より上の領域も見逃さない。Token フィールド
(EPROC_TOKEN)を読み取る。Token スロットに書き込む。
トークンは _EX_FAST_REF であるため、デフォルトでは下位の参照カウントビットが
マスクされる(--mask で動作を選択する)。cmd.exe を起動する; whoami が NT AUTHORITY\SYSTEM を返す。オフセット(EPROC_TOKEN、EPROC_PID、EPROC_IMG_NAME など)は特定のビルド向けであり、
対象の Windows バージョンで dt nt!_EPROCESS に対して確認する必要がある。
実行ファイル名が重要である。ステップ 3 は物理メモリ内の ImageFileName を照合して
自プロセスを特定し、そのフィールドは 15 文字に制限され、スキャンは最初の 8 文字を照合する。
コンパイル後の名前は短く特徴的なものに保つこと。バイナリの名前を変更する場合は、
この制限内に収めないと自己スキャンがプロセスを見つけられない。
ドライバーは固定のデバイス名を使用しない。デバイスオブジェクト名は、登録されている
サービス名から導出され、ディスク上のファイル名は無関係である。バイナリをサービス
TRIXX として登録すると、ディスク上のファイルが何と呼ばれていても \\.\TRIXX が生成される。
したがって、\Device\ThrottleStop や ThrottleStop.sys に基づく検出は容易に回避される。
検出はファイルハッシュまたは署名証明書に基づく必要がある:
SHA256: 16F83F056177C4EC24C7E99D01CA9D9D6713BD0497EEEDB777A3FFEFA99C97F0
Thumbprint: 524EDA9C819321C66E22C7BABEB23DAEAFFB2182
Subject: CN=TechPowerUp LLC, O=TechPowerUp LLC, L=Spokane, S=Washington, C=US
ソース内の DEVICE_NAMES リストは、既知の製品インストールを探るための単なるプローブ
である。自分で登録したサービスを対象にするには、デバイス名を引数として渡す。
| CVE | ドライバー |
|---|---|
| CVE-2019-7245 | GPU-Z.sys |
| CVE-2025-5324 | GPU-Z.sys |
| CVE-2025-7771 | ThrottleStop.sys (このリポジトリ) |
バイナリはここには同梱されていない。いかなるコピーも上記の SHA256 に対して検証すること。 このサンプルは LOLDrivers に カタログ化されている。
cl /nologo /EHsc /W4 /O2 src\ThrottleStop.cpp /Fe:myLittleLpe.exe /link advapi32.lib
ラボでの使用のみ。ロールバック用のスナップショットを備えた分離された VM 内で実行すること。
sc.exe create <name> type= kernel binPath= C:\path\to\ThrottleStop.sys
sc.exe start <name>
myLittleLpe.exe
sc.exe stop <name>
sc.exe delete <name>
バイナリは引数を取らない。物理メモリマップを出力し、SYSTEM とローカルの EPROCESS を
スキャンし、トークンを交換し、NT AUTHORITY\SYSTEM として実行される cmd.exe を起動する。

同じドライバーに関する他の公開研究、比較用:
防御研究および検出エンジニアリングのために公開されている。この脆弱性はすでに CVE-2025-7771 として公開されている。ここにあるすべては、著者が所有するシステムで テストされた。所有していない、またはテストを許可されていないシステムに対してこれを 実行しないこと。