朝起きたら、React・Next.js に重大脆弱性が発生!【CVE-2025-55182・66478】
React・Next.jsに発生した恐ろしい脆弱性
はじめに

翻訳 : React Server Components における重大な脆弱性(CVE-2025-55182)が、責任ある形で公開されました。この脆弱性は、React 19 およびそれを利用するフレームワーク(Next.js を含む、CVE-2025-66478)に影響します。
今朝、Vercel からこのようなメールが届きました。自分の運営しているウェブプロジェクトで Next.js を使用しているため、すぐにリポジトリのセキュリティタブを確認しました。その結果、Dependabot が CVE-2025-66478 脆弱性に関する警告チケットを開いており、深刻度はなんと Critical(10/10) でした!
React プロジェクトを開発している方は、念のため一度確認してみてください!

この状況に早く対応するため、脆弱性が修正されたバージョンへ react、react-dom、そして next パッケージをアップグレードし、その後、脆弱性の詳細内容を調査し始めました。
脆弱性調査
この記事は Security Advisory: CVE-2025-66478を参考しました。
CVE-2025-66478
CVE-2025-66478は CVSS スコアが最大の10.0で非常に深刻な脆弱性です。この脆弱性は、攻撃者が RSC(React Server Components) プロトコルを悪用して RCE(Remote Code Execution) 攻撃を行えるようにしてしまいます。
また、CVE-2025-66478 は CVE-2025-55182 に由来する脆弱性で、両者の違いは以下のとおりです。
-
CVE-2025-66478: next パッケージに関する脆弱性 -
CVE-2025-55182: RSC(React Server Components) プロトコルに関する脆弱性- 影響を受けるパッケージ :
react-server-dom-webpack: < 19.2.0,react-server-dom-turbopack: < 19.2.0
- 影響を受けるパッケージ :
CVE-2025-55182
脆弱性分析
関連 PR : facebook/react/pull/35277
CVE-2025-55182 の根本原因は、React プロジェクト内の requireModule 関数にあります。この関数は、バンドラが提供するランタイムの require 関数(parcelRequire)を使ってモジュールレジストリから対象モジュールを読み込み、そこから指定されたエクスポートを返すヘルパー関数です。
// 脆弱な実装
export function requireModule<T>(metadata: ClientReference<T>): T {
const moduleExports = parcelRequire(metadata[ID]);
return moduleExports[metadata[NAME]];
}
既存の実装は metadata[NAME] 値を検証せず、すぐに moduleExports[metadata[NAME]] にアクセスします。その結果、メタデータ操作を通じて、意図しないプロパティにアクセスができました。これを防ぐために修正したコードは次のとおりです。
// 修正後の実装
export function requireModule<T>(metadata: ClientReference<T>): T {
const moduleExports = parcelRequire(metadata[ID]);
if (hasOwnProperty.call(moduleExports, metadata[NAME])) {
return moduleExports[metadata[NAME]];
}
return (undefined: any);
}
修正後の実装では hasOwnProperty.call を使用して moduleExportsが metadata[NAME] に対応するプロパティを実際に持っているのかを確認します。もしそうでなかった場合は undefined を返し、任意のプロパティへのアクセスを防ぎます。
攻撃の再現
ejpir/CVE-2025-55182-poc リポジトリを参考しました。
$ git clone git@github.com:ejpir/CVE-2025-55182-poc.git
$ cd CVE-2025-55182-poc
$ npm install
$ npm run start
$ npm run exploit # RCE 攻撃(vm#runInThisContext)
これらのコマンドを実行して、脆弱性があるサーバを起動し、RCEを試すことができます。exploit スクリプト以外にも、攻撃に利用可能な RCE ガジェットは次のとおりです。
| ガジェット | 説明 |
|---|---|
vm#runInThisContext |
現在のコンテキストで任意の JS コード実行 |
vm#runInNewContext |
新しいコンテキスト(sandbox)で任意の JS コード実行 |
child_process#execSync |
shell コマンド実行 |
child_process#execFileSync |
バイナリファイル実行 |
child_process#spawnSync |
新しいプロセス生成 |
fs#readFileSync |
任意のファイル読み込み |
fs#writeFileSync |
任意のファイル保存 |
恐ろしいです
まとめ
CVE-2025-66478 と CVE-2025-55182 は Reactに大きな衝撃を与え、特定のライブラリやフレームワークに依存する多くのウェブアプリケーションのセキュリティに深刻な脅威となり得ることを示しました。
番外: Cloudflareの対応
Cloudflare WAF proactively protects against React vulnerability
Cloudflare は今回の脆弱性に対応するため、全ての WAF 利用者に対して CVE-2025-55182 をブロックするルールを早期に適用しました。(Cloudflareマジ神)
また、2025.12.05 Cloudflare 障害 の原因は、この脆弱性への対応の過程で発生したものです。
Discussion