【緊急警告】React/Next.js の RSC 機能に CVSS 10.0 の RCE 脆弱性「CVE-2025-55182」が発覚
2025 年 12 月 3 日、React と Next.js のエコシステム全体を揺るがす、史上最高レベルの深刻な脆弱性が公表されました。CVSS スコア 10.0(最高評価)を受けたこの脆弱性「CVE-2025-55182」は、認証なしでサーバー上の任意のコードを実行可能という、極めて危険な問題です。
公開からわずか数時間で、中国系の脅威アクターグループ「Earth Lamia」による攻撃試行が確認されており、まさに緊急対応が必要な事態となっています。本記事では、この脆弱性の詳細、影響範囲、そして今すぐ取るべき対策について、初心者の方にもわかりやすく解説いたします。
背景
React Server Components(RSC)とは
React Server Components(RSC)は、React 18 で実験的に導入され、React 19 で正式に提供された新しい機能です。これにより、サーバーサイドでコンポーネントをレンダリングし、クライアントに最小限のデータのみを送信できるようになりました。
従来のサーバーサイドレンダリング(SSR)と異なり、RSC はコンポーネント単位でサーバーとクライアントを分離できます。これにより、パフォーマンス向上やバンドルサイズの削減など、多くのメリットが得られるようになりました。
RSC の通信プロトコル「Flight」
RSC では、サーバーとクライアント間のデータ通信に「Flight」と呼ばれる独自プロトコルを使用します。このプロトコルは、React のコンポーネントツリーやプロップス(props)などのデータをシリアライズ(直列化)してクライアントに送信する仕組みです。
以下の図は、RSC における基本的なデータフローを示しています。
mermaidflowchart TB
client["クライアント<br/>(ブラウザ)"] -->|リクエスト| server["Next.js サーバー"]
server -->|RSC データ<br/>Flight プロトコル| serializer["シリアライザー"]
serializer -->|ペイロード| network["ネットワーク"]
network -->|受信| deserializer["デシリアライザー"]
deserializer -->|React要素| client
style serializer fill:#e1f5ff
style deserializer fill:#ffe1e1
この図から分かるように、サーバー側でシリアライズされたデータが、クライアント側でデシリアライズ(復元)されます。今回の脆弱性は、このデシリアライズ処理に存在していました。
影響を受けるパッケージとバージョン
この脆弱性は、以下の React 19 系のパッケージに存在します。
| # | パッケージ名 | 脆弱なバージョン | 修正バージョン |
|---|---|---|---|
| 1 | react-server-dom-webpack | 19.0.0, 19.1.0, 19.1.1, 19.2.0 | 19.0.1, 19.1.2, 19.2.1 |
| 2 | react-server-dom-parcel | 19.0.0, 19.1.0, 19.1.1, 19.2.0 | 19.0.1, 19.1.2, 19.2.1 |
| 3 | react-server-dom-turbopack | 19.0.0, 19.1.0, 19.1.1, 19.2.0 | 19.0.1, 19.1.2, 19.2.1 |
また、Next.js においても同様の脆弱性が「CVE-2025-66478」として報告されています。
| # | Next.js バージョン | 修正バージョン |
|---|---|---|
| 1 | 16.0.0 〜 16.0.6 | 16.0.7 |
| 2 | 15.5.0 〜 15.5.6 | 15.5.7 |
| 3 | 15.4.0 〜 15.4.7 | 15.4.8 |
| 4 | 15.3.0 〜 15.3.5 | 15.3.6 |
| 5 | 15.2.0 〜 15.2.5 | 15.2.6 |
| 6 | 15.1.0 〜 15.1.8 | 15.1.9 |
| 7 | 15.0.0 〜 15.0.4 | 15.0.5 |
さらに、react-router、waku、@parcel/rsc、@vitejs/plugin-rsc、rwsdk などのフレームワークやバンドラーも影響を受けます。
課題
CVSS 10.0 という最高スコアの意味
CVSS(Common Vulnerability Scoring System)は、脆弱性の深刻度を評価する国際的な標準規格です。スコアは 0.0 から 10.0 の範囲で評価され、10.0 は最高レベルの深刻度を示します。
今回の CVE-2025-55182 が CVSS 10.0 を獲得した理由は、以下の条件がすべて揃っているためです。
| # | 評価項目 | CVE-2025-55182 の状況 |
|---|---|---|
| 1 | 攻撃元区分 | ネットワーク経由で攻撃可能 |
| 2 | 攻撃条件の複雑さ | 低い(簡単に攻撃できる) |
| 3 | 必要な特権レベル | なし(認証不要) |
| 4 | 利用者の関与 | 不要(自動的に攻撃可能) |
| 5 | 影響の範囲 | 機密性、完全性、可用性のすべてに重大な影響 |
これらの条件により、攻撃者は認証なしで、ネットワーク経由で簡単にサーバー上の任意のコードを実行できてしまいます。
安全でないデシリアライゼーション(Insecure Deserialization)
今回の脆弱性の根本原因は、「安全でないデシリアライゼーション」です。これは OWASP Top 10 にも含まれる、非常に危険な脆弱性のタイプとなります。
デシリアライゼーションとは、シリアライズされたデータ(文字列やバイト列)を元のオブジェクトに復元する処理のことです。この処理において、攻撃者が細工したデータを適切に検証せずに復元すると、任意のコードが実行されてしまう可能性があります。
以下の図は、攻撃のフローを示しています。
mermaidsequenceDiagram
participant attacker as 攻撃者
participant endpoint as Server Function<br/>エンドポイント
participant rsc as RSC デシリアライザー
participant server as サーバー
attacker->>endpoint: 悪意あるペイロードを含む<br/>HTTP リクエスト
endpoint->>rsc: ペイロードを<br/>デシリアライズ処理へ
rsc->>rsc: 検証なしで<br/>オブジェクト復元
rsc->>server: 任意のコード実行
server-->>attacker: 攻撃成功<br/>(サーバー制御)
Note over attacker,server: 認証不要で攻撃可能
この図から分かるように、攻撃者は Server Function のエンドポイントに対して悪意のあるペイロードを送信するだけで、サーバー上で任意のコードを実行できてしまいます。
デフォルト設定で脆弱
最も懸念すべき点は、デフォルト設定のままで脆弱性が存在するということです。
create-next-app で作成した標準的な Next.js アプリケーションを本番環境にデプロイしただけで、開発者が何も設定を変更していなくても、この脆弱性の影響を受けてしまいます。
つまり、以下のようなシンプルなアプリケーションでも攻撃対象になりえます。
typescript// app/page.tsx
export default function Home() {
return (
<main>
<h1>Hello, World!</h1>
</main>
);
}
このような最小限のコードであっても、Next.js 15.x 系や 16.0.x 系を使用している場合、脆弱性の影響を受ける可能性があります。
既に攻撃が確認されている
Amazon の脅威インテリジェンスチームによると、脆弱性が公開されてからわずか数時間で、中国系の脅威アクターグループ「Earth Lamia」による攻撃試行が確認されています。
この迅速な攻撃は、攻撃者がゼロデイ攻撃(脆弱性が公開される前から準備していた攻撃)を行った可能性も示唆しており、非常に深刻な状況です。
解決策
即座にアップデートを実施する
最も重要な対策は、今すぐパッケージをアップデートすることです。以下の手順で、使用しているパッケージのバージョンを確認し、必要に応じてアップデートを行いましょう。
ステップ 1:現在のバージョンを確認
まず、プロジェクトで使用している React と Next.js のバージョンを確認します。
bash# package.json の内容を確認
cat package.json | grep -E "(react|next)"
または、Yarn を使用している場合は以下のコマンドでも確認できます。
bash# インストールされているパッケージのバージョンを確認
yarn list --pattern "react|next"
ステップ 2:脆弱性の有無を判定
前述の表と照らし合わせて、使用しているバージョンが脆弱かどうかを確認してください。
React 19.0.0、19.1.0、19.1.1、19.2.0 のいずれかを使用している場合、または Next.js 15.0.0 〜 16.0.6 の範囲にある場合は、脆弱性の影響を受けています。
ステップ 3:パッケージをアップデート
脆弱性が確認された場合、以下のコマンドで安全なバージョンにアップデートします。
bash# Next.js を最新の修正バージョンにアップデート
yarn add next@latest
React の場合は、使用しているバージョンに応じて以下のコマンドを実行してください。
bash# React 19.0 系を使用している場合
yarn add react@19.0.1 react-dom@19.0.1
# React 19.1 系を使用している場合
yarn add react@19.1.2 react-dom@19.1.2
# React 19.2 系を使用している場合
yarn add react@19.2.1 react-dom@19.2.1
ステップ 4:依存関係の更新を確認
パッケージマネージャーのロックファイルも更新されていることを確認します。
bash# yarn.lock が更新されていることを確認
git diff yarn.lock
ステップ 5:アプリケーションを再ビルド
アップデート後、必ずアプリケーションを再ビルドしてください。
bash# 既存のビルドをクリーンアップ
rm -rf .next
# 本番用にビルド
yarn build
ステップ 6:テストと再デプロイ
ローカル環境でアプリケーションが正常に動作することを確認した後、本番環境に再デプロイします。
bash# ローカルで本番モードを起動して確認
yarn start
問題がなければ、本番環境にデプロイしてください。
WAF(Web Application Firewall)による緩和策
アップデートが即座にできない場合の一時的な緩和策として、WAF(Web Application Firewall)の利用が推奨されます。
Cloudflare は、CVE-2025-55182 に対する保護ルールを自動的に有効化しています。Cloudflare を利用している場合、WAF が攻撃をブロックしてくれますが、これはあくまで一時的な対策であり、根本的な解決にはなりません。
以下の表は、各種 WAF サービスの対応状況をまとめたものです。
| # | サービス名 | CVE-2025-55182 対応 | 備考 |
|---|---|---|---|
| 1 | Cloudflare WAF | 自動有効化済み | プロアクティブに保護 |
| 2 | AWS WAF | カスタムルール作成可能 | 手動設定が必要 |
| 3 | Azure WAF | カスタムルール作成可能 | 手動設定が必要 |
WAF を使用する場合でも、必ずパッケージのアップデートを優先してください。
セキュリティモニタリングの強化
脆弱性への対応と並行して、以下のセキュリティモニタリングを強化することも重要です。
| # | モニタリング項目 | 確認ポイント |
|---|---|---|
| 1 | 不審なネットワークトラフィック | Server Function エンドポイントへの異常なリクエスト |
| 2 | サーバーログの監視 | エラーログや予期しないコード実行の痕跡 |
| 3 | システムリソースの使用状況 | CPU やメモリの異常な使用パターン |
| 4 | ファイルシステムの変更 | 予期しないファイルの作成や変更 |
これらのモニタリングにより、万が一攻撃を受けた場合でも、早期に検知して対応することが可能になります。
具体例
脆弱性の影響を受けるコード例
以下は、Server Actions を使用した典型的な Next.js のコード例です。このコードは、脆弱なバージョンの Next.js で実行されている場合、攻撃の対象となり得ます。
typescript// app/actions.ts
'use server';
// Server Action の定義
export async function submitForm(formData: FormData) {
const name = formData.get('name');
const email = formData.get('email');
// データベースに保存する処理
await saveToDatabase({ name, email });
return { success: true };
}
上記のような Server Action のエンドポイントに対して、攻撃者は悪意のあるペイロードを送信できます。
typescript// app/page.tsx
import { submitForm } from './actions';
export default function ContactForm() {
return (
<form action={submitForm}>
<input type='text' name='name' />
<input type='email' name='email' />
<button type='submit'>送信</button>
</form>
);
}
このようなシンプルなフォームでも、バックエンドの Server Action が攻撃の入り口となる可能性があります。
攻撃のシナリオ
以下の図は、実際の攻撃がどのように行われるかを示しています。
mermaidflowchart TD
A["攻撃者"] -->|1. 脆弱性スキャン| B["ターゲット特定"]
B -->|2. 悪意のあるペイロード作成| C["RCEペイロード"]
C -->|3. HTTPリクエスト送信| D["Server Function<br/>エンドポイント"]
D -->|4. デシリアライズ処理| E["脆弱なRSCコード"]
E -->|5. コード実行| F["任意のコマンド実行"]
F -->|6a. データ窃取| G["機密情報漏洩"]
F -->|6b. バックドア設置| H["永続的アクセス確保"]
F -->|6c. ラテラルムーブメント| I["内部ネットワーク侵入"]
style E fill:#ffe1e1
style F fill:#ff9999
style G fill:#ffcccc
style H fill:#ffcccc
style I fill:#ffcccc
図で理解できる要点:
- 攻撃は 6 つのステップで完了し、認証は一切不要
- デシリアライズ処理が攻撃の核心部分
- RCE 成功後、複数の攻撃経路が開かれる
アップデート後の確認方法
パッケージをアップデートした後、脆弱性が修正されていることを確認する方法をご紹介します。
方法 1:npm audit を使用
npm の監査機能を使用して、既知の脆弱性がないか確認できます。
bash# npm を使用している場合
npm audit
# Yarn を使用している場合
yarn audit
出力結果に CVE-2025-55182 や CVE-2025-66478 が含まれていないことを確認してください。
方法 2:パッケージバージョンの直接確認
アップデート後のバージョンが正しいか、以下のコマンドで確認します。
bash# Next.js のバージョン確認
yarn list --pattern "next" --depth=0
bash# React のバージョン確認
yarn list --pattern "react" --depth=0
方法 3:ビルドログの確認
ビルド時のログを確認し、警告やエラーが出ていないかチェックします。
bash# ビルドを実行してログを確認
yarn build 2>&1 | tee build.log
正常にビルドが完了し、セキュリティ警告が表示されないことを確認してください。
Vercel でのデプロイ時の注意点
Vercel を使用している場合、自動デプロイの設定によっては、古いバージョンのパッケージがキャッシュされている可能性があります。
以下の手順で、確実にアップデートされたバージョンがデプロイされるようにしましょう。
ステップ 1:キャッシュのクリア
Vercel のダッシュボードから、プロジェクトの設定を開き、Build & Development Settings で「Clear Cache」を実行します。
ステップ 2:環境変数の確認
NEXT_PUBLIC_ で始まる環境変数が正しく設定されているか確認してください。
ステップ 3:再デプロイ
変更を GitHub にプッシュして、自動デプロイをトリガーします。
bash# 変更をコミット
git add package.json yarn.lock
git commit -m "fix: Update Next.js to patch CVE-2025-55182"
# リモートにプッシュ
git push origin main
ステップ 4:デプロイメントログの確認
Vercel のダッシュボードでデプロイメントログを確認し、正しいバージョンがインストールされていることを確認します。
ログに以下のような記載があることを確認してください。
perlInstalling dependencies...
next@15.5.7
react@19.2.1
react-dom@19.2.1
まとめ
CVE-2025-55182 は、React と Next.js のエコシステムにおける史上最高レベルの脆弱性であり、CVSS スコア 10.0 という最高評価を受けています。
この脆弱性の最も深刻な点は、認証なしでリモートコード実行が可能であり、デフォルト設定のままで攻撃を受ける可能性があることです。さらに、公開からわずか数時間で実際の攻撃が確認されており、緊急の対応が必要な状況となっています。
対策としては、以下の 3 点が重要です。
第一に、今すぐパッケージをアップデートすることが最優先です。React 19.0.1、19.1.2、19.2.1、または Next.js の修正バージョン(15.0.5 以降、16.0.7 以降)に更新してください。
第二に、アップデートが即座にできない場合は、WAF による一時的な保護を検討してください。ただし、これは根本的な解決策ではなく、あくまで緊急の緩和策です。
第三に、セキュリティモニタリングを強化し、不審なアクティビティを早期に検知できる体制を整えてください。
この脆弱性は、サーバーサイドの新機能を導入する際のセキュリティ検証の重要性を改めて示すものとなりました。今後も React や Next.js を安全に使用するために、公式のセキュリティアドバイザリを定期的に確認し、迅速にアップデートを行う習慣を身につけることが大切です。
開発者の皆様におかれましては、一刻も早くアップデートを実施し、アプリケーションとユーザーの安全を守っていただきますようお願いいたします。
関連リンク
- React 公式ブログ:Critical Security Vulnerability in React Server Components
- Wiz Blog:Critical RCE Vulnerabilities Discovered in React & Next.js
- Aikido Security:Critical React & Next.js RCE Vulnerability CVE-2025-55182 Fix Guide
- Palo Alto Networks Unit 42:Critical Vulnerabilities in React Server Components and Next.js
- The Hacker News:Critical RSC Bugs in React and Next.js Allow Unauthenticated Remote Code Execution
- Vercel Changelog:Summary of CVE-2025-55182
- Cloudflare Blog:WAF proactively protects against React vulnerability
- Help Net Security:Max-severity vulnerability in React, Node.js patched
article【緊急警告】React/Next.js の RSC 機能に CVSS 10.0 の RCE 脆弱性「CVE-2025-55182」が発覚
articleReact の最新動向まとめ:Server Components・並列レンダリング・エコシステム俯瞰
articleReact で管理画面を最短構築:テーブル・フィルタ・権限制御の実例
articleReact でデータ取得を最適化:TanStack Query 基礎からキャッシュ戦略まで実装
articleReact クリーンアーキテクチャ実践:UI・アプリ・ドメイン・データの責務分離
articleReact フック完全チートシート:useState から useTransition まで用途別早見表
article【緊急警告】React/Next.js の RSC 機能に CVSS 10.0 の RCE 脆弱性「CVE-2025-55182」が発覚
articleNext.js の キャッシュ無効化設計:タグ・パス・スケジュールの 3 軸でコントロール
articleNext.js Metadata API 逆引き:`robots`/`alternates`/`openGraph`/`twitter` の記入例
articleNext.js を Bun で動かす開発環境:起動速度・互換性・落とし穴
articleNext.js Edge Runtime vs Node Runtime:TTFB・コールドスタート・コストを実測検証
articleNext.js の Route Handlers で multipart/form-data が受け取れない問題の切り分け術
article【緊急警告】React/Next.js の RSC 機能に CVSS 10.0 の RCE 脆弱性「CVE-2025-55182」が発覚
articleWebSocket Close コード早見表:正常終了・プロトコル違反・ポリシー違反の実務対応
articleStorybook 品質ゲート運用:Lighthouse/A11y/ビジュアル差分を PR で自動承認
articleWebRTC で高精細 1080p/4K 画面共有:contentHint「detail」と DPI 最適化
articleSolidJS フォーム設計の最適解:コントロール vs アンコントロールドの棲み分け
articleWebLLM 使い方入門:チャット UI を 100 行で実装するハンズオン
blogiPhone 17シリーズの発表!全モデルiPhone 16から進化したポイントを見やすく整理
blogGoogleストアから訂正案内!Pixel 10ポイント有効期限「1年」表示は誤りだった
blog【2025年8月】Googleストア「ストアポイント」は1年表記はミス?2年ルールとの整合性を検証
blogGoogleストアの注文キャンセルはなぜ起きる?Pixel 10購入前に知るべき注意点
blogPixcel 10シリーズの発表!全モデル Pixcel 9 から進化したポイントを見やすく整理
blogフロントエンドエンジニアの成長戦略:コーチングで最速スキルアップする方法
review今の自分に満足していますか?『持たざる者の逆襲 まだ何者でもない君へ』溝口勇児
reviewついに語られた業界の裏側!『フジテレビの正体』堀江貴文が描くテレビ局の本当の姿
review愛する勇気を持てば人生が変わる!『幸せになる勇気』岸見一郎・古賀史健のアドラー実践編で真の幸福を手に入れる
review週末を変えれば年収も変わる!『世界の一流は「休日」に何をしているのか』越川慎司の一流週末メソッド
review新しい自分に会いに行こう!『自分の変え方』村岡大樹の認知科学コーチングで人生リセット
review科学革命から AI 時代へ!『サピエンス全史 下巻』ユヴァル・ノア・ハラリが予見する人類の未来