React

React・Next.jsに発生した重大脆弱性とは何か?2025年に発覚した大規模脆弱性の概要と背景を解説

目次

React・Next.jsに発生した重大脆弱性とは何か?2025年に発覚した大規模脆弱性の概要と背景を解説

2025年11月末、ReactNext.jsに関連するウェブ開発コミュニティに衝撃が走りました。Reactの新機能であるReact Server Components(RSC)に起因する重大な脆弱性が発見され、12月初旬に公表されたのです。この脆弱性は認証不要でリモートからコードを実行できてしまう極めて危険なもので、セキュリティ評価指標であるCVSSスコアは満点の10.0が付けられました。これはWebアプリケーションにおいて最悪クラスの脅威であり、多くのエンジニアにとって見過ごせない問題となっています。

本記事では、「React・Next.jsに発生した重大脆弱性」として話題になっているCVE-2025-55182およびCVE-2025-66478について詳しく解説します。まずはReact Server Componentsとは何か、この脆弱性がどのように発見され何が問題なのか、そして被害の深刻さや対策まで、順を追って見ていきましょう。React/Next.jsユーザーに限らず、フロントエンド・バックエンド開発者全般に知っておいてほしい重要な内容です。

React Server Components (RSC)の概要とNext.jsにおける役割と今回の脆弱性との関係

React Server Components(RSC)は、React 18から導入が進められている新機能で、コンポーネントをサーバー側でレンダリング・処理できるようにする仕組みです。従来、ReactはクライアントサイドでUIを構築するのが主流でしたが、RSCでは一部のコンポーネント処理をサーバーで実行し、その結果をクライアントに送ることでパフォーマンスや開発体験の向上を図ります。この通信には内部プロトコルである「React Flightプロトコル」が使われ、クライアントとサーバー間でコンポーネントツリーやアクションがシリアライズされてやり取りされます。

Next.jsはReactの代表的なフレームワークであり、最新バージョンではRSCを活用したApp Router(アプリケーションフォルダベースのルーティング)が導入されています。Next.jsのApp Routerモードでは、React Server Componentsがフルに活用され、ページレンダリングやフォーム操作時にサーバーとクライアントがFlightプロトコルでデータをやり取りします。今回発覚した脆弱性は、まさにこのRSCの通信プロトコル部分に起因するもので、React本体の実装上の問題がNext.jsを含む複数のフレームワークに波及する形となりました。つまり、ReactとNext.jsという密接に連携する技術スタックの接点(RSC機能)において、攻撃者に悪用され得る抜け穴が見つかったのです。

脆弱性の発見:2025年11月のLachlan Davidson氏による報告とReactチームの緊急対応

この脆弱性は、2025年11月29日にセキュリティ研究者のLachlan Davidson氏によって発見・報告されました。彼はMeta(Facebook)のバグバウンティプログラムを通じてReactチームに問題を通知し、ReactチームとMetaのセキュリティエンジニアが即座に検証と修正作業に取り掛かったとされています。その後、12月1日には修正策が開発され、影響を受ける主要プロジェクト(Next.jsや他のフレームワーク)とホスティング事業者(Vercelなど)に対して協力のもと検証や一時的な緩和策の展開が行われました。

そして2025年12月3日、Reactチームは公式ブログでこの脆弱性をCVE-2025-55182として公表し、同時に修正版パッケージをリリースしました。またNext.jsチームも同日付けで独自にアドバイザリを公開し、Next.jsユーザー向けに注意喚起とアップデート情報(これが後にCVE-2025-66478として登録)を発信しました。発見から公表までわずか5日間という非常に迅速な対応が取られたのは、脆弱性の深刻さを物語っています。React開発コミュニティと各企業は一丸となって緊急対応に当たったのです。

脆弱性の深刻度:CVSS 10.0(最高危険度)に評価された理由とReactエコシステムにもたらす影響

今回の脆弱性はCVSSスコアで10.0と評価されました。CVSS(共通脆弱性評価システム)のスコアは0から10で危険度を示しますが、10.0というのは「Critical(深刻)」に分類され、滅多に付くことのない最高レベルの深刻さです。なぜこれほど高い評価になったかと言えば、まず影響の大きさが挙げられます。Reactは世界中のWeb開発者に利用されており、2024年のJavaScriptエコシステム調査では開発者の8割以上がReactを使用経験ありと回答しています。そのReactと直接関係する脆弱性であるため、潜在的な影響範囲が非常に広範です。

さらに、後述するように攻撃の成立に認証が不要である点、攻撃が成功した場合にはサーバー乗っ取りやデータ漏洩など致命的な被害が発生し得る点も重なり、危険度を押し上げました。React/Next.jsというフロントエンド技術スタックは多くのウェブサービスの基盤を支えているため、この脆弱性はReactエコシステム全体の信頼性を揺るがしかねない問題として捉えられています。言い換えれば、もし適切な対策が取られなければ、Web開発の広範囲にわたって重大なセキュリティリスクを抱える事態になってしまうわけです。

React2Shellという名称の由来:Log4Shellになぞらえた意味とコミュニティへのインパクト

この脆弱性は非公式に「React2Shell(リアクト・トゥ・シェル)」とも呼ばれています。これは2021年末に発覚したJavaのログ処理ライブラリの深刻な脆弱性「Log4Shell」になぞらえた名前です。Log4Shellはログ機能を悪用したリモートコード実行攻撃で世界的に大きな混乱を引き起こしました。今回のReact/Next.jsの脆弱性も、「〇〇2Shell」と呼ぶにふさわしいほど危険度が高く、広範な影響を及ぼす可能性があるとの意味が込められています。

このネーミングはセキュリティ研究者がSNS上で発信したことで広まりました。React2Shellという呼称が使われることで、エンジニアコミュニティにも「これはLog4Shell級の重大インシデントなのだ」という危機感が共有されました。実際、各種技術フォーラムやSNSではReact2Shellについての情報交換が活発に行われ、早急なアップデートや対策の呼びかけがなされています。名前のインパクトも手伝って、多くの開発者が注意喚起に耳を傾けたと言えるでしょう。

React/Next.jsユーザーへの影響範囲:人気フレームワークゆえに広がるリスクへの警鐘と今後の注意点

ReactおよびNext.jsユーザーは、この脆弱性によって直接的なリスクにさらされました。人気フレームワークゆえに、膨大な数のプロジェクトが潜在的に影響を受ける可能性があります。フロントエンドとバックエンドの境界を跨ぐRSCという仕組みの脆弱性のため、従来クライアントサイド開発者が意識しなかった領域からの攻撃に直面する形です。

今回の件は、React/Next.jsを利用する全ての開発チームに「最新機能を使う際のリスク評価」について警鐘を鳴らす出来事ともなりました。RSCは魅力的な新機能でしたが、その裏で予期せぬセキュリティホールが潜んでいたことになります。今後は、新技術の採用時にセキュリティ面の検証をより慎重に行う必要性が再認識されたと言えるでしょう。また、普段から依存ライブラリのアップデート情報に目を光らせ、重大な脆弱性が報告された際には迅速に行動を起こす体制を整えておくことが、エンジニアにとっての重要な心得となります。

CVE-2025-55182 / CVE-2025-66478の概要と重要ポイント:React/Next.jsを襲った脆弱性の内容

それでは今回の脆弱性に割り当てられたCVEについて整理しましょう。React側の問題にはCVE-2025-55182、Next.js側の影響にはCVE-2025-66478というIDが付与されています。両者は表裏一体の関係にあり、簡単に言えばReactの脆弱性(55182)が原因でNext.jsにも波及したため、React用とNext.js用の二つのCVE番号が存在する形です。ただし実質的には一つの根本原因から派生した問題であり、対策も連動しています。以下で各CVEの内容とポイントを見ていきましょう。

