概要
- 2025年11月30日、 React2Shell という重大なRCE脆弱性をMetaに報告
- 12月3日、Metaが CVE-2025-55182 として修正とアドバイザリ公開
- 脆弱性発見のきっかけは Reactのプロトコル調査 から
- Next.jsやReact Server Components の仕組みが攻撃面を拡大
- Flightプロトコル解析 から脆弱性発見と攻撃方法確立までの経緯
React2Shell脆弱性発見の経緯
- 2025年11月30日、Metaに React2Shell (リモートコード実行脆弱性)を報告
- 12月3日、Metaが CVE-2025-55182 として修正・アドバイザリ公開
- 開発者に 即時アップデート を強く推奨
- 発見のきっかけは Reactのプロトコル調査 を目的とした自主的な学習
- Next.js などのモダンWebアプリで多用される React Server Components (RSC) や Server Functions の内部挙動に着目
- Flightプロトコル という独自通信仕様の存在を確認
- 公式ドキュメントがほぼ存在せず、 「no docs, only code」 状態
- Flightプロトコルの特徴
- JSONベース だが、 Date, BigInt, Map, Promise 等の複雑な型や参照もサポート
- メッセージは「チャンク」として分割・非同期送信
- $記法 で型や参照を表現(例:$DでDate、$xで参照)
- 解析の過程で プロトタイプ汚染 に類似した動作を発見
- Flightでオブジェクトの 継承プロパティ (例:Number.prototype.toString)も参照可能
- 「重大な安全性チェックの欠如」 と指摘される
- 初期の攻撃仮説
- Flight経由で 型チェックを回避 し、開発者が想定しない型のオブジェクトをサーバーへ送信可能
- TypeScriptの型注釈 はビルド時のみ有効で、ランタイムでは無効
- 具体的な攻撃例
- toStringやreplaceAllに 悪意ある関数 を注入し、サーバー側で実行させる
- Functionコンストラクタ へのアクセスにより任意コード実行の可能性
- 攻撃成立の条件
- 開発者が 入力値検証を怠る こと
- Flight経由で 任意の関数・引数 を指定できること
Flightプロトコルの技術的詳細
- Flight はNext.jsやReactでクライアント・サーバー間の オブジェクト転送 を効率化
- 非JSON型 や 循環参照、 非同期データ(Promise) も表現可能
- メッセージ例
- 0={ "email": "foo@bar.com", "updated": "$D04 Dec 1995 00:12:00 GMT", "details": "$1" }
- &1={ "firstName": "$2", "lastName": "$3:foo" }
- &2="John"
- &3={ "foo": "Doe" }
- 受信側で 複雑なJavaScriptオブジェクト に復元
- $記法 を悪用し、プロトタイプの関数やプロパティへ 意図的にアクセス可能
型安全性の幻想と攻撃手法
- TypeScript の型注釈は ランタイム検証を伴わない ため、攻撃者は 任意の型 を送信可能
- 例1:toStringプロパティに関数を仕込むことで、サーバー側の暗黙的な型変換時に 任意コード実行
- 例2:replaceAll等のメソッド呼び出し時に 攻撃者制御の関数・引数 を注入
- Functionコンストラクタ 経由で 任意JavaScriptコード の生成・実行が可能
- Flightメッセージ の構築ルール
- オブジェクト、配列、文字列、特殊定数、Date/Set/Map/TypedArray、Promise、サーバー関数参照
- それぞれの プロパティ・メソッド も任意参照可能
脆弱性発見までの試行錯誤
- Flightの挙動を詳細に解析し、 攻撃可能性のあるパターン を探索
- Sylvie Mayer との協力でCTF的な問題解決アプローチを採用
- React/Flightの内部にも ユーザー入力を安全に扱わない例 が存在
- 「 Reactは堅牢」という先入観から一時的に盲点となる
- 最終的に decodeReply 等の内部処理で 安全性チェックが欠如 している点を突き止める
React2Shell発見後の対応と影響
- 脆弱性報告後、Metaが 即座にパッチリリース ・アドバイザリ公開
- Next.js/React を利用する 数百万サイト が影響
- Flightプロトコルの仕様・実装の見直しが迫られる
- 開発者・セキュリティ研究者 にとっての教訓
- 型安全性に過信しない
- 独自プロトコルの安全設計 ・ 実装時の検証 の重要性
- 公式ドキュメントや仕様公開 の必要性
まとめ
- React2Shell は、 Flightプロトコル の設計・実装上の盲点を突いた 重大なリモートコード実行脆弱性
- 型安全性やフレームワークの堅牢性に 過信せず、 入力値検証 の徹底が不可欠
- 独自プロトコル 利用時は、 セキュリティ仕様・ドキュメントの明文化 が重要
- Metaの迅速な対応 と コミュニティの協力 が被害拡大を防止