【メモ】React2Shellはアプリ検証ロジック前に作用する
目的
React2Shell(CVE-2025-55182)は、「アプリの入力検証ロジックを頑張っていても、その前段で踏まれ得る」タイプの脆弱性です。12
本記事では、なぜ“入力検証より前”に実行され得るのかを、Webサーバの基本構造(リクエスト処理の順序)から初学者向けに整理します。攻撃手順やペイロードの具体には触れません。3
0. まずWebサーバの基本構造(ざっくり)
Webアプリの「入力検証」が効く前提は、リクエストが“アプリのコード(コントローラ等)”まで到達して、そこで検証が走ることです。
典型的な流れは次の通りです。
- クライアント(ブラウザ等)がHTTPリクエストを送る
- Webサーバ / アプリサーバが受け取る(例:Nginx、Node.js、Java)
- フレームワークの前処理が走る(ルーティング、ボディのパース、認証ミドルウェア、CSRF、デコード等)
- その後にアプリ固有の処理(入力検証、ビジネスロジック、DBアクセス)
重要なのは、3) の“フレームワーク前処理”は、アプリの入力検証より前に必ず走るという点です。
「どこで何が守られるか」を表で把握する
| 位置づけ | 例 | 主担当 | ここで効きやすい対策 | ここが壊れると何が起きるか |
|---|---|---|---|---|
| HTTP受信〜ルーティング | パスでハンドラ決定 | Webサーバ/フレームワーク | 経路制御、WAF、ACL | 想定外の入口へ到達 |
| ボディのパース/デコード | JSON/フォーム/独自形式の復元 | フレームワーク | 形式検査、サイズ制限 | 検証前に例外/脆弱性が発火 |
| 認証/認可ミドルウェア | ログイン必須化 | アプリ/フレームワーク | 認証、認可 | “pre-auth”になる余地 |
| 入力検証(アプリ) | 文字種/長さ/スキーマ | アプリ | バリデーション | ただし前段が安全であることが前提 |
React2Shellは、この表でいう 「ボディのパース/デコード(復元)」が先に走る領域に論点がある、という理解が近道です。45
1. React Server Components(RSC)で何が増えるのか
RSCを使うと、従来の「HTML/JSON APIを返す」だけでなく、RSC専用の通信(Flight)を処理するサーバ側ロジックが増えます。16
イメージ:
-
従来
/api/login→ JSON/page→ HTML
-
RSCあり
/api/login→ JSON/page→ HTML- (追加)RSC/Flight用の通信(POST等) → RSCのデータ形式をやりとり(フレームワーク内部で処理)
この「追加された入口(=フレームワークが受け持つ処理)」が、今回の主役です。1
2. 「入力検証が効く場所」と「効かない場所」
入力検証は通常、アプリが“意識して作った入口”で書きます。
- フォーム入力の型チェック、文字数、文字種、正規表現
- JSONスキーマ検証
- 業務ルール検証
これは「アプリが想定した入力」を「アプリが想定した入口」で受け取ることが前提です。
一方でRSC/Flightは、開発者が直接触らないことも多い **フレームワーク内部の“特殊な入口”です。ここで内部的に受け取ったデータを復元(デシリアライズ)**して、コンポーネントやサーバ機能の呼び出しに変換します。12
3. React2Shellのポイント
React2Shell(CVE-2025-55182)は、信頼できないデータ(Flight等のペイロード)をフレームワークが先にデシリアライズしてしまうことが核で、その過程が危険だと **任意コード実行(RCE)**につながり得る、というタイプです。42
IPAも論点を「信頼できないデータのデシリアライズ」として整理し、悪用されると任意コード実行のおそれがあると注意喚起しています。4
4. では「なぜ入力検証ロジック前」なのか(処理順で理解)
処理順を「どこで何が起きるか」に分解します。
A) 通常のAPI(入力検証が効く典型)
[HTTP受信] → [ルーティング] → [認証/認可] → [JSONパース] → [アプリの入力検証] → [ビジネスロジック] → [レスポンス]
この経路では、「JSONパースの後」にアプリ検証が入ることが多く、入力検証が守りとして機能しやすいです。
B) RSC/Flight(React2Shellの論点側)
[HTTP受信] → [RSC/Flightとしてルーティング] → [Flightペイロードのパース] → [モデルの復元(デシリアライズ)] ★ここが危ない → (脆弱だと、アプリ検証に到達する前にRCEへ) → [その後にアプリ側の処理へ到達する場合もある]
つまり危ないのは、**「入力検証の前にある、フレームワーク内部のパース/復元処理」**です。ここが脆弱だと、アプリがその後段でどれだけ厳密に検証しても、手前で事故が起き得ます。21
5. 「アプリがServer Functionを実装してなくても危ない」理由
React公式は、アプリが明示的にServer Functionのエンドポイントを実装していなくても、RSCをサポートしているだけで影響し得ると注意しています。1
理由はシンプルで、RSCを有効にした時点で **フレームワークがFlight受信→復元(デシリアライズ)**を担当するためです。
その内部に脆弱性があれば、アプリの検証コードとは独立に踏まれ得ます。17
6. “事前認証(pre-auth)”になり得る理由
JPCERT/CCは、細工したHTTPリクエスト(不正なFlightペイロード等)により、認証不要でコード実行につながる可能性があると説明しています。3
「pre-auth」になり得る構造は、次のどちらか(あるいは両方)が起きる時です。
- 認証ミドルウェアに到達する前に、フレームワークの復元処理が動く
- 認証を要求しない経路(設定・実装都合)で、Flight処理が動く
NVDも「pre-auth RCE」であり、Server Function向けリクエストのデシリアライズが問題と説明しています。2
7. 影響範囲の要点
React側(RSC関連パッケージ)
React公式とGitHub Advisoryは、影響を受けるRSC関連パッケージとバージョン、および修正版を明記しています。17
| コンポーネント | 影響バージョン | 修正版(例) |
|---|---|---|
| react-server-dom-webpack | 19.0 / 19.1.0 / 19.1.1 / 19.2.0 | 19.0.1 / 19.1.2 / 19.2.1 |
| react-server-dom-parcel | 同上 | 同上 |
| react-server-dom-turbopack | 同上 | 同上 |
※「修正版へアップデート」が第一優先、というのが公式の立場です。1
Next.js側(下流への影響)
Next.jsは、上流(React)の問題としてCVE-2025-55182を参照しつつ、App Router利用時の影響と修正版を提示しています。8
| 対象 | 影響条件(概略) | 影響が小さい/ない例(概略) |
|---|---|---|
| Next.js | App Router + RSCを利用する構成 | Pages Router、Edge Runtime などは影響外と説明 |
(※詳細な対象バージョン・修正版はNext.jsのアドバイザリに従ってください)8
8. まとめ
- 入力検証は強いが、それが動くのは通常「アプリの入口」の後段
- RSCは、フレームワーク内部に「追加の入口(Flight処理)」を持つ
- React2Shellは、その入口で「信頼できないデータのデシリアライズ」が先に走り、RCEにつながり得る
- だから、アプリの検証ロジックの前に発火し得る
このため対策の基本は、
補足(安全側の理解)
本記事は仕組み理解を目的に、攻撃手順や具体ペイロードには触れていません。
実務では、まず **影響判定(RSC利用有無、該当パッケージとバージョン確認)**を行い、パッチ適用を最優先に置くのが安全です。14