CVE-2025-55182の詳細:Reactにおけるリモートコード実行脆弱性の内容と影響範囲

CVE-2025-55182は、React自身のServer Components機能に内在していたリモートコード実行(RCE)の脆弱性です。ReactのRSC実装部分において、不適切なデータのデシリアライズ処理が原因となり、本来であれば実行されるはずのない任意のコードがサーバー上で実行できてしまう可能性がありました。

技術的には、ReactのRSC用モジュール(react-server-dom-webpackreact-server-dom-turbopack等)の内部関数が、クライアントから送信されるデータを復元(デコード)する際に入力内容の検証が不十分な箇所がありました。その結果、悪意ある細工が施されたデータを受け取った場合に、Reactがサーバー側で意図しないモジュールや関数を呼び出してしまう恐れが生じたのです。平たく言えば、攻撃者はRSCのデータフォーマット(Flightプロトコルのペイロード)を悪用して、Reactサーバーコンポーネントの仕組みを乗っ取り、サーバー上で任意のコードを実行(Remote Code Execution)できる余地を見つけたということになります。

このCVE-2025-55182はReactチームが管理するオープンソース部分の脆弱性であるため、React自体や、それを利用する様々なフレームワークに影響を与えました。影響範囲としては、ReactのRSC機能を組み込んでいるバンドラ/フレームワーク(Next.js、React Router、Viteプラグイン、Parcel RSC、RedwoodJSなど)が該当します。要するにReactをサーバー側で活用するあらゆるツールで、デフォルトの状態では脆弱性の影響下にあったという非常に広い範囲をカバーしています。これがCVE-2025-55182の持つ意味合いです。

CVE-2025-66478の詳細:Next.jsアプリへの影響と独自CVE発行の背景と経緯

CVE-2025-66478は、Next.jsに関する脆弱性IDです。実際には前述のReact側脆弱性(55182)がNext.jsアプリに与える影響を追跡するために、Next.jsチームが独自に割り当てたものです。Next.jsではApp Router機能を通じてRSCを利用しており、Reactに起因する脆弱性によってNext.jsアプリケーションでもRCE攻撃が可能になることが判明しました。

Next.jsチームはReactチームから情報提供を受け、問題発覚当日に迅速にセキュリティアドバイザリを公開しました。その中で、影響を受けるNext.jsのバージョン群や修正バージョン、アップデート手順などを明示するとともに、CVE-2025-66478という識別子で追跡しています。実際には根本要因はReact側にあるため、National Vulnerability Database(NVD、米国のCVEデータベース)ではCVE-2025-66478をCVE-2025-55182の重複(Duplicate)として扱う判断がなされています。しかし、Next.js利用者に対して注意喚起を行う意味でこのIDが用意されたという経緯があります。

Next.jsのバージョンによってはRSC機能を使っていない場合もあるため、Next.js側で影響を受ける条件やバージョンを整理する目的もCVE-2025-66478には含まれます。Next.jsチームのアドバイザリでは、どのバージョンが脆弱であり、どのバージョンにアップデートすれば良いのかが詳細に説明されており、Next.jsユーザーはこれに従って速やかな対応を取る必要がありました。

重複CVEの扱い:NVDによるCVE-2025-66478の重複認定とその理由

先に触れたとおり、NVD(National Vulnerability Database)ではCVE-2025-66478はReact側のCVE-2025-55182と同一の問題であると判断され、重複として扱われました。このようなケースはオープンソースソフトウェアとそれを利用するプロダクトの関係で時折発生します。つまり「CVE-2025-55182が根本原因であり、Next.jsにおけるCVE-2025-66478はそれによって引き起こされた二次的な影響である」という位置づけです。

重複と認定された理由は、Next.js側で別途コード上の独立した欠陥があったわけではなく、Reactの実装不備がNext.jsに波及しただけだからです。そのため、根本解決策はReact側の修正(RSCプロトコルの改善)に集約され、Next.jsとしてはそれを取り込んだバージョンへのアップデートを促すことになります。NVD上ではCVE-2025-55182が主となり、CVE-2025-66478の情報ページには「これはCVE-2025-55182の重複です」といった注釈が付けられる形となりました。

ただし実務上は、Next.js利用者に通知を行き渡らせるためにCVE-2025-66478の存在は意味があります。多くの開発者はReact本体のCVEよりも、自分たちが直接使っているNext.jsのCVE情報の方に敏感です。その意味で、Next.jsチームが独自CVEを申請・公開したのは適切な対応と言えるでしょう。結果的に二つのCVEが存在する形にはなりましたが、重要なのは「ReactもNext.jsも両方対策が必要」という事実です。

React/Next.js公式アドバイザリから読み解く要点:脆弱性公表内容のまとめ

ReactチームおよびNext.jsチームは、それぞれ公式のセキュリティアドバイザリ(勧告)を公開しています。React側はMeta社のReact公式ブログにて、Next.js側はVercel社のNext.js公式ブログにて詳細が説明されました。両者に共通する要点として、次の点が挙げられます。

  • 脆弱性の概要: React Server Componentsのプロトコル処理にRCE可能な欠陥があり、認証なしで攻撃が成立する。
  • 影響範囲: RSCをサポートするReactの関連パッケージ(特定バージョンのreact-server-dom-*系)およびNext.jsのApp Router採用バージョンが主な影響対象。
  • 深刻度: CVSS 10.0のCriticalに相当し、即座の対応が必要。
  • 対応策: Reactは問題を修正したパッチ版(各メジャーにおける最新パッチ)をリリース済み。Next.jsも各メジャーバージョン向けの修正アップデートを公開済み。
  • アップデート手順: 該当パッケージをそれぞれ最新版へnpm installで更新すること。また、Next.jsの古いカナリア版を使っている場合は安定版にダウングレードするよう指示。
  • 一時的措置: アプリケーションコード側で無効化できる設定項目はなく、アップデート以外に根本解決策は無い。ただし一部ホスティングやWAFで暫定的な攻撃遮断ルールが敷かれている。

以上が公式アドバイザリから読み取れる重要ポイントです。これらを踏まえて、次章以降で具体的な影響バージョンや対策手順、技術的な原因分析などに触れていきます。

どのバージョンのReact・Next.jsが影響を受けるのか?脆弱性の対象バージョン一覧と対応状況を確認

続いて、この脆弱性によって影響を受けるバージョンについて確認しましょう。React本体および関連パッケージ、そしてNext.jsについて、どのリリースが脆弱であり、どのリリースで修正が適用されたのかを知ることが重要です。バージョンによっては脆弱性の影響を受けないケースもありますので、該当するかどうかを把握して適切な対応を取る必要があります。

React本体の影響範囲:脆弱性が発生するReactバージョン(RSC対応状況)

React本体と言っても、今回の脆弱性はReactのコア部分ではなくReact Server Components(RSC)用のパッケージ群に存在しました。具体的には以下のパッケージとバージョンが脆弱でした。

  • react-server-dom-webpack バージョン19.0、19.1.0、19.1.1、19.2.0
  • react-server-dom-turbopack バージョン19.0、19.1.0、19.1.1、19.2.0
  • react-server-dom-parcel バージョン19.0、19.1.0、19.1.1、19.2.0

上記はいずれもReact 19系で導入されたRSC関連モジュールです。まとめるとReact 19.0〜19.2.0までのRSCパッケージに脆弱性があったことになります。したがって、React 19系を利用しておりRSC機能が有効になっているプロジェクトは、基本的にこの脆弱性の影響下にあったと言えます。

