React2Shell (CVE-2025-55182): RSCのデシリアライズゴースト

2025年の最後の数週間、ほとんどのエンジニアリングチームがホリデーフリーズの準備をしている中、現代のウェブセキュリティを根本から覆す脆弱性が浮上しました。これを「React2Shell」と呼び、CVE-2025-55182として追跡されています。この脆弱性は単なるバグではなく、React Server Components (RSC) の信頼モデルの根幹を揺るがすものでした。
CVSSスコアは10.0で、React2Shellは認証なしの攻撃者が単一の特別に作成されたHTTPリクエストを通じてリモートコード実行(RCE)を可能にします。2021年のLog4Shellのように、その危険性は普及性とプロトコルの「静かさ」にあります。
この深掘りでは、RSCの「Flight」プロトコルの仕組み、破壊を引き起こしたデシリアライズの脆弱性、そして2026年にインフラを守る方法について解説します。
1. RSC Flightプロトコルとは?
React2Shellを理解するには、まずFlightプロトコルを理解する必要があります。
従来、ReactアプリはJSONやHTMLを送信していました。React 19とApp Routerの登場により、ReactはReact Server Components(RSC)を導入しました。RSCはサーバーがUIコンポーネントをレンダリングし、それをFlightと呼ばれる独自のフォーマットでクライアントにストリーミングします。
Flightでのデータの流れ
クライアントがRSCをリクエストしたり、「Server Action」を呼び出すと、サーバーはHTMLだけでなく、シリアライズされたJavaScriptオブジェクトのストリームを送信します。これらのオブジェクトは以下を表します:
- Component Trees:UIの構造
- Props:コンポーネントに渡されるデータ
- Server References:サーバー上で呼び出せる関数の識別子
- Promises:まだ到着していないデータのプレースホルダー
Flightプロトコルは、行の先頭にID(例:1:, 2:)や、参照用の$@、Blob用の$Bなどの特殊記号を付ける特定の構文を使用します。
サーバー側のデコーダ(react-server-dom-webpackなどのパッケージにあります)は、受信したクライアントデータ(例:Server Actionの引数)をJavaScriptオブジェクトに再構築します。ここにゴーストの隠れ場所があります。
2. 脆弱性:CVE-2025-55182の解説
React2Shellの根本原因は、「安全でないデシリアライズの脆弱性」です。具体的には、Reactのサーバー側デコーダがFlightストリームの再構築時にオブジェクトのプロパティを検証しなかったことにあります。
サーバー上のPrototype Pollution
この脆弱性は、JavaScriptの古典的な弱点であるPrototype Pollutionを利用しています。JavaScriptでは、ほぼすべてのオブジェクトがObject.prototypeから継承しています。攻撃者がプロトタイプにプロパティを注入できれば、システム内のすべてのオブジェクトの挙動を変更できます。
Reactがデコード処理中に、受信したFlightペイロードから提供されたプロパティ名(例:__proto__やthen)を検証せずにアクセスしていたことが問題です。
脆弱点:ペイロード内に__proto__やthenを参照するようなプロパティを仕込むことで、Reactのランタイムを騙し、プロトタイプチェーンを traversal して不正な関数を実行させることが可能です。
3. 攻撃の流れ:リクエストからシェルへ
React2Shellの恐ろしさは、認証不要な点にあります。攻撃者は、RSCペイロードを受け付けるエンドポイント(ほぼすべてのルートにあるNext.jsのApp Routerアプリなど)を見つけて、POSTリクエストを送るだけです。
攻撃のステージ
研究者は、このデシリアライズバグを完全なシェルに変える4段階の「ガジェットチェーン」を特定しました:
ステージ1:自己参照ループ:攻撃者はmultipart/form-dataリクエストに「偽のチャンク」オブジェクトを含めます。このオブジェクトはReactの内部Chunkクラスを模倣しています。
ステージ2:プロパティのシャドウイング:ペイロードはこの偽のチャンクのthenプロパティをChunk.prototype.thenに設定します。これにより循環参照が作られ、サーバーはこのオブジェクトを「待つ」状態になります。
ステージ3:Blobハンドラ($B):攻撃者は$Bプレフィックス(Blob用)を使って、Reactの内部関数をトリガーします。この関数は悪意のあるリファレンスを探すように騙されます。
ステージ4:コード実行:これらのガジェットを連鎖させることで、攻撃者はNode.jsのprocessやchild_processモジュールにアクセスし、whoamiやcurl、リバースシェルの起動などのシステムコマンドを実行できます。
サンプル(概念的な)悪意のあるペイロード:
POST /api/server-action HTTP/1.1
Content-Type: multipart/form-data; boundary=----Boundary
Next-Action: [Action_ID]
------Boundary
Content-Disposition: form-data; name="0"
{"then":"$1:__proto__:then","status":"resolved_model","value":"payload_here"}
------Boundary
Content-Disposition: form-data; name="1"
"$@0"
------Boundary--
注意:これは簡略化された表現です。実際の攻撃は複雑なUnicodeの難読化を用いて基本的なWAFシグネチャを回避します。
4. なぜこれが「デシリアライズのゴースト」なのか
従来のSQLインジェクションやXSSと異なり、React2Shellはアプリケーションコードが実行される前に発生します。
認証層の回避
FlightプロトコルはReactの内部で処理されるため、悪意のあるペイロードはミドルウェアや認証チェックに到達する前にデシリアライズされます。フレームワークがストリームを処理している間に、RCEは既に発生しています。
対象範囲
この脆弱性は、「Server Actions」を使用するアプリだけでなく、React 19の脆弱なバージョンを実行しているすべてのアプリに影響します。これには以下も含まれます:
- Next.js(15.xおよび16.x)
- React Router(RSCモード)
- Waku
- Vite/ParcelのRSC統合
5. 実世界の影響(2025-2026)
2026年初頭の時点で、React2Shellの影響は驚くべきものです。
広範な悪用
WizやMandiantなどのセキュリティ企業は、公開後48時間以内に少なくとも1つの脆弱なReactインスタンスを含むクラウド環境が39%に上ると報告しています。自動スキャナーはこのバグを素早く悪用し、次のような攻撃が行われました:
- 暗号通貨マイニング:VercelやAWS Lambda上でXMRigマイナーを大量展開
- データの窃取:
169.254.169.254などのクラウドメタデータエンドポイントを使ったリモートコード実行 - 永続的バックドア:”SNOWLIGHT”や”COMPOOD”マルウェアがReact2Shellを使って企業ネットワークに恒久的な足場を築く
Cloudflareのインシデント
2025年12月、Cloudflareは一時的な障害を経験しました。原因は、誤ったFlightペイロードをブロックするためのWAFの緊急展開が過剰で、多くのサイトの正当なReactトラフィックを誤って破壊したためです。
6. 自分は脆弱か?(チェックリスト)
2024年末から2025年末にかけて構築されたReactベースのアプリを運用している場合、危険にさらされている可能性があります。
| パッケージ | 脆弱なバージョン | パッチ済みバージョン |
|---|---|---|
| React | 19.0.0 – 19.2.0 | 19.0.1, 19.1.2, 19.2.1+ |
| Next.js | 15.0.0 – 16.0.6 | 15.1.0, 16.0.7+ |
| react-server-dom-webpack | < 19.0.1 | 19.0.1+ |
警告:Reactのカナリア版や実験的ビルド(特に14.3.0-canary.77以降)は非常に脆弱です。
7. 検出と対策
即時対策:WAFの導入
すぐにパッチを当てられない場合、最初の防御策はWebアプリケーションファイアウォール(WAF)です。以下のPOSTリクエストをブロックしてください:
Next-Actionやrsc-action-idヘッダーを含む$@に続き:__proto__や:constructorなどのプロパティトラバーサルマーカーを含む- RSCエンドポイントに向けた複雑な
multipart/form-data構造
永続的な修正:パッチ適用
依存関係を更新することが唯一の解決策です。
# Next.jsを更新
npm install next@latest react@latest react-dom@latest
# 以下のパッケージのロックファイルを確認
# react-server-dom-webpack
# react-server-dom-turbopack
パッチは、hasOwnPropertyの厳格なチェックを導入し、Flightデコーダをオブジェクトのプロトタイプトラバーサルに対して強化します。
ランタイム監視
FalcoやSysdigなどのツールを使い、Node.jsのランタイムからの不審なプロセス生成を監視してください。
- IoCの兆候:nodeプロセスが
sh、bash、curl、wgetを起動 - IoCの兆候:未知のC2(コマンド&コントロール)IPやマイニングプールへの予期しないアウトバウンド接続
8. Reactセキュリティの未来への教訓
React2Shellは、「サーバー優先」時代のウェブ開発に警鐘を鳴らすものです。RSCやServer Actionsを通じてより多くのロジックをサーバーに戻すほど、古典的な脆弱性が新たな抽象化の中で再登場します。
シリアライズは決して安全ではない:クライアント入力から複雑なオブジェクトを再構築するプロトコルは、大きな攻撃ベクターです。
フレームワークレベルのセキュリティ:開発者はフレームワークがデフォルトで安全であることに依存しています。フレームワーク自体がベクターの場合、JWTやCSRFトークンといった標準的なアプリケーションレベルのセキュリティだけでは不十分です。
「Log4j」効果:現代のウェブアプリは多層の依存関係の上に構築されています。react-server-dom-webpackのようなコアサブパッケージのバグが、何百万もの下流アプリケーションを危険にさらす可能性があります。
結論
React2Shell (CVE-2025-55182)は、Reactコミュニティが最初の大規模なインフラレベルのセキュリティ危機に直面した瞬間として記憶されるでしょう。Flightプロトコルのデシリアライズの仕組みを理解することで、この「ゴースト」から身を守り、より堅牢なアプリケーションを構築できます。
あなたはnode_modulesの監査を今日行いましたか? RSCのゴーストは、あなたの2025年の展開に潜んでいるかもしれません。
Related InstaTunnel pages
Continue from this article into the most relevant product guides and workflows.
Related Topics
Keep building with InstaTunnel
Read the docs for implementation details or compare plans before you ship.