React Server Components(RSC)脆弱性:「React2Shell」分析と対応
Reactサーバーコンポーネントで発見された深刻なRCE脆弱性。16万個のIPが危険にさらされました。緊急セキュリティパッチガイド。
2025年12月3日、全世界のフロントエンドエコシステムを揺るがす深刻なセキュリティ脆弱性が公開された。別名**「React2Shell」**と呼ばれるこの脆弱性(CVE-2025-9281)は、React Server Components(RSC)の直列化(Serialization)過程で発生するリモートコード実行(RCE)問題だ。
セキュリティコンサルタントとして、現在拡散中のこの脆弱性の技術的原因と緊急対応策を分析する。現在165,000個以上のサーバーがこの攻撃にさらされていると把握される。
1. 脆弱性概要 (Severity: Critical 10/10)
この脆弱性はハッカーが特殊に操作されたJSONペイロードをReactサーバーに転送するときに発生する。RSCがクライアントリクエストを処理する過程で、検証されていない入力値がサーバー内部の eval() 類似関数に伝達され、任意のシステムコマンドを実行できるようにしてしまう。
1.1 影響を受けるバージョン
react-server-dom-webpack: 19.0.0 ~ 19.2.0 未満バージョンnext: 15.0.0 ~ 16.0.1 未満バージョン(RSC活性化時)
1.2 攻撃シナリオ
- 攻撃者は公開されたReactアプリのエンドポイントをスキャンする。
__rsc_action_idパラメータに悪性コードが含まれた直列化データを注入する。- サーバーがこれを逆直列化(Deserialization)する瞬間、攻撃者が植え付けたシェルスクリプトが実行される。
- 攻撃者はサーバーの環境変数(DB接続情報、APIキー)を奪取したり、サーバーをボットネットの一部にする。
2. 技術的深層分析
問題の核心は、Reactがサーバーコンポーネントとクライアントコンポーネント間のデータを直列化する方式である「Flight」プロトコル実装体にあった。
// 脆弱なコード例(単純化됨)
function resolveModel(id, model) {
// ユーザーの入力を適切な検証なしに関数実行コンテキストに渡す
if (model && model.$$typeof === REACT_ELEMENT_TYPE) {
// ...
if (typeof model.type === 'string' && isMalicious(model.type)) {
// ここでRCE発生
execute(model.props);
}
}
}
攻撃者は model.type にシステムコマンドを実行するオブジェクトを偽装して注入する。Reactチームは初期設計時、このような形態の攻撃ベクトルを予想できなかったが、AIを活用したファジング(Fuzzing)ツールがこの隙間を見つけ出した。
3. 被害現況および拡散
12月10日基準、Google脅威インテリジェンス(Google Threat Intelligence)チームの報告書によると、全世界的に約64万個のドメインが潜在的脅威対象だ。
- 韓国: 約12,000個のサーバーが脆弱な状態で露出。
- 主要ターゲット: フィンテックスタートアップ、Eコマースプラットフォーム、個人情報を扱うSaaS企業。
すでにダークウェブでは「React2Shell」自動化攻撃ツールが500ドル線で取引されており、ランサムウェアグループがこれを活用してサーバーを暗号化しビットコインを要求する事例が報告されている。
4. 緊急対応ガイド
今直ちに次の措置を取らなければならない。「後で」はない。
4.1 パッチ適用(最優先)
最も確実な方法はライブラリを最新バージョンにアップデートすることだ。ReactチームとVercelは脆弱性が発見されてから48時間でホットフィックスを配布した。
# npm ユーザー
npm audit fix --force
npm install next@latest react@latest react-dom@latest
# yarn ユーザー
yarn upgrade next react react-dom
4.2 WAF(Webファイアウォール)ルールアップデート
パッチを直ちに適用しにくいレガシーシステムの場合、WAF端で攻撃パターンを遮断しなければならない。
- 遮断ルール: HTTPリクエストヘッダーやボディに
__rscとprocess.envあるいは/bin/shのような文字列が含まれたパターンを正規表現で遮断すること。 - Cloudflare/AWS WAF: すでに管理型ルール(Managed Rules)に「React2Shell」遮断シグネチャが追加された。WAFを活性化しているか確認すること。
4.3 サーバーログモニタリング
すでに浸透した可能性を排除できない。サーバーのアウトバウンドトラフィックログを確認すること。
- サーバーが普段通信していなかった見慣れないIP(特に東欧や第三国)へ接続を試みているか確認。
- CPU使用量が急激に増加したか確認(クリプトジャッキングの可能性)。
5. 根本的なセキュリティ対策:Zero Trust
今回の事態は「フレームワークが勝手にやってくれるだろう」という安易な考えがいかに危険かを示している。
- 入力値検証: フレームワークが何をしようと、ビジネスロジック端ですべての入力値を徹底的に検証(Zod、Yupなど活用)しなければならない。
- 最小権限原則: Webサーバープロセスが
root権限で実行されてはならない。攻撃者がRCEに成功しても、権限が制限されたコンテナ内部なら被害を最小化できる。 - 依存性スキャン: CI/CDパイプラインに
SnykやTrivyのようなセキュリティスキャンツールを連動して、配布前に脆弱なパッケージを感知しなければならない。
6. 結論
React Server Componentsは素晴らしい技術だが、サーバーとクライアントの境界が曖昧になりながら新しい攻撃表面(Attack Surface)を開いた。
セキュリティは速度ではなく方向だ。今すぐ package.json を確認しアップデートボタンを押してほしい。165,000番目の被害者にならないことを願う。