一方、React 18以前のみを使用している場合は、そもそもRSC機能自体が存在しないため今回の問題の影響は受けません。またReact 19系であっても、RSCを無効化して完全に使っていない状態であれば理論上は影響を受けにくいですが、Reactの内部に脆弱なコードが含まれている事実は変わらないため、将来的な安全性を考えるとアップデートが推奨されます。

Next.jsの影響範囲:脆弱性の影響を受けるNext.jsのバージョン一覧

Next.jsについては、RSCを利用するApp Routerを導入したバージョンが影響を受けました。具体的にはNext.jsの14系後半のカナリア版からRSCが試験導入され、15系および16系の安定版で本格導入されました。Next.js公式の発表によれば、以下のバージョンが脆弱性の影響下にあります。

  • Next.js 15.x (15.0.0~15.0.4、15.1.0~15.1.8、15.2.0~15.2.5、15.3.0~15.3.5、15.4.0~15.4.7、15.5.0~15.5.6)
  • Next.js 16.x (16.0.0~16.0.6)
  • Next.js 14.3.0-canary.77 以降のカナリアリリース(14系の開発版の一部)

要するに、Next.js 15系および16.0.6までの16系が該当し、さらに14系のごく一部(App Routerの試験版が含まれた後期カナリア版)も含まれます。逆に言えば、Next.js 13系以前や14系安定版(14.0~14.2および14.3の正式版)は今回の脆弱性の影響を受けません。Next.js 13までは旧来のPages Routerが中心でRSC非対応、14系も安定版ではRSCはまだ実験的機能に留まっていたため安全だったとされています。

影響を受けないバージョン:React 18系やNext.js 13/14など非対応環境の安全性

上記の通り、React 18以前の環境ではRSCがないため脆弱性の心配はありません。またNext.js 13系以前(従来のPages Routerを使用している場合)や、Next.js 14系の安定版を使っているプロジェクトも、RSCを使っていなければ安全です。特にNext.js 13系ではApp Routerがオプトインの実験段階だったので、多くのプロジェクトは旧方式のPages Routerを使っており、この場合RSCに関連するコードは動作しません。

ただし注意点として、React 18やNext.js 13だからといって絶対安全というわけではありません。例えば、React 18環境でも将来的にReact 19へアップグレードする可能性があるなら、開発中に今回のような問題への対処計画を考えておく必要があるでしょう。またNext.js 13でも、もしApp Router機能を有効化して実験的に使っていた場合には脆弱となる可能性があります。自分のプロジェクトが本当にRSC非対応であるか、設定や依存パッケージを確認することが大切です。

App RouterとPages Routerの違い:Next.jsでApp Router利用時のみ脆弱性の対象となる理由

Next.jsにはルーティングの方法として従来のPages Routerと、新しいApp Routerの二種類があります。今回問題となったRSCはApp Routerに深く関与しています。App RouterではReact 18+の新機能(Server ComponentsやServer Actions等)を活かす構成となっており、ページ内で

を使用した際などにサーバー側の関数呼び出し(Action)が起こるような仕組みが提供されています。このとき、裏側ではReactのFlightプロトコルを用いたHTTPリクエスト(例えばデフォルトでは/_next/data/_next/formactionといったエンドポイント)が使われます。

一方、Pages Routerは旧来のサーバーサイドレンダリング方式で、Reactはクライアント側のみ、サーバーとのやり取りはAPI RoutesやSSR用の関数を介するだけでした。そのためPages RouterのNext.jsにはRSCプロトコル自体が存在しないか、仮に存在しても使われません。これが、Next.jsでApp Router利用時のみ脆弱となる理由です。

Next.js公式も今回の脆弱性について「Pages RouterアプリケーションやEdge Runtime(Next.jsをEdge環境で動かす場合)は影響を受けない」と明言しています。App Routerか否か、という違いが脆弱性の有無を分ける大きなポイントでした。現在App Routerへ移行したプロジェクトは多いですが、もし依然Pages Routerを利用しているプロジェクトであれば、この脆弱性については直接の心配はありません(とはいえ将来App Router移行時にはアップデート対応が必要です)。

純フロントエンド環境の場合:サーバー機能を持たないReactアプリへの影響有無

Reactは必ずしもサーバーサイドで動かす必要はなく、静的サイトやクライアントサイドオンリーのSPAとして使われることもあります。そのような純粋なフロントエンド環境の場合、このRSC脆弱性はどうなるでしょうか。

結論から言えば、バックエンド(Nodeサーバー)を伴わない純フロントエンドReactアプリであれば、この脆弱性の直接的な影響は受けません。なぜならRSCはサーバーコンポーネント機能であり、サーバー上で動く部分がなければ攻撃者が入り込む余地がないからです。例えば、React + static HTMLとしてビルドしたサイトや、API通信はするがサーバーレンダリングはしない単純なクライアントSPAは問題ありません。

しかし注意したいのは、プロジェクトで使っている依存パッケージとして脆弱なRSCモジュールが含まれているケースです。たとえ現在使っていなくても、依存関係に脆弱なコードがある状態は好ましくありません。例えば将来的に誤って有効化してしまったり、他のモジュールから利用される可能性もゼロではないためです。したがって、たとえ純フロントエンド構成であっても、依存パッケージは安全なバージョンにアップデートしておくことが推奨されます。

想定される被害・リスクはどれほど深刻か?認証不要のリモートコード実行がもたらす脅威と被害シナリオ

次に、この脆弱性が引き起こしうる被害とリスクについて考えてみます。CVSS 10.0というスコアが示す通り、本脆弱性は最悪の場合システムに甚大な被害をもたらします。具体的にどんな攻撃が可能で、成功すると何が起こりうるのか、いくつかのシナリオを想定してみましょう。

リモートコード実行(RCE)の脅威:サーバー側で任意コードが実行される危険性

リモートコード実行(RCE)とは、遠隔から送られてきた命令(コード)がそのままターゲットのシステム上で実行されてしまう脆弱性や攻撃手法のことです。今回のReact/Next.jsの脆弱性はまさにRCEの一種であり、攻撃者は特別に細工したデータを送るだけで対象サーバー上で自分の用意した任意のコードを動作させることが可能になります。

サーバー上で任意コードが実行できてしまう危険性は計り知れません。通常、攻撃者が得られる権限はアプリケーションが稼働しているプロセスの権限範囲になりますが、それでもサーバー乗っ取りに近い行為が可能になります。例えばファイルを読み書きしたり、外部に通信したり、他のプロセスを起動するなど、プログラムで出来ることは何でも実行されてしまう恐れがあります。RCEはWebアプリケーションにとって最も致命的な脆弱性の一つであり、この脅威がReact/Next.jsという広く使われる基盤に存在したというのは非常に重大です。

認証不要の攻撃手法:ログイン無しでも不正リクエストが可能な深刻性

さらに悪いことに、今回の脆弱性を悪用するために特別な認証や事前準備が不要だという点が、攻撃の容易さと深刻性を高めています。例えば一部の脆弱性では、攻撃者が管理者権限でログインしていないと実行できないとか、特定ユーザーのCookieを盗まないと悪用できないといった条件があります。しかしReact2Shell(CVE-2025-55182)の場合、誰でもHTTPリクエストを送るだけで攻撃が成立する可能性があります。

攻撃者は標的のウェブサイトに対して、RSC用のエンドポイント(Next.jsであれば/_next/formactionなど)に悪意あるリクエストを投げればよいのです。このリクエストは通常のユーザーからの操作(例えばフォーム送信)のように見えるため、サーバー側では怪しまれずに受理してしまいます。ログインしていなくてもアクセスできる公開のWebページ上の機能を経由して攻撃可能であるため、防御側から見ると非常に対処が難しい部類の攻撃です。

