Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
CVE-2025-55182-analysis | Kitploit
ツール/GitHubGitHub/santihabib/cve-2025-55182-analysis
脆弱性分析エクスプロイトウェブアプリケーション悪用ウェブセキュリティペネトレーションテスト学習と教育
GitHubsantihabib/cve-2025-55182-analysis

CVE-2025-55182-analysis

リポジトリを見る
48ヶ月前未レビュー

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

CVE-2025-55182 の技術分析: 私の研究の道のり

⚠️ 重要な免責事項

この文書は、CVE-2025-55182 に関する私の個人的な研究プロセス、確認済みの調査結果、および私が実施した実験について説明するものです。これは、初期の誤った仮定と最終的な突破口を含む、私の調査の正直な記録です。


エグゼクティブサマリー

CVE-2025-55182(CVSS 10.0)に関する徹底的な調査の結果、私の当初の結論は、自動化された RCE は公に実証されておらず、悪用にはアプリケーション固有のガジェットが必要であるというものでした。この結論は誤りでした。

2025年12月5日、X(@maple3142)で別の独立した研究者から追加の洞察を得た後、私はアプリケーション固有のコードの脆弱性を一切必要とせずに、バニラの Next.js 上で完全な未認証 RCE を再現することに成功しました。


研究方法

フェーズ1: パッチ分析(当初の誤った仮定)

私の当初の焦点は、React 19.0.1 パッチにおける最初の変更点でした。

脆弱なバージョン(19.0.0):

root@kitploit:~
return fn.bind.apply(fn, [null].concat(_ref));

パッチ適用後(19.0.1):

root@kitploit:~
if (Array.isArray(promiseValue)) {
  promiseValue = promiseValue.slice(0);
} else {
  promiseValue = [];
}

私は、攻撃経路は配列の代わりに悪意のあるオブジェクトを使った fn.bind.apply() 経由であると想定しました。攻撃者が制御する bound を使った $ACTION_REF_ によって Server Actions に引数インジェクションが可能であることを実証できました。

root@kitploit:~
curl -X POST http://localhost:9000/ \
  -F '$ACTION_REF_0=' \
  -F '$ACTION_0:0={"id":"<ACTION_ID>","bound":["; id #","/etc/passwd"]}'

結果: 引数は Server Action へのインジェクションに成功しました。ただし、これはターゲット関数がそれらの引数を安全でない方法で使用する場合にのみ RCE につながります。


フェーズ2: パッチで観察された安全でない動作

パッチを詳しく調べると、getOutlinedModel() にもう一つの重要な変更があることがわかりました。

脆弱なバージョン:

root@kitploit:~
for (key = 1; key < reference.length; key++)
  parentObject = parentObject[reference[key]];

パッチ適用後:

root@kitploit:~
if (hasOwnProperty.call(value, name)) {
  value = value[name];
}

この脆弱な動作により、次のような参照を使ったプロトタイプチェーントラバーサルが可能になりました。

root@kitploit:~
$1:__proto__:constructor:constructor

フェーズ3: Thenable と Function.constructor を使った実験(行き止まり)

調査中に、.then プロパティを含む thenable オブジェクトをテストしました。

root@kitploit:~
{"then": "$1:__proto__:constructor:constructor"}

JavaScript がこれを await で処理すると、以下のようになります。

  1. JavaScript は .then プロパティを認識し、オブジェクトを Promise として扱う
  2. obj.then(resolve, reject) を呼び出す
  3. then が Function.constructor に解決された場合、JavaScript は Function(resolve, reject) の実行を試みる

観察された結果:

root@kitploit:~
SyntaxError: Unexpected token 'function'
    at Object.Function [as then] (<anonymous>)

フェーズ4: 引数バインディングの制限(壁)

Function.constructor が次のように呼び出された場合:

root@kitploit:~
Function(resolve, reject)
// resolve.toString() = "function () { [native code] }"
// Function attempts to parse this as code → SyntaxError

resolve と reject の引数は常にネイティブの Promise 関数です。Function は最初の引数をソースコードとして解釈しようとしますが、これは無効な JavaScript です。

ここで私の研究は行き詰まりました。 Function.constructor への引数の制御は、アプリケーション固有のガジェットなしでは不可能だと結論付けました。


フェーズ5: 突破口 — Blob デシリアライゼーション(2025年12月5日)

私の初期の調査結果を公開した後、別の独立した研究者が、私が見落としていた重要なピースを指摘しました。$B(Blob)デシリアライゼーションシンクです。

欠けていたピース

コンパイル済みの React Flight サーバーコード(TypeScript ソースにはない)には、次のコードが存在します。

root@kitploit:~
case "B":
  return response._formData.get(response._prefix + id);

場所:

  • パッケージ: [email protected]
  • ファイル: cjs/react-server-dom-webpack-server.node.unbundled.development.js
  • こちらにも存在: [email protected]/dist/compiled/react-server-dom-webpack/

このコードにより、React は 検証なしで、攻撃者が制御する入力から導出された値を使って response._formData.get() を呼び出すことができます。

これがすべてを変える理由

アプローチFunction.constructor への引数結果
Thenable(フェーズ3)resolve, reject(ネイティブ関数)❌ SyntaxError
Blob + 汚染されたレスポンス_prefix(攻撃者が制御する文字列)✅ RCE

