React Server Components 脆弱性 CVE-2026-126187(GHSA-xqc2-xf4c-x3h3) は、React Server Components(RSC)のパッケージ react-server-dom-webpack・react-server-dom-turbopack・react-server-dom-parcel にある認証不要のリモートコード実行(RCE)です。2026-10-14 に公開され、重大度は Critical(CVSS v4 で 9.5)、修正版も同じ日に出ています。成立する条件は狭いのですが、見えにくい件です。CVE が付いて npm audit に出たのは公開から27日後の 11-10 で、Next.js と Vite の RSC プラグインでは、脆弱なコードが今も npm audit・npm ls に出ない場所に隠れています。
TIMELINE公開から修正版まで(UTC)
修正は同じ日。React 側が npm audit に出たのは27日後
-
10/14
React が修正版とアドバイザリ2件を公開
react-server-dom-* 19.0.9/19.1.10/19.2.9/19.3.1。RCE と DoS、公開時はどちらも CVE なし
-
10/14
Next.js 16.4.1 と GHSA-673q
use cache が型付き配列を返す構成の RCE。発見者と CVSS ベクトルは React 側と同じ
-
10/22
Next.js 側が先に Advisory Database に登録
npm audit が next 16.0.0〜16.4.0 を critical と出すようになった
-
11/10
React 側の RCE も Advisory Database に登録
CVE-2026-126187 が付き、npm audit が react-server-dom-* を critical と出すように。DoS の GHSA-h3gv は未登録
30秒でわかる(2026-11-11)
- ・時系列:公表日は 2026-10-14。React の修正版と Next.js 16.4.1 が同じ日に出た。React 側は 11-10 に CVE-2026-126187 が付き、npm audit に出るようになった
- ・対象:react-server-dom-* の 19.0.0〜19.3.0 の各系列と、Next.js 16.0.0〜16.4.0。RSC を使わない React アプリは対象外
- ・見えない場所:Next.js と
@vitejs/plugin-rscは中にコピーを持つので npm ls に出ない。plugin-rsc のコピーは今も npm audit に出ない - ・まず確認:node_modules の中のコピーが修正済みかを、下の確認コマンド①で見る
まずやること(構成別)
- Next.js 16(App Router):next を 16.4.1 以上に上げる。use cache を使っていなくても上げる(公式に回避策なし)。react や react-dom を上げても直らない。
- Next.js 15:公式の対象外。15.5.28 の同梱コピーにも同じ修正が入っているので、15.5.28 以上にしておく。
- Vite で RSC を使う構成(React Router・vinext・Waku・TanStack Start):
@vitejs/plugin-rscを 0.5.38 以上に上げる。react-server-dom-webpack を入れているなら 19.3.1 以上にも上げる。 - RedwoodSDK・Expo Router・Parcel・React on Rails:react-server-dom-* を 19.0.9/19.1.10/19.2.9/19.3.1 以上に上げる。11-10 から npm audit が critical と出す。
- 動いている環境:lockfile を直しても、ビルド済みのデプロイやプレビュー環境は古いまま。作り直すか消す。
土台の考え方は サプライチェーン攻撃とは|手口・防御ツール比較・npm 12の新機構まで実践解説、React の脆弱性全般との付き合い方は React 脆弱性の多くは本体ではない を参照してください。
React Server Components 脆弱性の時系列と、2つのアドバイザリ
| 日時(UTC) | 出来事 |
|---|---|
| 2026-10-14 16:47〜16:56 | react-server-dom-* の修正版 19.0.9・19.1.10・19.2.9・19.3.1 が npm に公開 |
| 2026-10-14 | React が GHSA-xqc2-xf4c-x3h3(RCE・Critical)と GHSA-h3gv-c5rc-p453(Server Functions の DoS・High)を公開。どちらも CVE なし |
| 2026-10-14 17:36/17:43 | Next.js 15.5.28 と 16.4.1 が npm に公開。Next.js が GHSA-673q-mjm6-r5xr(use cache の RCE・Critical)を公開 |
| 2026-10-22 | GHSA-673q が GitHub Advisory Database に登録(reviewed) |
| 2026-11-10 22:44 | GHSA-xqc2 が GitHub Advisory Database に登録(reviewed)。CVE-2026-126187 が付き、npm audit が react-server-dom-* を critical と出すように |
| 2026-11-11 | DoS の GHSA-h3gv は未登録のまま |
React の GHSA-xqc2 と Next.js の GHSA-673q は、どちらも発見者が evolutionstorm 氏で、CVSS v4 のベクトルも同じです。そして 16.4.1 で、Next.js の同梱コピーに React と同じ修正が入りました。Next.js のアドバイザリは React 側を名指ししていませんが、同じ欠陥を Next.js の構成で言い直したものと読めます。Next.js 側の条件は「App Router で Cache Components を使い、型付き配列を複数返す use cache 関数がある」ことです。
GHSA-h3gv の説明文は影響範囲を「19.0.0〜19.0.7」などと書き、同じページの版の一覧(19.0.8 などを含む)と食い違っています。修正版はどちらも同じなので、修正版まで上げれば両方が片づきます。
何が起きたか——長さを先に書き、中身を後で飛ばしていた
型付き配列は Uint8Array などのバイナリを扱う配列で、RSC の応答(Flight 形式)はこれを「長さを書いた見出し」と「中身のバイト列」の2つに分けて運びます。修正前の 19.3.0 のサーバー用コードを読むと、次の順で処理していました。
- 応答を組み立てるときに、その時点のバイト数で見出しを作り、中身と一緒に送信待ちに積む
- 実際に書き出すときに、長さ0になった中身は何も言わずに飛ばす
複数の型付き配列は、1つの ArrayBuffer を共有するビューであることがあります。その ArrayBuffer が書き出しの前に切り離される(detached)と、ビューの長さは0になります。すると見出しは N バイトあると言っているのに、中身は送られません。読む側は、続くバイト列を中身として読んでしまいます。19.3.1 は、ここで切り離されたバッファを送ろうとしたら例外で止めるように変わりました。
クライアント側にも修正があります。ストリームを送るときのフォームの項目名が通常の部品の番号と同じ名前空間を使っていたのを、ストリーム専用の接頭辞(S)に分けています。どちらの変更がどの経路を塞いだのか、ずれがどうコード実行に至るのかは公表されておらず、当サイトでも再現していません。攻撃の手順は扱いません。
React2Shell との違い
React2Shell(GHSA-fv66-9v8q-g76r、2025-12-03)と対象のパッケージは同じですが、今回は「応答に型付き配列が複数あり、攻撃者が操作できる値が混ざる」という条件が付きます。GitHub Advisory Database は GHSA-673q を CWE-502(信頼できないデータのデシリアライズ)に分類していますが、差分から見える修正は Flight 形式の区切りを守る処理です。2026-11-11 には、実際に動く公開 PoC が GitHub に現れました。Python のエクスプロイトと、脆弱な Next.js 16.4.0 + React 19.3.0 の Docker ラボからなり、その README の対象版・修正版・根本原因は、本記事や公式アドバイザリと一致します(当サイトはコードを実行しておらず、手口は載せません)。実環境での悪用の報告はまだありませんが、誰でも試せるコードが出たことで、未更新のアプリの危険度は上がりました。GitHub Advisory Database は GHSA-xqc2 を CWE-502 に分類しています。
なぜ見落とすか:npm audit は27日遅れ、同梱コピーは今も見えない
ふだんの脆弱性管理がこの件を拾えるかを、npm の監査 API(npm audit が問い合わせる先)で確かめました。
| 確かめ方 | Next.js 16.4.0 | react-server-dom-webpack 19.3.0 | @vitejs/plugin-rsc 0.5.37 |
|---|---|---|---|
| CVE で探す | 出ない(GHSA-673q に CVE なし) | CVE-2026-126187 | 出ない |
| npm audit(11-08) | GHSA-673q が critical | 出ない | 出ない |
| npm audit(11-11) | GHSA-673q が critical | critical で出る | 出ない |
| npm ls react-server-dom-webpack | 出ない(next の中のコピー) | 出る | 出ない(dist/vendor のコピー) |
React 側は、公開から 11-10 に登録されるまでの27日間、npm audit を毎日回していても警告が出ませんでした。Next.js 側も、登録された 10-22 までの8日間は出ていません。そして今も、@vitejs/plugin-rsc が持つコピーは react-server-dom-webpack として数えられないため、npm audit では見えません。Vite で RSC を使う構成は、下の確認コマンド①で中身を見てください。
対策——フレームワーク別に、どこにコピーがあり何を上げるか
WHERE THE COPY LIVESnpm ls で見える構成・見えない構成
Next.js と Vite のプラグインは中にコピーを持つ
依存として入る(npm ls に出る)
- Waku(peer: ~19.3.1)・RedwoodSDK(peer)
- Expo Router(peer: ~19.0.4〜~19.3.0)
- Parcel(@parcel/rsc の依存: ^19.1.1)
- React on Rails(react-on-rails-rsc: ~19.3.0)
中にコピーを持つ(npm ls に出ない)
- Next.js:next/dist/compiled に4つ
- @vitejs/plugin-rsc:dist/vendor に1つ(0.5.38 から 19.3.1)
- → React Router・vinext・TanStack Start(Vite)が使う
- react-server-dom-webpack を入れるとそちらを優先
RSC に対応した主なフレームワークが react-server-dom-* をどう持っているかを、npm の依存表記と配布物の中身で確かめました(2026-11-09)。Next.js だけでなく、Vite の RSC プラグイン @vitejs/plugin-rsc も中にコピーを持っています。
| フレームワーク(確認した版) | react-server-dom-* の持ち方 | 上げるもの |
|---|---|---|
| Next.js | next の中にコピー(依存の記載なし) | next を 16.4.1 以上(15系は 15.5.28 以上) |
| @vitejs/plugin-rsc(0.5.39) | dist/vendor にコピー。プロジェクトに react-server-dom-webpack があればそちらを使う |
plugin-rsc を 0.5.38 以上。react-server-dom-webpack を入れているなら 19.3.1 以上も |
| React Router の RSC(@react-router/dev 8.5.1) | plugin-rsc(~0.5.26)経由。react-server-dom-webpack は任意の peer(^19.2.7) | plugin-rsc と、入れていれば react-server-dom-webpack |
| vinext(1.4.4) | plugin-rsc(^0.5.37)と react-server-dom-webpack(^19.3.1) | lockfile の plugin-rsc が 0.5.37 なら上げる |
| Waku(1.0.0-rc.4) | plugin-rsc(^0.5.33)と peer の react-server-dom-webpack(~19.3.1) | 両方。旧版の waku は peer の範囲が古い可能性 |
| TanStack Start の RSC(@tanstack/react-start-rsc 0.1.66) | Vite なら plugin-rsc(>=0.5.30)、Rspack なら react-server-dom-rspack | Vite は plugin-rsc。Rspack は下の注意を参照 |
| RedwoodSDK(rwsdk 1.7.5) | peer の react-server-dom-webpack(>=19.2.0) | react-server-dom-webpack |
| Expo Router(58.0.30) | peer の react-server-dom-webpack(~19.0.4〜~19.3.0) | 入れている react-server-dom-webpack を同じ系列の修正版へ |
| Parcel(@parcel/rsc 2.16.4) | 依存の react-server-dom-parcel(^19.1.1) | lockfile の react-server-dom-parcel |
| React on Rails(react-on-rails-rsc 19.3.1) | 依存の react-server-dom-webpack(~19.3.0)。同梱は自前の読み込み処理だけ | lockfile の react-server-dom-webpack |
next の配布物を比べると、修正の検査は 16.4.1 と 15.5.28 の同梱コピーに入り、16.4.0 と 15.5.27 には入っていませんでした。@vitejs/plugin-rsc も同じで、0.5.37(10月13日)の同梱コピーは修正前の 19.3.0、0.5.38(10月15日)から修正版の 19.3.1 です。React Router・vinext・Waku・TanStack Start の Vite 構成はこのプラグインに乗っており、react-server-dom-webpack を入れていなければプラグイン側のコピーが使われます。peer で持つ構成は npm update react-server-dom-webpack(pnpm なら pnpm update)で上げ、react と react-dom も同じ系列に揃えます。
版番号が紛らわしいもの、修正版が無いもの
- react-on-rails-rsc 19.3.1:パッケージの番号は 19.3.1 ですが、公開は修正の5日前(10月9日)です。中で使う react-server-dom-webpack は lockfile によって 19.3.0 が残ります。
- react-server-dom-rspack:TanStack Start を Rspack で使う構成が依存します。React チームではなく個人が公開しているパッケージで、アドバイザリの対象には挙がっていません。最新の 19.3.0(2026-08-11)のサーバー用ビルドには、修正で足された検査が無く、修正前の公式版と同じ「長さ0の中身を飛ばす」書き出し処理が残っていました。この件の影響を受けるかは公表されておらず未検証ですが、修正版も出ていません。急ぐなら Vite 構成(plugin-rsc 0.5.38 以上)に寄せるのが確実です。
- Gatsby 5.16.1:2022年の実験版 react-server-dom-webpack を固定で依存に持ちます。影響範囲の表記(19.x)の外で、対象かは分かりません。
Remix・Astro など、RSC を使わないフレームワーク
React を使っていても、RSC(react-server-dom-*)を使わないフレームワークはこの件の対象外です。名前がよく挙がるものを、同じ方法で確かめました(2026-11-09)。
| フレームワーク(確認した版) | 中身 | この件 |
|---|---|---|
| Remix 3(remix 3.2.0、2026-11-04) | 依存に React も react-server-dom-* も無い。部品は独自の @remix-run/component |
対象外 |
| Remix v2(@remix-run/react 2.17.5) | React 18 と react-dom で描画し、RSC を使わない | 対象外。後継の React Router 7 以降で RSC を使うなら上の表 |
| Astro(astro 7.4.7・@astrojs/react 7.1.4) | React は「島」として react-dom/server で HTML にするだけ。RSC を使わない | 対象外 |
| Docusaurus(3.10.2)・vike-react(0.6.32) | 依存は react と react-dom だけ | 対象外 |
| Shopify Hydrogen(2026.10.2) | 依存に react-server-dom-* も plugin-rsc も無い | このパッケージ単体では対象外。組み合わせるルーターで RSC を使うなら上の表 |
| RedwoodJS(@redwoodjs/vite 8.9.0) | react-server-dom-webpack の 2024年8月の RC 版(19.0.0-rc)を固定で依存に持つ | 実験的な RSC を有効にしている場合だけ関係する。RC 版は影響範囲の表記の外だが、修正前と同じ「長さ0を飛ばす」書き出し処理が残っていた |
| @lazarv/react-server | 独自の Flight の実装 @lazarv/rsc を使い、react-server-dom-* を含まない |
対象のパッケージは含まない。同じ種類の欠陥があるかは未検証 |
RedwoodJS は、RSC を前提にした新しい RedwoodSDK(上の表の rwsdk)とは別のパッケージです。RedwoodJS 8 の RSC は実験的な機能なので、有効にしていなければ固定の RC 版は使われません。有効にしているなら、RSC を前提にした構成への移行を検討してください。
Docker イメージや standalone 出力、プレビュー環境は作り直すまで古いコピーで動きます。更新を配る間は、Node のサーバープロセスがシェルや想定外の子プロセスを起動していないかも見ておきます。
Node 20 では、修正の検査が警告に留まる
NODE VERSION MATTERS修正版の中身と Node の版
修正版でも Node 20 では警告だけになる検査がある
Node 21・22(detached あり)
- ArrayBuffer.prototype.detached が true
- 切り離されたバッファを送ろうとすると例外で止める
- 修正版の検査がそのまま効く
- 実測: 21.7.3・22.22.0 で true
Node 20(detached なし)
- ArrayBuffer.prototype.detached が無い
- 空のバッファを見つけても console.error を1回出すだけ
- React 自身が「Node の更新を」と警告文で促す
- 実測: 20.20.0 で false。Next 15 は Node 18 以降で動く
修正版の検査は ArrayBuffer.prototype.detached を使います。これが無い Node では、空のバッファを見つけても例外にせず、console.error で一度だけ警告して処理を続けます。警告文には「バッファが本当は空でなかったならセキュリティ上の問題になりうる。ArrayBuffer.prototype.detached に対応した Node に更新を」とあります。手元では Node 20.20.0 で detached が無く、21.7.3 と 22.22.0 では有りました。Next.js 16.4.1 は Node 20.9 以降で動きます。修正版に上げることが先で、そのうえで Node 22 以降へ移す計画を立てます。Node 20 でこの件が再び成立するのかは未検証です。
自システム確認コマンド——同梱コピーまで見る
① node_modules にある react-server-dom-* のサーバー用ビルドが修正済みかを1件ずつ出します。Next.js と @vitejs/plugin-rsc の同梱コピーも、pnpm の .pnpm の下も拾います。
find node_modules -path '*react-server-dom*/cjs/*-server.node.production.js' -o -path '*react-server-dom*/cjs/*-server.edge.production.js' | while read -r f; do
if grep -q 'Cannot transport a detached buffer' "$f"; then echo "修正済み $f"; else echo "要更新 $f"; fi
done
要更新 が1行でも出たら、そのパスの持ち主(next・@vitejs/plugin-rsc・react-server-dom-* のどれか)を上げます。判定に使う文字列は修正で足された例外のメッセージで、19.0.9・19.1.10・19.2.9・19.3.1 と next 15.5.28・16.4.1 のサーバー用ビルドに含まれ、修正前の版には無いことを確かめています。next 16.4.0 と 19.3.0 の検体では10件すべてが 要更新、16.4.1 と 19.3.1 では10件すべてが 修正済み でした。plugin-rsc は 0.5.37 で2件とも 要更新、0.5.38 で2件とも 修正済み です。
② 依存として入っている版と next の版を見ます。Next.js の同梱コピーはここには出ないので、①と合わせて使います。
npm ls next react-server-dom-webpack react-server-dom-turbopack react-server-dom-parcel
③ サーバーで動かしている Node が ArrayBuffer.prototype.detached を持つかを見ます。false なら修正の検査が警告止まりになる環境です。
node -e "console.log('detached' in ArrayBuffer.prototype)"
これらのコマンドが判定するのは、入っているコピーと Node が修正済みかどうかだけです。攻撃を受けたかどうか、自分のアプリが型付き配列の条件に当たるかどうかは、このコマンドだけでは分かりません。全件が「修正済み」でも、Node 20 で動かしているなら安全とは言えません(③)。Yarn の Plug’n’Play のように node_modules を作らない構成では①が空振りするので、②と lockfile で版を確かめてください。型付き配列を返す関数を探して更新するかどうかを決めるより、更新するほうが早く確実です。
影響範囲——React Server Components 脆弱性の対象と対象外
| 構成 | この件の対象か |
|---|---|
| Next.js 16.0.0〜16.4.0(App Router・Cache Components) | 対象(GHSA-673q)。use cache が無くても上げる |
| Next.js 15 | 公式の対象外。15.5.28 の同梱コピーにも修正あり |
| Vite で RSC を使う構成 | @vitejs/plugin-rsc 0.5.37 以前の同梱コピー、または入れた react-server-dom-webpack が 19.3.0 以前なら対象 |
| そのほかの RSC 対応フレームワーク・独自構成 | react-server-dom-* が 19.0.0〜19.3.0 なら対象 |
| RSC を使わない React 系(Remix・Astro・Docusaurus など) | 対象外(react-server-dom-* を含まない) |
| react と react-dom だけの SPA・サーバーを持たないアプリ | 対象外(アドバイザリ) |
CVSS v4 のベクトルは攻撃元がネットワーク、認証も利用者の操作も不要で、型付き配列の条件のため「攻撃の前提条件あり(AT:P)」です。react-server-dom-parcel には 19.0.x が存在しない(19 系は 19.1.0 から)ので、parcel について 19.0.x を探す必要はありません。Next.js の別件の3件は Next.js CVE-2026-96889|SVG経由のRCEと10月の3件、sharpが古いまま残る落とし穴、React Router 側の別件は React Router v7 RCE脆弱性 CVE-2026-42211 にまとめています。
参照ソース
- GHSA-xqc2-xf4c-x3h3: Unauthenticated Remote Code Execution in React Server Components(React 公式アドバイザリ)(2026-11-08 確認)
- GHSA-xqc2-xf4c-x3h3 / CVE-2026-126187(GitHub Advisory Database の登録データ)(2026-11-10 22:44 UTC 登録、2026-11-11 確認)
- GHSA-h3gv-c5rc-p453: Denial of Service in Server Functions(React 公式アドバイザリ)(2026-11-08 確認)
- GHSA-673q-mjm6-r5xr(Next.js 公式アドバイザリ)・GitHub Advisory Database の同項目(2026-11-08 確認)
- react-server-dom-webpack(npm)・react-server-dom-parcel(npm)・next(npm) — 版・公開時刻・engines(2026-11-08 確認)