要するに、この脆弱性は「インターネットに公開されているReact/Next.jsサーバーなら誰でも攻撃できる」という厄介さを持っています。認証や特別なトークンが要らないので、自動化された攻撃スクリプトがインターネット上の多数のサイトを狙い撃ちすることも技術的には可能でしょう。そのため早急な修正適用が強く求められるわけです。

攻撃成功時に可能となる悪意ある行為:データ漏洩からサーバー乗っ取りまで

では、攻撃がもし成功してしまった場合、具体的に攻撃者はどのような悪意ある行為を行えるでしょうか。RCEが成立すると、攻撃者はアプリケーションサーバー内で自由にコードを実行できます。想定される行為の例を挙げます。

  • 機密データの窃取: データベースの接続情報やAPIキーなど、サーバー内に保存された秘密情報を読み取る。
  • ファイルシステムへのアクセス: サーバー上のファイルを自由に読み書きし、例えばユーザーデータを盗み出したり改ざんしたりする。
  • OSコマンドの実行: シェル経由で任意のプログラムを起動し、サーバーにバックドアを設置する、マルウェアをダウンロードさせるなど。
  • 横方向への侵害拡大: 一つのサーバーを乗っ取った後、そこから同じネットワーク内の他のサーバーやサービスへの攻撃拠点にする。
  • DDoSやサービス妨害: サーバー資源を消費させてサービスを停止させたり、別のターゲットへの攻撃トラフィック発信元にする。

このように、RCEが成功すれば攻撃者はやりたい放題です。特にNode.js環境ではOSのシステムコマンド呼び出しやファイル操作を行うAPI(child_processfsモジュール等)が容易に使えるため、攻撃の自由度が高いです。実際、今回の脆弱性に関する技術的分析では、vmモジュールによるコード実行やchild_process.execSyncによるシェルコマンド実行など、多彩な攻撃手法が取り得ることが示唆されています。

考えられる被害シナリオ:サービス停止やマルウェア配布など最悪のケース

上記の攻撃手段を踏まえると、被害の具体的なシナリオも様々考えられます。最悪のケースをいくつか想定すると:

  • 攻撃者がサーバー内の顧客データベースにアクセスし、大量の個人情報を漏洩させる。
  • ウェブサイトのコンテンツを書き換えて、フィッシングページやマルウェア配布サイトに改造する。
  • サーバー上にランサムウェアを仕掛けてファイルを暗号化し、サービスを麻痺させる。
  • 乗っ取ったサーバーから他の企業システムへの攻撃を行い、二次被害をもたらす。
  • 攻撃に気付かれないよう静かにバックドアを設置し、長期に渡り機密情報を抜き取り続ける。

これらはあくまで想定ですが、RCEの被害として実際に起こり得る内容です。特にReact/Next.jsはWebのフロントエンド系技術であり、「ユーザーに見える部分しか扱っていないから安全だ」と思っていた人にとって、サーバー側まで破られるというのは衝撃的でしょう。サービス運営者にとっては、サービス停止や顧客情報流出となれば甚大な信用失墜や損害賠償にも繋がります。

したがって、この脆弱性を「自分のところは大丈夫だろう」と軽視することは絶対にできません。万が一にも攻撃成功を許すと深刻な事態になるため、全力で対策すべきリスクだと言えます。

現時点での攻撃事例:PoC公開状況と実際の被害報告

では、公表から日が浅い現時点(2025年12月上旬)で、実際にこの脆弱性を突いた攻撃は報告されているのでしょうか。公式情報によれば、公表時点ではまだ本番環境での悪用報告は確認されていないとのことです。ただし、セキュリティコミュニティ内ではProof of Concept(概念実証、PoC)コードが作成され始めています。実際、GitHub上にはテスト用のリポジトリが公開され、脆弱な環境を再現してRCEが発生する様子を実演するコードが登場しました。

インターネット上では「既に攻撃が行われているらしい」という未確認情報が飛び交うこともありますが、公式にはまだ確証のある被害事例は挙がっていません。しかしながら、攻撃者が情報を得て手法を開発するまで時間の問題であることは間違いありません。CVEの公開から日が経つにつれ、攻撃コードが広まり実際の被害が報告される可能性が高まります。

特に注意したいのは、PoCが出回るとスクリプトキディ(既存の攻撃コードを利用するだけの攻撃者)でも簡単に攻撃できてしまう点です。そうなる前にアップデートを適用しておくことが重要です。現時点で被害が報告されていないからといって油断せず、先んじて防御策を講じましょう。

脆弱性の技術的な原因と仕組み:RSC(React Server Components)プロトコルに潜む問題点を解説

ここでは、今回の脆弱性がなぜ生じたのか、その技術的な原因と仕組みを掘り下げます。React Server Componentsの通信プロトコル(通称「Flight」プロトコル)にどんな問題が潜んでいたのか、そして攻撃者はどのようにその穴を突いたのかを解説します。

React “Flight”プロトコルの仕組み:サーバーコンポーネントのデータ通信方法

React Server Componentsでは、クライアントとサーバーの間でUIに関するデータ交換を行う特殊な通信プロトコルが使われています。これはReactの開発チーム内で「Flight(フライト)プロトコル」と呼ばれるものです。Flightプロトコルでは、クライアント側からサーバー側の関数(Server Action)を呼び出す要求や、サーバー側からコンポーネント描画用のデータをストリーム送信する際に、独自のシリアライズ形式でデータをやり取りします。

具体的には、Reactはコンポーネントのツリー構造や関数呼び出しを表現するメタデータをJSONに似た構造でパッケージ化し、HTTPリクエスト/レスポンスのボディに乗せて送受信します。クライアントが「このサーバー関数を実行して結果をちょうだい」というと、サーバーはそれを受けて処理し、結果としてUI更新に必要なデータ塊を送り返す、といった流れです。Flightプロトコルの目的は、UI更新に必要な最小限のデータを効率よくやり取りすることであり、開発者はその内部詳細を意識せずに済むよう抽象化されています。

ところが今回、そのFlightプロトコルの「データをシリアライズ/デシリアライズ(符号化/復号)する処理」に問題があることがわかりました。本来であれば信頼されたクライアントからの正当なデータがやり取りされることを前提にしていたためか、Reactはプロトコルデータの内容を厳密に検証せず処理を進めていた部分がありました。その結果、攻撃者が細工した異常なデータが来ても、Reactはそれを真に受けて処理してしまい、想定外の動きを許してしまったのです。

デシリアライズ処理の欠陥:不正な入力がコード実行に繋がるメカニズム

では、そのデシリアライズ処理の具体的な欠陥とは何でしょうか。技術的分析によれば、ReactのRSC関連コード中にあるモジュール読込用のヘルパー関数がポイントだったようです。ReactはFlightプロトコルで受け取ったメタデータを元に、サーバー側で必要なモジュールをrequireし、指定の関数や値を取り出す処理を行っています。この際、本来は取り出そうとしている対象(関数名や変数名)がモジュールに存在するかチェックすべきところを、チェックせずに直接アクセスしていたことが判明しました。

この挙動自体は一見些細なミスに思えますが、攻撃者からすると大きな抜け穴になります。なぜなら、モジュールに存在しない名前を指定してアクセスしようとするとJavaScriptの場合undefinedが返ります。しかしその先を辿ろうとする過程で、任意のプロパティ名を指定できるため、普通なら触れない内部プロパティにアクセスする手段になりえます。さらに工夫すると、そのプロパティにある関数を実行させる、といったことも可能になります。

