著者: Kavienan J
脆弱性を発見したのは: lachlan2k。この脆弱性を責任を持って React チームに開示しました。
この脆弱性の最新情報はこちら: react2shell.com
CVE-2025-55182 の深刻度は 10.0/10.0 と評価されています。公開されている PoC を見たことがあるなら、それらがエクスプロイトの動作を示している一方で、なぜペイロードがそのような形をしているのかという説明が不十分に感じられることに気づいたかもしれません。これは、React Flight プロトコルがいかに複雑であるかを考えれば、当然のことです。React Server Components と Server Actions の背後にあるシリアライゼーションレイヤーである Flight は、1,100 行を超える入り組んだステートマシンであり、コードを自分で追わない限り、その動作は直感的に理解できません。
コミュニティの PoC はこの脆弱性を明確に示しています:
…しかし、「なぜこれが機能するのか?」という問いに答えようとすると、すぐに React の内部構造の奥深くへと分け入ることになります。そこは、行ごとに読まれることを想定されていない場所です。
注記: 多くの PoC は、修正が
requireModuleの変更によるものだと誤って説明しています。修正で見るように、エクスプロイトペイロードはその関数に到達することはありません。実際の脆弱性のあるコードは、完全にReactFlightReplyServer.js内に存在します。
この記事は、React のデコード処理とチャンク初期化ロジックをステップバイステップで追跡し、エクスプロイトチェーンをリバースエンジニアリングしようとする私の試みです。ここで説明するすべての動作は、修正前の ReactFlightReplyServer.js がどのように機能していたかに直接由来しています(参照: https://github.com/facebook/react/blob/v19.2.0/packages/react-server/src/ReactFlightReplyServer.js)。React/JS 開発者が十分な忍耐力を持って追えるよう、凝縮され簡略化されています。
次のセクション: 背景