🛡️

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

に公開

React・Next.jsに発生した恐ろしい脆弱性

はじめに

Email from vercel security

翻訳 : React Server Components における重大な脆弱性(CVE-2025-55182)が、責任ある形で公開されました。この脆弱性は、React 19 およびそれを利用するフレームワーク(Next.js を含む、CVE-2025-66478)に影響します。

今朝、Vercel からこのようなメールが届きました。自分の運営しているウェブプロジェクトで Next.js を使用しているため、すぐにリポジトリのセキュリティタブを確認しました。その結果、Dependabot が CVE-2025-66478 脆弱性に関する警告チケットを開いており、深刻度はなんと Critical(10/10) でした!

React プロジェクトを開発している方は、念のため一度確認してみてください!

GitHub Security Alert for CVE-2025-66478

この状況に早く対応するため、脆弱性が修正されたバージョンへ reactreact-dom、そして next パッケージをアップグレードし、その後、脆弱性の詳細内容を調査し始めました。

脆弱性調査

この記事は Security Advisory: CVE-2025-66478を参考しました。

CVE-2025-66478

CVE-2025-66478CVSS スコアが最大の10.0で非常に深刻な脆弱性です。この脆弱性は、攻撃者が RSC(React Server Components) プロトコルを悪用して RCE(Remote Code Execution) 攻撃を行えるようにしてしまいます。

また、CVE-2025-66478CVE-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 を使用して moduleExportsmetadata[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-66478CVE-2025-55182 は Reactに大きな衝撃を与え、特定のライブラリやフレームワークに依存する多くのウェブアプリケーションのセキュリティに深刻な脅威となり得ることを示しました。

番外: Cloudflareの対応

Cloudflare WAF proactively protects against React vulnerability

Cloudflare は今回の脆弱性に対応するため、全ての WAF 利用者に対して CVE-2025-55182 をブロックするルールを早期に適用しました。(Cloudflareマジ神)

また、2025.12.05 Cloudflare 障害 の原因は、この脆弱性への対応の過程で発生したものです。

Discussion