例えば、Node.jsのモジュールには様々なプロパティや内部関数がありますが、攻撃者はメタデータを改ざんしてそれらにアクセスさせるよう細工できます。React側がチェックなくmoduleExportsのプロパティにアクセスする実装だったため、攻撃者の入力次第で本来呼ばれない関数(例えばシステム呼び出し系の関数など)を返すことができ、それをそのまま実行してしまう可能性が生まれました。これが不安全なデシリアライズによるコード実行に繋がったメカニズムです。

端的に言えば、Reactが「クライアントからの指示通りにモジュールのこの名前のエクスポートを返すよ」とやっていた部分が裏目に出て、悪意ある指示にも従ってしまったということです。本来なら「その名前のエクスポートは存在するか?不審な値ではないか?」とチェックすべきところを、チェックせず実行してしまっていたために起きたバグでした。

攻撃の流れ:特殊なペイロードがサーバーでコード実行に至るまで

ここまでの話を踏まえ、攻撃者がどのようにこの脆弱性を突くか流れを整理します。

  1. 攻撃者は標的サイトに対し、RSC用のエンドポイント(例:Next.js App Routerでは/_next/formaction等)にHTTPリクエストを送る。
  2. そのリクエストには、通常の利用では有り得ない特殊な形式のペイロード(Flightプロトコルデータ)が含まれている。内容には、Reactが特定のモジュールの特定のプロパティを読み出すよう仕向ける細工が施されている。
  3. サーバー側のReact(あるいはNext.js)はそのペイロードを受け取り、正規のリクエストだと思い込んで処理を開始。ペイロード内の指示に従いモジュールをロードし、指定されたプロパティを参照する。
  4. プロパティ名が本来ありえない値のため、React内部では意図していないモジュールのエクスポート(例えばNode.jsのvmchild_process関連の関数)が選択されてしまう。
  5. Reactは得られたエクスポートを本来の返り値としてクライアントに送り返そうとするが、その過程で攻撃者が仕込んだコードが実行される。これにより、攻撃者の任意コードがサーバー上で走ってしまう。

以上が簡単な攻撃の流れです。要は、「RSC通信→モジュール読込→コード実行」という一連の処理の中に、不正データが混入することで悪意あるコードまで実行されてしまうということです。Next.jsの検証では、特定のシナリオ(フォーム送信を模倣したPOSTリクエスト)でこれが再現されることが確認されています。

この攻撃はHTTPリクエスト一発で完結するため、防御側からすると通常のAPIコールとの区別が難しく厄介です。また、Flightプロトコルのデータは一見すると複雑なバイナリ/JSON混合のような形式で、人間の目では判断しづらいです。そのため、アプリケーションログに残っても気付きにくいという難点もあります。攻撃が成立すれば前述の様々な悪事を働かれてしまうため、本脆弱性はまさに「慎重に設計されたReactの処理フローにおいて見逃された盲点」を突いたものと言えるでしょう。

脆弱性が生まれた原因:新機能RSCにおける想定外の盲点と検証不足

なぜこのような脆弱性が生まれてしまったのでしょうか。根本的には、新機能導入時の想定外の盲点が原因だったと考えられます。Reactチームは開発当初、RSCのFlightプロトコルに関して「信頼されたフロントエンドからの通信である」という前提を置いていた可能性があります。つまり、悪意あるデータが飛んでくるとは想定せずに実装してしまった部分があったのでしょう。

また、RSC自体まだ新しい試みであり、従来のセキュリティテストでは網羅しきれなかった部分とも言えます。ReactはUIライブラリであってセキュリティに直接関わる機能は少ないというイメージがありました。しかし今回、サーバーとの境界に跨る処理をReact側が担うことで、「フロントエンドライブラリにもかかわらずサーバー側のセキュリティリスクを内包する」ことになりました。新技術の複雑さゆえに、従来の発想では見逃しがちな脆弱性が紛れ込んでしまったと言えます。

言い換えれば、RSCという強力な機能の導入に急ぐあまり、セキュリティ上の検証やレビューが十分でなかった可能性も指摘されています。もちろんReactチームは高い専門性を持って開発していますが、それでもゼロリスクにはできません。新しいパラダイムを導入する際には、今回のような予想外の攻撃ベクトルが生じ得ることを改めて示す結果となりました。

Log4Shellとの比較:広範な影響を及ぼした脆弱性との共通点と相違点

最後に、React2Shellが比肩されるLog4Shellとの比較に触れてみます。Log4Shell(CVE-2021-44228)はJavaのログライブラリLog4jにおけるRCE脆弱性で、任意のLDAPリファレンスをログに含めるだけで攻撃者がサーバーへ侵入できるというものでした。React2ShellとLog4Shellには共通点と相違点があります。

共通点としては、非常に広範囲のシステムに影響が及ぶ可能性がある点、攻撃難度が低く(データを送るだけ)、結果の深刻さが極めて高い点が挙げられます。どちらもインターネット全体で大騒ぎになるレベルのインパクトを持っています。また、ソフトウェア設計上の盲点を突かれたという点でも似ています。

相違点としては、Log4Shellはシステム外部から外部リソースを参照させることでコード実行するといういわばインジェクション系の攻撃でしたが、React2Shellはシステム内部のモジュールの扱い方の不備を突いた攻撃です。攻撃経路がテキストメッセージのログ vs 専用プロトコルデータという違いもあります。また、Log4Shellは既に攻撃コードが満ち溢れてしまったのに対し、React2Shellはまだ認知されて間もないため被害はこれから広がる可能性がある、という時間軸の違いもあります。

いずれにせよ、React2Shell(CVE-2025-55182)は「第二のLog4Shellになりかねない」と警戒されているわけです。これら過去の重大インシデントと比較することで、その危険性を我々開発者もしっかり認識し、対策に生かす必要があります。

今すぐ取るべき対策とアップデート手順:脆弱性を解消するための緊急対応ガイド

では具体的に、開発者や運用担当者が今取るべき対策について説明します。この脆弱性を根本的に解消するには問題の修正が施されたバージョンへのアップデートが不可欠です。また、それ以外に取り得る緩和策があるかについても触れます。早期に安全な状態へ移行するためのガイドラインを示します。

React側の修正:脆弱性が修正されたRSC関連パッケージのバージョン

React本体に関しては、前述の脆弱な各RSCパッケージに対して修正版がリリースされています。具体的には以下のバージョンで問題が修正されました。

  • react-server-dom-webpack: 修正バージョン 19.0.1、19.1.2、19.2.1
  • react-server-dom-turbopack: 修正バージョン 19.0.1、19.1.2、19.2.1
  • react-server-dom-parcel: 修正バージョン 19.0.1、19.1.2、19.2.1

つまり、React 19系を利用している場合はそれぞれのパッケージを19.0.1以上、19.1.2以上、19.2.1以上にアップデートする必要があります。通常はnpm updateまたはnpm install [email protected]のようにして最新版へ上げればOKです。また、reactおよびreact-dom自体のバージョンも、最新のパッチが当たったものに更新しておくことが望ましいです(React 19.2.1など)。

これらパッケージの修正内容は、先ほど説明したチェック処理の追加などコードレベルの修正が含まれています。アップデートさえすれば潜在的な脅威は解消されるので、React側パッケージについては速やかにバージョンを上げてください。

Next.js側の修正:パッチが適用されたバージョンと具体的なアップデート手順

Next.jsに関しても、各メジャーバージョン向けにパッチがリリースされています。Next.js公式が発表した安全なバージョンは以下の通りです。

  • Next.js 15系: 15.0.5、15.1.9、15.2.6、15.3.6、15.4.8、15.5.7
  • Next.js 16系: 16.0.7

