2025年12月初頭、現代のウェブ開発において事実上の標準となっている React、およびその主要フレームワークである Next.js を揺るがす極めて深刻な脆弱性が公開された。
それが CVE-2025-55182、通称 React2Shell である。
本脆弱性は CVSS 10.0(最高値)と評価され、
認証不要・単一リクエストでサーバー上の任意コード実行(RCE)が可能 という、最悪クラスの性質を持つ。
この記事では、この脆弱性の技術的本質、攻撃メカニズム、影響範囲、実際に観測された攻撃、そして防御戦略について、可能な限り深く整理する。
脆弱性の背景:React Server Componentsという転換点
React 19 の登場とともに、React Server Components(RSC) は「実験的機能」から事実上の標準アーキテクチャへと移行した。
RSCは以下を目的として設計されている。
- サーバー側でコンポーネントをレンダリング
- 結果をシリアライズしてクライアントへ送信
- クライアント側JavaScriptの負荷を削減
この設計自体は合理的だが、
サーバーとクライアントの間でシリアライズされたデータをやり取りする という点が、新たな攻撃対象領域を生み出した。
CVE-2025-55182の本質
CVE-2025-55182は、RSC内部で使用される Flightプロトコル における、
- 不十分な入力検証
- 危険なデシリアライズ処理
に起因する サーバーサイド・プロトタイプ汚染 の脆弱性である。
攻撃者は、悪意のある Flight 形式のリクエストを送信することで、
- Object.prototype を汚染
- その結果として Node.js 実行環境で任意コードを実行
できてしまう。
しかもこの攻撃は 認証不要 で成立する。
プロトタイプ汚染とは何が危険なのか
JavaScriptのすべてのオブジェクトは Object.prototype を継承している。
プロトタイプ汚染では、攻撃者が以下のような特殊プロパティを悪用する。
- proto
- constructor
- prototype
これにより、
- 全オブジェクトに新たなプロパティを注入
- 本来存在しないメソッド参照を成立させる
といった状態を作り出せる。
問題となったReact内部ロジック
修正前のReact内部では、以下のような処理が存在していた。
export function requireModule<T>(metadata: ClientReference<T>): T {
const moduleExports = parcelRequire(metadata);
return moduleExports[metadata[NAME]];
}
metadata[NAME] の値に対する検証が存在しないため、
- "proto"
- 汚染済みプロパティ名
を指定されると、プロトタイプチェーンを遡った参照が成立してしまう。
これがRCEへと直結した。
Flightプロトコルの悪用
攻撃者は Flight プロトコルを模倣した HTTP リクエストを送信する。
典型的な特徴は以下の通り。
- HTTPヘッダに
next-actionやrsc-action-id - ボディに
$@やresolved_model - プロトタイプ操作文字列(例:
$1:__proto__:then) - Node.js 内部APIを呼び出すペイロード
結果として、child_process.execSync 等が呼び出され、
OSコマンド実行が成立する。
影響範囲の広さ
この脆弱性が特に危険なのは、
「開発者がサーバー関数を書いていなくても脆弱」
という点にある。
RSC対応構成であれば、ボイラープレートですら攻撃対象になる。
影響を受ける主要パッケージ
- react-server-dom-webpack
- react-server-dom-parcel
- react-server-dom-turbopack
いずれも 19.0〜19.2 系が影響を受け、
修正は 19.0.1 / 19.1.2 / 19.2.1 以降で行われた。
フレームワークへの影響
- Next.js 15.x / 16.x(App Router 使用時)
- Waku
- @vitejs/plugin-rsc
- @parcel/rsc など
Wiz Research の調査では、
クラウド環境の約 39% に脆弱な RSC インスタンスが存在していたとされる。
実際に観測された攻撃
脆弱性公開から 数時間以内 に in-the-wild 攻撃が確認された。
攻撃の流れ
- PoC公開
- 自動スキャンの急増
- マイナー・バックドア配布
- 標的型侵害の発生
観測された事後活動
- whoami / id による権限確認
- SSH 永続化
- XMRig によるマイニング
- クラウドIMDS経由の権限奪取
- OpenAI APIキー等の探索
RCEの起点から、クラウド全体の侵害へ拡大するケースも確認された。
対策と防御戦略
最優先:パッチ適用
- React関連パッケージを修正版へ更新
- Next.js は 15.0.5 以降を使用
これは唯一の根本対策である。
暫定的緩和策
- WAFでFlight特有文字列を検知
- Node.js プロセスからの異常な子プロセス生成監視
- /tmp や /dev/shm の不審ファイル確認
アーキテクチャ上の防御
- エグレス通信制限
- IMDSv2 強制
- 実行ユーザーの最小権限化
この脆弱性が示す本質的な警告
React2Shellは単なる実装ミスではない。
- フロントエンドとバックエンドの境界消失
- 「デフォルトで脆弱」という構造的問題
- AI時代のクレデンシャル窃取加速
RSCのような仕組みは、
一つのデシリアライズミスが即RCEになる 世界を作り出した。
結論
CVE-2025-55182は、2025年を象徴する脆弱性として記憶されるだろう。
重要なのは、
- 新技術は必ず攻撃面を拡張する
- フレームワークを「信頼しすぎない」
- 継続的な監視と最小権限設計
パッチ適用は一度きりだが、
防御姿勢は継続的でなければならない。
React2Shellは、その現実を突きつけた事例だった。