React Server Components RCE脆弱性(CVE-2025-55182)への対応記録
2025年12月3日、React Server Components(RSC)とNext.jsにおいて、認証不要でリモートコード実行(RCE)が可能となる重大な脆弱性が公表されました。この記事では、この脆弱性の深刻度、CVE番号の統合経緯、そして当ブログでの対応状況について記録します。 CVE-2025-55182は、React 19のServer Components(RSC)における「Flight」プロトコルの安全でないデシリアライゼーション(deserialize)に起因する脆弱性です。 主な特徴は次の通りです。 この脆弱性は、RSCの内部通信プロトコルである「Flight」の処理において、攻撃者の制御可能なデータを適切な検証なしにデシリアライズしてしまうことに起因します。攻撃者からペイロードを含むHTTPリクエストが送信されると、サーバー側ではこれをFlightプロトコルのデータとして処理し、検証なしにデシリアライズします。この結果、任意のコードを実行される可能性があります。 重要なのは、この処理がアプリケーションの認証ロジックより前、つまりMiddlewareでの保護より深い層で行われるため、通常の認証機構では防げないという点です。 2025年12月3日時点では、以下の2つのCVE番号で追跡されていました。 調査の結果、Next.jsの脆弱性は実質的にReactの脆弱性に起因することが判明し、CVE-2025-66478は重複として却下されました。現在はCVE-2025-55182に統合されています。 この経緯は、脆弱性の根本原因がReactのRSC実装そのものにあり、Next.jsはその影響を受けていたに過ぎないことを示しています。 注: Next.js 13.x、14.x stable版、Pages Router、Edge Runtimeは影響を受けません。 この脆弱性は公表直後から実際に悪用されています。 この脆弱性は「React2Shell」または「React4Shell」という名称でも呼ばれ、既に実証コード(PoC)が公開されています。 以下のパッケージを修正版にアップデートしました。 当ブログはCVE-2025-55182に完全対応済みであり、この脆弱性の影響を受けない安全な状態です。 Next.jsやReactを使用しているプロジェクトをお持ちの方は、以下の対応を推奨します。 まず現在のバージョンを確認します。 該当する場合は、直ちに修正版へアップデートしてください。 アップデート後は速やかにビルドとデプロイを実施してください。 CVE-2025-55182は、React Server Componentsの根本的な脆弱性であり、 CVSS 10.0という最大の深刻度を持つ重大な問題です。デフォルト設定で脆弱であり、認証を回避して攻撃可能という特性から、速やかな対応が必要です。 当ブログでは公表から2日以内に対応を完了しましたが、既に実際の攻撃が観測されているため、まだ対応されていない方は最優先で対応することを強く推奨します。脆弱性の概要
CVE-2025-55182とは
create-next-appにより作成した標準的なNext.jsアプリケーションが影響を受ける技術的な仕組み
CVE番号の統合経緯
影響を受けるバージョンと修正版
React / React-dom
影響を受けるバージョン 修正済みバージョン 19.0.0 19.0.1 19.1.0, 19.1.1 19.1.2 19.2.0 19.2.1 Next.js
影響を受けるバージョン 修正済みバージョン 15.x(全般) 15.0.5, 15.1.9, 15.2.6, 15.3.6, 15.4.8, 15.5.7 16.x(全般) 16.0.7 14.3.0-canary.77以降 (14.x Stable版は影響なし) 実際の攻撃状況
当ブログでの対応状況
対応タイムライン
実施した対応
# 実施したアップデート
React: 19.0.0 → 19.2.1
React-dom: 19.0.0 → 19.2.1
Next.js: 15.2.3 → 15.5.7
@next/mdx: 15.2.3 → 15.5.7
eslint-config-next: 15.2.3 → 15.5.7推奨される対応
1. バージョンの確認
npm list next react react-dom2. 修正版へのアップデート
# npm の場合
npm install next@latest react@latest react-dom@latest
# yarn の場合
yarn add next@latest react@latest react-dom@latest
# pnpm の場合
pnpm add next@latest react@latest react-dom@latest3. 内部依存関係の確認
package.jsonだけでなく、ロックファイル(package-lock.json、yarn.lockなど)も確認し、内部依存関係として古いバージョンが残っていないか確認することを強く推奨します。# ロックファイル内のReactバージョンを確認
grep -A5 '"react":' package-lock.json
grep -A5 '"next":' package-lock.json4. デプロイ
npm run build
# デプロイコマンドを実行まとめ
参考リンク