自分が使っているNext.jsのメジャーバージョンに応じて、上記いずれかの最新パッチバージョンにアップデートしてください。例えば15.2.x系を使っているならnpm install [email protected]と指定して更新します。同様に15.3系なら@15.3.6、16.0系なら@16.0.7です。15系の各バージョンラインで複数修正リリースが出ていますが、基本的にそれぞれ最新のものを適用すれば問題ありません。

もしNext.jsの14系カナリア(14.3.0-canary.77 以降)を使用していた場合は、Next.jsチームは一旦14系安定版にダウングレードすることを推奨しています。具体的にはnpm install next@14とすることで、14系最新安定版に切り替えられます。これはカナリア版でRSCを試験利用していたケース向けの緊急措置です。

Next.jsのアップデート後は、アプリケーションを再ビルドし、動作確認を入念に行ってください。大きなメジャーバージョンアップではないので機能破壊的変更はないはずですが、それでも依存関係が変わる可能性があります。特にApp Routerを使っている場合、React側のパッケージも同時に更新されるため、挙動が変わらないか注意深く見る必要があります。

その他ツールの対応:React RouterやExpoなど関連プロダクトのアップデート情報

React/Next.js以外にも、React Server Componentsを取り巻くエコシステムの様々なプロダクトが今回の脆弱性の影響を受けています。それらについても対応策が講じられています。

  • React Router(RSC対応版): React Routerの実験的なRSC統合機能を使っている場合、reactreact-dom、そしてRSC関連パッケージを最新にアップデートするよう案内されています。
  • Expo(React Native開発環境): Expo SDK自体は直接影響しませんが、ExpoでWeb向けにビルドする際にreact-server-dom-webpackを利用している場合があります。Expo開発者にはreact, react-dom, react-server-dom-webpackの最新版への更新が推奨されています。
  • RedwoodJS: RedwoodJSでは内部でRSCを扱うrwsdkパッケージが影響を受けました。対策としてrwsdkをバージョン1.0.0-alpha.0以降へアップデートすること、およびReact関連パッケージを最新にすることが推奨されています。
  • Viteプラグイン (@vitejs/plugin-rsc): ViteでRSCを取り込むための公式プラグインも脆弱でした。こちらも@vitejs/plugin-rsc@latestへ更新が必要です。
  • Parcel RSC: ParcelバンドラでRSCを利用するパッケージもアップデートがリリースされています。

このように、Reactに連なる周辺ツールもほぼ軒並みアップデートが必要でした。React公式ブログでは、これら各プロダクトごとの詳細な更新手順やバージョンについて触れられているので、該当する環境を使っている場合は公式情報を参照して確実に対策を行ってください。

暫定的な回避策はあるか:設定変更や機能無効化で防げない理由

脆弱性が発覚した際、アップデートまでの間に何か設定で無効化してしのげないか、と考えることもあります。しかし今回のケースでは、React/Next.js共に明確な回避設定は用意されていません。Next.jsのアドバイザリでも「脆弱なコードパスを無効化する設定オプションはない」と明記されていました。

つまり、RSC機能をビルド時にオフにするといった簡易的なスイッチは用意されておらず、またRSC関連のコードはNext.jsのApp Routerでは根幹に組み込まれているため、特定部分だけ避けるということが困難なのです。React側でも、RSCをサポートしている以上根底の実装が影響するため、実質避けようがありません。

そのため、唯一の確実な解決策は「アップデートを適用すること」です。アップデート以外の回避策を模索するより、できるだけ早く公式パッチを取り入れる方がはるかに安全です。どうしてもアップデートがすぐ適用できない事情がある場合、Web Application Firewall (WAF)等で特定の怪しいリクエストパターンを遮断するなどの緩和策は考えられますが、根本的な防御ではありません。後述するように一部サービスではWAFルールが提供されていますが、あくまで時間稼ぎに過ぎない点に注意が必要です。

ホスティングサービスの対応:Vercel等による一時的緩和策とアップデートの重要性

ReactやNext.jsの関係者は、主要なホスティングプロバイダやクラウドサービスとも連携して今回の脆弱性に対処しています。例えば、Next.jsの開発元であるVercelは、ユーザーにメールで注意喚起を行うとともに、自社プラットフォーム上でホストされているNext.jsアプリに対して一時的な防御策を実施したとされています。また、CloudflareはWAF(Webアプリケーションファイアウォール)のルールセットを更新し、CVE-2025-55182の攻撃パターンを検出・ブロックする規則を即座に全ユーザーに適用したと発表しています。

これらホスティング側の対応は非常に心強いものです。特にCloudflare WAFはグローバルに広く使われているため、一定の攻撃トラフィックは遮断されるでしょう。しかし、これらはあくまで緩和策であり、万能ではありません。攻撃パターンが高度化すればすり抜けられる可能性もありますし、全ての環境がWAFで守られているわけでもありません。何より、ホスティング事業者の対処があるからといって、開発者側がアップデートを怠って良い理由にはなりません。

したがって、ホスティングサービス側の措置に安心せず、最終的な責任は開発者・運用者側にあると考えてください。WAF等で猶予を得ている間に速やかに自分たちのアプリケーションをアップデートし、根本的に脆弱性を除去することが何より重要です。

自分の環境が影響を受けるか確認する方法:脆弱性の有無をチェックする手順とポイント

ここまでで脆弱性の内容と対策は理解できたかと思います。しかし、そもそも「自分のプロジェクトはこの脆弱性の影響下にあるのか?」を確認することも大切です。以下に、自分の環境が該当するかどうかをチェックする方法やポイントをまとめます。

パッケージバージョンの確認方法:ReactとNext.jsの現在使用中バージョンを調べる

まずは、自身のプロジェクトで使用しているReactおよびNext.jsのバージョンを確認しましょう。最も簡単なのはpackage.jsonを見ることです。dependenciesまたはdevDependenciesに記載されている"react", "react-dom", "next"のバージョン番号をチェックします。ここで、先述の脆弱なバージョン範囲(React 19.2.0以下、Next 15.x/16.0.6以下など)に該当していれば要注意です。

他にも、ターミナルでnpm list reactnpm list nextとコマンドを打てば現在インストールされているバージョンを確認できます。npm lsコマンドを使うと依存ツリー上でどのバージョンが入っているか一覧が表示されるので便利です。とにかく、自分のReact/Next.jsのバージョンが安全圏かどうか、まず現状を把握することが出発点となります。

RSC関連パッケージの有無チェック:依存関係から脆弱性影響を判断する

次に、プロジェクト内でRSC関連の脆弱なパッケージが含まれていないか確認します。直接react-server-dom-webpack等をインストールしていなくても、Next.jsや他のフレームワーク経由で依存として入っている場合があります。npm ls react-server-dom-webpackなどのコマンドで、依存関係に該当パッケージが存在するかを調べてみましょう。

もしreact-server-dom-***系のパッケージが表示され、そのバージョンが19.2.0以下であれば脆弱なバージョンです。ただしnpm lsでは開発環境の依存など全て表示されるため、利用していない場合も載ることがあります。重要なのは、本番環境で実際に使われているかどうかですが、判断が難しければ念のためアップデートしておくのが安全策です。

また、Next.js 13系以前を使っているからといって安心せず、依存ツリー上にRSCパッケージが紛れ込んでいないか確認しましょう。例えば他のモジュールが誤ってRSCパッケージに依存している可能性もゼロではありません。プロジェクト全体の依存関係を洗い出し、脆弱性関連のパッケージが無いかチェックすることが肝要です。

セキュリティスキャンの活用:npm auditや専用ツールで脆弱性を検知