以下を組み合わせることで:

  1. プロトタイプトラバーサル($1:__proto__:then → Chunk.prototype.then)
  2. 以下の要素を持つ汚染された _response オブジェクト:
    • _formData.get が Function.constructor に設定されている
    • _prefix が任意の JavaScript コードに設定されている
  3. $B 参照を含む内部モデル

case "B": ハンドラは以下を実行します。

root@kitploit:~
Function.constructor("<attacker code>" + id)

これにより、引数バインディングの制限が完全に回避されます。


公開 PoC の分析

RCE を主張する一般的な GitHub PoC は、次のような Action ID を使用しています。

  • "child_process#execSync"
  • "vm#runInThisContext"

これらは偽物です。 Next.js はアプリケーションが定義した Action ID のみを受け入れます。無効な ID は次のエラーを生成します。

root@kitploit:~
TypeError: Cannot read properties of undefined (reading 'workers')

ただし、実際のエクスプロイトは偽の Action ID を必要としません。 有効な Server Action ID で動作します。


検証と影響

私はこのエクスプロイトチェーンを、以下の最小限の Next.js 15.0.3 + React 19.0.0 アプリケーションでテストしました。

root@kitploit:~
async function myAction(data) {
  "use server";
  console.log("Server Action called with:", data);
  return { success: true, received: data };
}

結果: 完全な RCE を確認しました。このアプリケーションには、安全でないコード、eval、execSync、ガジェットは一切含まれていません。

影響評価


重大な発見: パッチの状態

2025年12月5日時点で、$B シンクは Next.js 15.0.5(修正されたとされるバージョン)にまだ存在しています。

検証:

root@kitploit:~
$ npm pack [email protected]
$ tar -xzf next-15.0.5.tgz
$ grep -A5 'case "B":' package/dist/compiled/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.development.js

結果:

root@kitploit:~
case "B":
  return response._formData.get(response._prefix + obj);

コードは脆弱なバージョンと同一です。


責任ある開示に関する注記

この脆弱性が「修正済み」とされるバージョンで完全にパッチ適用されていない可能性があるという発見により、完全な実証コード(PoC)ペイロードは、Vercel と Meta のセキュリティチームによる検証が完了するまで開示を控えます。

この文書で提供される技術的詳細は、脆弱性のメカニズムを理解するのに十分ですが、即時の悪用を防ぐために意図的に不完全なものとなっています。


更新された結論

私が発見したこと(フェーズ1〜4)

技術状態
bound による引数インジェクション✅ 確認済み(影響は限定的)
プロトタイプトラバーサル✅ 確認済み
thenable 経由の Function.constructor へのアクセス

当初私が見落としていたこと

問題影響
$B(Blob)デシリアライゼーションシンク❌ 重大 - 引数の制御を可能にする
コンパイル済みコードとソースコードの両方の調査❌ シンクはコンパイル済み出力にのみ存在する
レスポンスオブジェクトの汚染メカニズム❌ すべての保護をバイパスできる

最終評価

CVE-2025-55182 は、バニラの Next.js アプリケーションに対する完全な未認証 RCE に悪用可能です。

  • ✅ アプリケーション固有のガジェットは不要
  • ✅ 単一の HTTP POST で動作
  • ✅ 「ガジェット」は React のデシリアライゼーションロジックに組み込まれている
  • ⚠️ 「修正済み」とされるバージョンで完全にパッチ適用されていない可能性がある

タイムライン

  • 2025年12月3日: プロトタイプトラバーサルと thenable アプローチの分析(行き止まり)
  • 2025年12月4日: 独立した研究者から $B デシリアライゼーションに関する洞察を得る
  • 2025年12月5日: 完全な RCE の再現を確認
  • 2025年12月5日: 「修正済み」バージョンでも脆弱性が残存する可能性を発見
  • 2025年12月5日: 本レポート公開(PoC の詳細は非開示)

推奨事項

  1. 直ちに最新バージョンの React と Next.js に更新する
  2. パッチを検証する - $B デシリアライゼーションが依然として任意の _response オブジェクトを受け付けるかテストする
  3. 悪用の試みを監視する - 以下に注意:
    • 異常な Next-Action ヘッダー
    • $@、__proto__、$B パターンを含む複雑なマルチパートペイロード
  4. WAF ルールの導入を検討する - Server Action リクエスト内の疑わしいパターンをブロックする
  5. 影響を受けるバージョンを本番環境で実行している場合は、セキュリティチームに連絡する

謝辞

  • $B デシリアライゼーションに関する突破口となる洞察は、X(@maple3142)の研究者によって提供されました
  • パッチに関する作業(検証中)を行っている React および Next.js のセキュリティチーム
  • 協力的な調査を行ったセキュリティ研究コミュニティ

学んだ教訓

  1. ソースコードだけでなく、コンパイル済みコードを調査する - 重大な脆弱性はバンドルされた出力に隠れている可能性がある
  2. 新しい情報が出てきたら前提を再検討する
  3. 協力的な研究は複雑な脆弱性に不可欠である
  4. プロセスを文書化する - 行き止まりは全体像を理解する上で貴重である
  5. 責任ある開示は公的な認知に優先する

最終更新日: 2025年12月5日

ツールをダウンロード
側面調査結果
認証は必要か?❌ 不要
アプリケーションガジェットは必要か?❌ 不要
バニラの Next.js で動作するか?✅ はい
必要なリクエスト数1 POST
影響を受けるバージョンNext.js ≤15.0.4 + React 19.0.0
CVSS スコア10.0(妥当)
✅ 確認済み(ただし単独では悪用不可)
脆弱なバージョンの検出✅ 確認済み