現代の開発環境には脆弱性検出のためのツールが多数用意されています。これらを活用するのも手です。例えばnpm auditコマンドを実行すると、依存パッケージに既知の脆弱性がある場合警告を表示してくれます。実際、Next.jsのCVE-2025-66478はGitHubのAdvisoryデータベースにも登録されているため、npm auditやGitHub Dependabotなどで検知可能です。プロジェクトのGitHubリポジトリの「セキュリティ」タブに脆弱性アラートが出ていた、というケースも多いでしょう。

さらに商用の脆弱性スキャナ(Tenable, Qualysなど)を利用している場合は、それらの製品向けにも今回のCVE検出プラグインが迅速に提供されています。例えばTenableやQualysはReact2Shell検出用のシグネチャをリリースしており、自社のサーバー群をスキャンして脆弱なシステムがないか調べることができます。企業で大規模にReact/Next.jsを使っている場合、このような専用ツールも駆使して見逃しを防ぐと良いでしょう。

RSC機能の利用状況確認:アプリがサーバーコンポーネントを使用しているか判断する

プロジェクト内で実際にRSCの機能を使っているかどうかも把握しておく必要があります。例えばNext.jsの場合、プロジェクトのディレクトリ構成にapp/フォルダがあり、そこにServer Component(\"use client\"を付けていないコンポーネント)やServer Actions(サーバー関数)が実装されていれば、RSCを活用している証拠です。React Routerの場合はunstable版のRSC対応APIを使っていないか確認します。

RSCを使っていなくても、Next.js 15以降でApp Routerがデフォルト有効であれば、内部的にはRSCサポートがロードされています。ですから、表向き使っていなくてもモジュールは含まれているケースが多いでしょう。それでも、自分のアプリが例えばフォームのServer Actionを実装しているかなどは把握しておくと、攻撃経路がどこにあり得るか想定できます。

もしRSC/Server Actionを積極的に使っているなら、そのエンドポイントが直接インターネットからアクセス可能かを考えてみます。Next.jsの場合、フォームからPOSTされるActionは認証が無ければ通常全ユーザーが叩けてしまいます。そうした部分には特に注意を払い、必ずアップデート対応を行いましょう。逆に言えば、RSC/Action未使用でPages Router中心のサイトなら緊急度は若干下がりますが、依然パッケージ更新自体は必須です。

攻撃兆候のモニタリング:ログやトラフィックから不審なリクエストを検出

最後に、既に攻撃されていないか、また今後攻撃の試みがないかをモニタリングすることも重要です。具体的にはサーバーログやトラフィックの中に不審なリクエストが来ていないかを確認します。Next.jsの場合ですと、POST /_next/formactionといったURLへのアクセスが頻繁に試みられていないか、また通常ではあり得ないペイロード(サイズが異常に大きい、意味不明なバイナリデータが含まれる等)が送られてきていないかをチェックします。

もし怪しいリクエストを見つけた場合、それは攻撃の前触れかもしれません。WAFやログ監視ツールを導入している場合は、CVE-2025-55182関連のシグネチャが提供されていないか確認し、適用しましょう。Cloudflare WAF等では自動的に遮断される例もありますが、自前の環境ではそのような保護が無いこともあります。

とはいえ、攻撃兆候を見つけた頃には既に遅い場合も多々あります。やはり「攻撃されていないか?」を気に病むより、「攻撃されても大丈夫なようアップデートする」ことが最善策です。モニタリングは補助的な検出策と割り切り、基本的には脆弱性の除去(アップデート)を完了させるまでの参考情報源と捉えるのが良いでしょう。

本脆弱性が与える影響と開発・運用上の注意点:エンジニアが留意すべきセキュリティ上のポイント

最後に、今回の脆弱性が我々エンジニアにもたらした教訓や、今後の開発・運用で注意すべき点をまとめます。単に「アップデートして終わり」ではなく、広くソフトウェア開発におけるセキュリティ意識向上につなげることが大切です。

開発プロジェクトへの影響:緊急アップデート対応による進行への影響

今回の件では、多くの開発プロジェクトが緊急のアップデート対応を迫られました。突然降って湧いた脆弱性情報により、予定していた機能開発やリリースを一時中断し、まず脆弱性修正を適用する作業を優先したチームも多いでしょう。開発スケジュールに影響が出るのは痛手ですが、セキュリティインシデントでは素早い対処が何より重要です。

このような緊急対応は短期的には生産性を下げるかもしれませんが、長期的に見ればプロダクトとユーザーを守るために不可欠なプロセスです。開発チームは今回の経験を踏まえ、脆弱性情報を常にウォッチする体制や、いざという時に即応できる手順書などを整備しておくことが望まれます。また、依存関係のアップデートを定期的に行い、日頃から最新の安全な状態を保つようにしておくことも、アップデート対応をスムーズにする秘訣でしょう。

運用面での影響:サービス停止リスクとインシデント対応体制の重要性

運用の観点でも、本脆弱性は重要な示唆を与えました。もし脆弱性が悪用されていれば、サービス停止やデータ漏洩といったインシデントに直結する恐れがありました。幸い迅速な対処のおかげで大事には至っていませんが、運用チームは常に最悪の事態を想定して備える必要があると再認識されたでしょう。

具体的には、インシデント発生時の影響範囲調査や対応手順をあらかじめ決めておくこと、バックアップ体制の見直し、監視アラートが上がった際の連絡フロー確認等が考えられます。また、WAFの導入やログ監視強化など、普段からセキュリティの多層防御を取り入れておくことも運用上のリスク軽減につながります。React/Next.jsのようなアプリでも、突き詰めればサーバーサイド技術なので、セキュリティは運用上の最優先事項であることに変わりはありません。

セキュリティ意識向上の機会:脆弱性対応から学ぶ安全な開発習慣

今回の出来事は、開発者にとってセキュリティ意識を高める良い機会となったはずです。普段フロントエンド開発に注力しているエンジニアにとって、Reactの脆弱性がこれほど大事になるとは想像していなかったという声もあるでしょう。しかしソフトウェアはどんな部分にも脆弱性が入り込む可能性があります。

この経験から、日頃から安全なコーディング習慣を身につけることや、セキュリティに関する勉強を怠らないことの重要性を改めて感じた人も多いでしょう。例えば、入力を信用せず検証するという原則はバックエンドのみならずフロントエンドのライブラリ開発にも当てはまるのだ、という教訓です。また、依存するOSS(オープンソースソフトウェア)のセキュリティアドバイザリをチェックする習慣、脆弱性公表時に速やかにプロジェクト内で情報共有する文化づくりなども大切です。

一つの脆弱性対応を乗り越えるたびに、開発チーム全体のセキュリティリテラシーが向上していくのが理想です。その意味でReact/Next.jsユーザーコミュニティは今回貴重な経験を積んだと言えるでしょう。

新技術採用時の注意:RSC導入におけるリスク評価と事前検証の必要性

React Server Componentsのような新技術は開発を前進させる原動力になりますが、同時に今回のような思わぬリスクを伴うことがあります。新しいパラダイムをプロダクションに導入する際には、事前のリスク評価と十分な検証が不可欠です。

具体的には、実験的機能やメジャーアップデートを安易に本番適用しない、適用するにしてもセキュリティレビューを挟む、想定される脅威モデルを洗い出しておく、といった対策が考えられます。RSCの場合、クライアントからサーバーを操作できるという点で、従来になかった攻撃パターンが生まれる可能性は理論上想定できました。そうした潜在的な危険にどれだけ気づけていたかが問われます。

もちろん、新技術を積極的に取り入れること自体は悪いことではありません。しかし、導入後もしばらくは警戒を怠らず、脆弱性情報に敏感になること、問題があれば素早くアップデートできる体制を作っておくことが重要です。今回の件を教訓に、今後は新機能採用時にセキュリティ面のチェックリストを用意するなどの工夫をしてみると良いでしょう。

早期発見と迅速対応:Reactコミュニティの対処から得られる教訓

最後に、Reactコミュニティおよび関係者の迅速な対応から学ぶべきことがあります。Lachlan氏による通報からわずか数日のうちにパッチが作成・リリースされ、各社も連携してユーザーへの通知・防御策適用を行いました。これだけの早期発見と素早い対処がなければ、悪意ある攻撃者に先手を取られて被害が広がっていたかもしれません。

このことから、コミュニティ全体でセキュリティ情報を共有し協力して対応する重要性が再確認できます。オープンソースの強みは、多くの目がコードを見て問題を見つけ、そして直していける点です。Reactチームと外部研究者や他フレームワーク開発者が一丸となって動いた今回のケースは、それを体現しています。

我々個々の開発者も、単に待ち受けるのではなく積極的に情報収集し、必要があれば報告・協力する姿勢を持ちたいものです。また、脆弱性公表後は可能な限り早くパッチを適用し、コミュニティの呼びかけに応えることも大切です。早期発見・早期対応の文化を育むことが、長い目で見て自分たちの開発プロジェクトを守ることにつながるでしょう。

React・Next.js以外の関連フレームワークやサービスへの波及:周辺エコシステムへの影響範囲と対応状況

ReactとNext.jsの話題が中心でしたが、今回の脆弱性はそれ以外のツールやサービスにも少なからず影響を与えました。最後に、周辺エコシステムでどのような波及があったか、そして各プロダクト・サービスがどのように対応したかについて触れておきます。

React Routerへの波及:不安定版RSC機能の影響とアップデート対応

React公式が提供するルーティングライブラリReact Routerも、この脆弱性とは無関係ではありませんでした。React Router自体はクライアントサイドのルーティングを行うライブラリですが、2023年頃から将来のReact Server Components対応を見据えた実験的APIを提供していました(未成熟な機能で、利用していない開発者も多い状況)。このReact RouterのRSC対応部分もReactの脆弱なコードに依存しているため、潜在的に影響を受けています。

React Routerの開発チームは、脆弱性公表後に推奨対応をアナウンスしました。それによれば、React RouterでRSCを試していた場合には、react, react-dom, react-server-dom-webpack等の関連依存をすべて最新にアップデートする必要があります。要するにReact自身のアップデートに追随する形です。幸いReact RouterのRSC機能はまだ一般利用されていなかったため、大きな混乱には至りませんでしたが、React Router利用者でRSCに関する設定を入れていた場合は忘れずにアップデートしてください。

Expoへの波及:React Native環境におけるRSC対応状況と対策

ExpoはReact Native向けの開発プラットフォームですが、ExpoアプリをWebに展開するケースや、Expoエコシステム内でReactの機能を使う部分があります。直接的にはExpoはReact Native(モバイル)なので今回のRSC脆弱性の影響はほとんどありません。ただ、一部Expo SDKでWebレンダリングを行う際に、内部でreact-server-dom-webpackなどを参照している可能性があるとの指摘がありました。

Expoチームからは公式な声明は出ていませんが、React公式の案内ではExpoユーザーも念のためreact, react-dom, react-server-dom-webpackを最新に上げるよう推奨されています。これは、Expoで裏側にNext.jsやWebサーバー機能を組み込んでいるケースに備えた措置と言えます。多くのExpoユーザーには無関係かもしれませんが、ExpoでWebサポートを有効にしている場合は一応アップデートするに越したことはないでしょう。

RedwoodJSへの波及:Redwood SDKにおける脆弱性対応状況

RedwoodJSはReactとGraphQLなどを組み合わせたフルスタックフレームワークです。そのRedwoodJSに付属するRedwoodJS SDK (rwsdk)というパッケージでも、RSCの仕組みを取り入れた部分があり、今回のReact脆弱性の影響を受けました。RedwoodJSチームは、脆弱性公表に合わせて開発版で対応を行っています。

具体的には、rwsdk1.0.0-alpha.0以降でReact側の修正を取り込む形になっており、Beta版/Stable版についても順次対策が入る見通しです。RedwoodJS利用者に対しては、「もしAlpha版を使えるなら上げておくこと、難しければReactとreact-server-dom-webpackを最新にせよ」といった注意喚起がされています。RedwoodJSコミュニティもまだ比較的小規模ですが、フルスタックフレームワークであるだけに、この種のセキュリティ問題への対応は極めて重要です。RedwoodJSを採用しているプロジェクトでは、この脆弱性に関するアップデート情報をフォローしておくべきでしょう。

ViteやParcelへの波及:RSCプラグインのアップデートと影響範囲

モダンフロントエンドのビルドツールであるViteParcelも、React Server Components対応のプラグインを提供しています。@vitejs/plugin-rsc@parcel/rscといったプラグインがそれで、ReactプロジェクトでRSCを利用する際に使われます。これらもReactのRSCパッケージに依存しているため、脆弱性の影響を受けました。

Vite公式からは、@vitejs/plugin-rscの最新版へアップデートすることが推奨されています。Parcel側も同様に、RSC機能のパッケージを更新する案内が出ています。ビルドツール自体(Vite本体やParcel本体)は今回の脆弱性とは関係ありませんが、プラグインレベルで依存している以上、無視できません。ViteやParcelユーザーは、自分のプロジェクトでこれらRSCプラグインを使っているか確認し、該当するならアップデートしましょう。

影響範囲としては、これらプラグインを使ってRSCを試していた開発者は限られるため大規模な混乱にはなりませんでした。しかし将来的にRSCが普及していけば、ビルドツールへの組み込みも一般的になるでしょう。そうなった際には、今回のような問題もより広範に波及しうることを念頭に置く必要があります。

ホスティングサービスへの影響:Vercel等のプラットフォームによる対策と今後の課題

最後に、ホスティングサービスやクラウドプラットフォームへの影響についてです。今回特にクローズアップされたのは、VercelCloudflareでしょう。VercelはNext.jsの開発元かつホスティング提供者であり、多くのNext.jsアプリがVercel上で動いています。Vercelは発覚直後にユーザーへメールで通知を行い、また自社側でも何らかの緩和策(詳細は公開されていませんがおそらくWAF的なフィルタリング)を取った模様です。

Cloudflareは前述の通りWAFルール適用で迅速に動きました。その他、FastlyといったCDNプロバイダも自社ブログでReact RCEへの対策を紹介するなど、プラットフォーム側でも動きが見られました。これらは歓迎すべき対応ですが、一方で課題も残ります。全てのサービスがこんなに速く動けるわけではありませんし、そもそも単純なホスティング(例:自社サーバーや小規模VPS等)では自分で対処するしかないからです。

今後の課題として、クラウドサービス上で新機能(今回で言えばRSC)を使う際のベストプラクティスを共有したり、サービス提供側がユーザーの設定に応じて自動防御できる仕組みを整えるといったことが考えられます。例えば、Next.jsのApp Routerを有効にしてデプロイした場合は自動的にWAFルールも有効になる、などの仕組みがあれば被害はかなり防げるでしょう。現状そうした連携は始まったばかりですが、今回の一件を機に議論が進むかもしれません。

いずれにせよ、React・Next.js以外の周辺への波及も、最終的には各開発者がきちんとアップデートすることで収束します。エコシステム全体で協力し、適用可能な全てのプロダクトで脆弱性が除去されるよう努めていくことが重要です。

資料請求

RELATED POSTS 関連記事