Vercelが2026年5月6日、Next.jsに存在する9件のCVE(CVE-2026-44574〜44582)を一斉に開示した。翌5月7日には不完全修正のフォローアップとして GHSA-26hh-7cqf-hhc6(Turbopackミドルウェア経由のsegment-prefetchバイパス)が追加公開された。

最大CVSSは CVE-2026-44578(WebSocket経由のSSRF / CVSS 8.6)、続いて CVE-2026-44574(動的ルートパラメータ注入 / CVSS 8.1)。最終的な修正版はNext.js 15.5.18 と 16.2.6 で、5月6日の初期パッチ(15.5.16 / 16.2.5)から翌日に追加修正で2バージョン進んだ形になる。

Cloudflareは同社のChangelogで、Managed Rulesetの既存ルール2本(CVE-2025-55184・CVE-2026-23864向け)が今回のDoS系CVEを先回りでブロックしていると発表した。あわせて自社のNext.jsアダプタ「Vinext」は今回のCVEいずれにも該当しないこと、OpenNext on Cloudflareもハードニング済みであることが明示された。

ただしアプリ本体のパッチ適用は依然として推奨されており、Next.js 15.5.18 / 16.2.6 への計画的なアップグレードが望ましい。なお今回の最大CVSSは8.6でいずれもHigh区分に収まり、Critical級は含まれない。

セキュリティ全体の地図は サプライチェーンセキュリティ完全ガイド2026 をご覧ください。本記事は同ガイドのCVEクラスタに対応する個別速報です。

3行でわかるNext.js脆弱性10件

  • 10件のCVE+不完全修正フォローアップ1件を公開(最大はCVE-2026-44578 WebSocket SSRF / CVSS 8.6、High区分でCritical級は含まれない)。
  • ・最終修正版は Next.js 15.5.18 / 16.2.6(5月7日のフォローアップ反映後。15.5.16/16.2.5で止めるとTurbopackミドルウェア向け不完全修正分が当たらない)。
  • ・Cloudflare Managed WAFは過去CVE向けルールでDoS系をついでにブロックするが、SSRFとミドルウェアバイパス3件はWAFカバー外pnpm up next@^16.2.6 等でアプリ本体パッチを最優先で適用。

全10件の脆弱性 一覧表(CVE / CVSS / 影響範囲)

最大はWebSocket SSRF(CVSS 8.6)、続いて動的ルート注入(8.1)、segment-prefetchバイパス(7.5)。High区分が4件、Critical級は含まれない——というのが10件の概観だ。

以下のテーブルはGitHub Security Advisoryで一次確認した10件をCVSS降順で整理したもの。各CVE番号から公式アドバイザリへ直接リンクしているため、原文と引用箇所をクロスチェックできる(GHSA IDは本文中の各セクションでも参照)。修正版はモバイル可読性のため省略形で記載:A=15.5.16/16.2.5(5月6日初回パッチ)、B=15.5.18/16.2.6(5月7日不完全修正フォローアップ反映後の最終版)。

CVE CVSS 深刻度 影響コンポーネント 修正版
44578 8.6 High WebSocketアップグレード経由のSSRF(自己ホストのみ) A
44574 8.1 High 動的ルートパラメータ注入によるミドルウェアバイパス A
44575 7.5 High segment-prefetch経由のミドルウェアバイパス(App Router) A
44575追 7.5 High 上記のTurbopackミドルウェア向け不完全修正フォローアップ B
44579 7.5 High Cache Components / Partial PrerenderingのDoS A
44580 6.1 Moderate beforeInteractive script経由のXSS A
44577 5.9 Moderate Image Optimization APIのDoS(OOM) A
44576 5.4 Moderate RSCレスポンスのキャッシュポイズニング A
44581 4.7 Moderate CSP nonce経由のXSS(共有キャッシュ環境) A
44582 3.7 Low RSC _rsc キャッシュバスティングの衝突 A

最終的に当てるべきバージョンは 15.5.18 / 16.2.6

5月6日に9件のCVEが公開され、暫定的な修正版は 15.5.16 / 16.2.5 だった。しかし翌5月7日に追加公開された GHSA-26hh-7cqf-hhc6(CVE-2026-44575のTurbopackミドルウェア経由バイパスへのincomplete-fix follow-up)により、最終修正版は 15.5.18 / 16.2.6 にずれ込んだ。15.5.16/16.2.5 で停止すると不完全修正フォローアップ分が当たらない点に注意。

一斉公開された背景:RSC関連アドバイザリの継続的な公開

今回の10件は突発の事故ではなく、半年で20件超に達したRSC関連CVEラッシュの一部——というのが背景の要点だ。

きっかけは2025年12月の CVE-2025-55182(React flightプロトコル経由のRCE) で、それ以来Vercel・React・GitHub Security Lab・外部の研究機関がRSC実装の境界条件を継続的に掘り下げている。結果として2025年Q4から2026年Q2にかけて、月1〜2件ペースで新規CVEが公開されている状況だ。

今回のリリースの位置づけ

  • ・全10件のうちHigh 4件(CVSS 7.5以上)、Moderate 4件、Low 1件、フォローアップ1件。Critical(9.0+)は含まれない
  • ・最大スコアは CVE-2026-44578 WebSocket SSRF(CVSS 8.6 / High)、続いて CVE-2026-44574 動的ルート注入(8.1 / High)
  • ・直前の主要CVE: CVE-2025-55182(RCE / 12月)CVE-2025-55184(DoS+ソース漏洩)CVE-2026-23864(メモリ枯渇DoS / CVSS 7.5)今回10件
  • ・Cloudflareの旧Managed Rule(CVE-2025-55184/CVE-2026-23864向け)が新CVEもカバーすることが追加検証で判明。

過去CVEとの関係を整理すると、今回のリリースは「2025年末のRCE関連アドバイザリでRSC実装に注がれた研究者の目線が、副次的にミドルウェア層・キャッシュ層・Image Optimization APIなど周辺コンポーネントへ拡張された結果」と読むのが自然だ。RSC本体だけでなく、Next.jsの周辺機能まで見直し対象になりつつある。

高深刻度4件の中身:SSRF/ミドルウェアバイパス/DoS

高深刻度4件は「SSRF」「動的ルート注入によるミドルウェアバイパス」「segment-prefetchバイパス」「Cache Components DoS」の4カテゴリに分かれる。Critical級ではないが、SSRFは内部メタデータ流出、ミドルウェアバイパスは認証回避につながるため運用影響は大きい。以下、攻撃ベクトル別に深掘りする。

CVE-2026-44578(GHSA-c4j6-fc7j-m34r)— WebSocket SSRF / CVSS 8.6

自己ホストのNext.jsアプリで、Node.js組み込みサーバーがWebSocketアップグレードリクエストを処理する際の検証不備。攻撃者は細工したアップグレードリクエストでサーバーから内部APIや任意の外部宛にリクエストを発行させられる可能性がある。

クラウド環境ではAWS IMDSv2やCloud Run/Workersの内部メタデータエンドポイントからIAMトークン・環境変数・シークレットが窃取される可能性が指摘されている。Vercelホストは影響なし、影響範囲は >= 13.4.13 の長期間にわたる。

修正は通常HTTPリクエストと同じセーフティ検証をWebSocketアップグレードにも適用する形で行われた。

CVE-2026-44574(GHSA-492v-c6pp-mqqv)— 動的ルートパラメータ注入 / CVSS 8.1

middleware.ts で認可をかけているApp Routerアプリで、特殊なクエリパラメータで動的ルート値を書き換えることでミドルウェアの認可チェックをバイパスできる。可視URLは変わらないため、ログ・WAF・監査では検知困難。修正では「内部ルートパラメータ正規化を信頼されたルーティングフローに限定」し、外部リクエストでのパラメータエンコーディングを拒否する。

CVE-2026-44575(GHSA-267c-6grr-h53f)+ GHSA-26hh-7cqf-hhc6 — segment-prefetchバイパス / CVSS 7.5

App Routerのtransport-specificルート変種(segment prefetch)を経由した認可バイパス。本来middleware matcherで保護されているはずのパスが、内部プリフェッチ用の派生ルートではマッチャー対象外になっており、認証なしで保護コンテンツが取得できる。

5月6日に出た初回修正(15.5.16 / 16.2.5)はTurbopackミドルウェアでは効かなかったことが翌日判明し、5月7日に GHSA-26hh-7cqf-hhc6 として 15.5.18 / 16.2.6 で追加修正された。Turbopackユーザーは特に両方のパッチが当たっているかを確認する必要がある。

CVE-2026-44579(GHSA-mg66-mrh9-m8jx)— Cache Components DoS / CVSS 7.5

Partial Prerendering + Cache Components を使うアプリで、細工したサーバーアクションへのPOSTがデッドロックを引き起こしコネクションを保持、サーバーリソースを枯渇させる。修正は Next-Resume ヘッダーを内部ヘッダー扱いにして外部リクエストから受け付けないようにすること。暫定緩和としてエッジで Next-Resume ヘッダーを含む受信リクエストをブロックするのが推奨されている。

ミドルウェアバイパスの実害(CVE-2026-44574 / 44575 共通)

  • ・認証・課金・地域制限を middleware.ts で実装しているSaaSはログイン無しで保護コンテンツが取れる可能性。
  • ・ABテスト・地域別配信を i18n で切り分けているサイトは意図しないバリアントが返される
  • ・「ミドルウェアで通したから安全」と仮定したログ・監査・レート制限が全てバイパスされる

攻撃シナリオを図で整理:5分でわかる影響範囲

WAFで防げるのは左半分(既存DoS CVE)だけ、右半分(ミドルウェアバイパス・SSRF・新規DoS)はアプリ層に直接到達する——というのが下図の要点だ。10件をすべて頭に入れるのは大変なので、まず攻撃者がどこから侵入し、何を狙うのかを1枚にまとめる。

flowchart TD A[攻撃者] -->|細工したリクエスト| B[CDN/WAF層] B -->|Cloudflare Managed Rule
2694f1.../aaede8...| C{既存DoS CVEに該当?} C -->|Yes| D[Block] C -->|No / 新規ベクター| E[Next.jsアプリ層] E --> F[ミドルウェア層] F -->|CVE-2026-44574
CVE-2026-44575
GHSA-26hh-7cqf-hhc6| G[認証/認可バイパス] E --> H[Cache Components] H -->|CVE-2026-44579| I[コネクション枯渇 DoS] E --> J[Image Optimization API] J -->|CVE-2026-44577| K[OOM / DoS] E --> L[WebSocket] L -->|CVE-2026-44578| M[SSRF / 内部API流出] E --> N[RSC] N -->|CVE-2026-44576
CVE-2026-44582| O[キャッシュポイズニング] style D fill:#90EE90 style G fill:#FF6B6B style I fill:#FFA500 style K fill:#FFA500 style M fill:#FF6B6B style O fill:#FFD700

この図で重要なのは、WAFがブロックできるのは左半分(既存DoS CVE)だけで、ミドルウェアバイパス・SSRF・新規DoSベクターはそのままアプリ層に到達する点だ。「Cloudflareの後ろにいるから大丈夫」という想定は成立しにくく、依然としてアプリ本体の更新が最初の防御線になる。

影響を受けるバージョンと修正版:パッチコマンド

修正版は Next.js 15.5.18 / 16.2.6(5月7日の不完全修正フォローアップ反映後)。

パッケージ 影響範囲(最も広いもの) 最終修正版
next (15系) 旧バージョン全般 15.5.18
next (16系) 16.0.0以降 旧バージョン 16.2.6
react-server-dom-webpack / -parcel / -turbopack 19系の旧バージョン 19.0.6 / 19.1.7 / 19.2.6
Vinext (Cloudflare) 影響なし(要 React 19.2.6+)
OpenNext on Cloudflare 攻撃ベクトル向けハードニング適用済み

更新コマンドの例:

# Next.js 16系(推奨)
pnpm up next@^16.2.6 react-server-dom-webpack@^19.2.6

# Next.js 15.5系(LTS的に残しているチーム向け)
pnpm up next@^15.5.18

# Vinext / Vite系
pnpm up @cloudflare/vinext react@^19.2.6 react-dom@^19.2.6

# 確認
pnpm why next | grep -E "next@1[56]"
pnpm why react-server-dom-webpack

pnpm why(npm/yarnなら npm ls / yarn why)で間接依存も含めて旧バージョンが残っていないかを必ず確認する。@vercel/og や独自プラグインが古いバージョンをロックしているケースが過去CVEの調査でも頻発した。

よくある"取りこぼし"パターン

  • ・monorepoで apps/ 直下だけ更新し、packages/ 配下のNext.jsが取り残される。
  • ・Docker imageの node_modules をキャッシュしていて、package.json だけ書き換えても旧版が残る。
  • pnpm-lock.yaml のコンフリクトを片方だけ解決して、別パッケージが古いReactを引っ張る。
  • ・CI上で npm ci --only=production していて、devDepだけ更新されたつもりになる。
  • Turbopackユーザー: 15.5.16/16.2.5で止まると GHSA-26hh-7cqf-hhc6 の不完全修正フォローアップが当たらない。

深掘り:CVE-2026-44581(CSP2XSS)はなぜCSPヘッダー経由でXSSになるのか

「CSPヘッダーがXSSの入口になる」というメカニズム自体が直感に反するため、CVSS 4.7(Moderate)の数値以上に注意が必要——というのが CVE-2026-44581(GHSA-ffhc-5mcf-pf4q)の特徴だ。

10件のうち単独で技術解説に値するのが本CVE。CVSSは数値上は控えめだが、攻撃メカニズムが「セキュリティヘッダーが攻撃ベクトルになる」という構造を持つ。

AISafe Labsが命名した CSP2XSS(Content-Security-Policy 2 XSS) として技術詳細が公開されているため、本節では同社の分析をベースにコードパス・攻撃シナリオ・緩和策を整理する。

脆弱なコードパス:nonce抽出時のエスケープ漏れ

App Routerはリクエストの Content-Security-Policy ヘッダーに含まれる nonce-… 値を内部関数 getScriptNonceFromHeader で抽出し、レスポンスのHTML内に注入する。問題はその検証ロジックだ。

  • 関数内の ESCAPE_REGEX& < > といったHTML特殊文字を弾くが、ダブルクォート " を拒否しない
  • 抽出したnonce値は2つのシンクに到達する:
    • アイコン再挿入スクリプト: <script nonce="…"> の属性値に直接補間される(追加のエスケープなし)。
    • RSCフライトデータ: JSON.stringify\" にエスケープされるが、HTMLパーサーは属性値内の生の "属性閉じと解釈する。

JSON文字列としては正規でも、HTMLコンテキストでは属性値をはみ出すという、古典的な「コンテキスト混同(context confusion)」のパターンだ。

攻撃ペイロード:nonce値に " を含めて属性を脱出する

攻撃者は次のようなnonce値をCSPヘッダーに乗せて送る:

Content-Security-Policy: script-src 'nonce-x"src=data:text/javascript,alert(document.domain)//'

サーバーがこのnonce値を抽出してアイコン再挿入スクリプトに埋め込むと、レスポンスHTMLは概ねこうなる:

<script nonce="x" src=data:text/javascript,alert(document.domain)//"></script>

ブラウザは nonce="x" で属性が閉じたと解釈し、続く src=data:text/javascript,… をスクリプトの読み込み先として処理する。結果、攻撃者の制御するJavaScriptがページのオリジン上で実行される。

攻撃が成立する条件

  • ・App Routerを採用している(Pages Routerは影響なし)。
  • ・Next.jsが 15.5.16 未満 / 16.2.5 未満。
  • ・リバースプロキシ・WAFがリクエストヘッダーの Content-Security-Policy をストリップしていない。
  • ・サーバー側でnonceを利用するスクリプトがレンダリング経路を通る。

反射型から保存型XSSへ:ISRがキャッシュ汚染を引き起こす

単発のリクエストだけなら反射型XSS相当で被害は限定的だが、本脆弱性は Incremental Static Regeneration(ISR)と組み合わさると保存型XSSに化ける。条件は次の3点:

キャッシュ汚染が成立する3条件

  • ・対象ページが export const revalidate = N 等で ISR有効になっている。
  • ・初回リクエストで生成されたHTMLが .next/cache またはCDNに保存される。
  • ・CDN・リバースプロキシのキャッシュキーに Content-Security-Policy ヘッダーが含まれない(多くのCDNがデフォルト設定)。

3条件が揃うと、攻撃者が一度悪意あるCSPヘッダーで再生成タイミングを掴むだけで、以降のすべての訪問者にポイズニングされたHTMLが配信される。Cloudflareの Cache-Key カスタム設定や、Vercel CDNのデフォルトキー(URL + Vary 指定ヘッダー)を確認しないと、影響範囲を見落としやすい。

Pages Routerはなぜ影響を受けないのか

Pages Router 系(pages/ ディレクトリ)はReact JSX経由で属性値をレンダリングするため、" が自動で &quot; にエスケープされる。CSP由来のnonce値がJSXを通る限り、属性脱出は起きない。一方App RouterはRSC配送やスクリプト再注入で文字列補間をJSXより低レイヤで行う箇所があり、そこでエスケープがすり抜けた、というのがAISafe Labsの結論だ。

緩和策:受信CSPヘッダーをミドルウェアで剥がす

最終対策は Next.js 15.5.18 / 16.2.6 へのアップグレードだが、即時にバージョンを上げられない場合は、ミドルウェアでリクエスト側のCSPヘッダーを物理的に削除することで攻撃ベクトルを塞げる:

// middleware.ts
import { NextResponse } from 'next/server'
import type { NextRequest } from 'next/server'

export function middleware(request: NextRequest) {
  const requestHeaders = new Headers(request.headers)
  requestHeaders.delete('content-security-policy')
  requestHeaders.delete('content-security-policy-report-only')
  return NextResponse.next({
    request: { headers: requestHeaders },
  })
}

export const config = {
  matcher: '/:path*',
}

Cloudflare Workers / Vercel Edge Middleware いずれでも動作する。通常のクライアントは CSP をリクエストヘッダーで送ってこないため、削除しても正規動作には影響しない(CSPは本来サーバーがレスポンスで返すヘッダー)。WAFレイヤで同等の処理ができる場合は、そちらで弾くのも有効。

検証用PoC(参考)

挙動を再現する最小コードはPythonの requests で次のように書ける:

import requests

target = "https://your-app.example.com/"
malicious_nonce = 'x"src=data:text/javascript,alert(document.domain)//'

resp = requests.get(target, headers={
    "Content-Security-Policy": f"script-src 'nonce-{malicious_nonce}'"
})

# レスポンスHTML中にdata:URI由来のスクリプトソースが現れていれば脆弱
if 'data:text/javascript' in resp.text:
    print("VULNERABLE")

自社アプリの再現確認に利用できる。本番環境や第三者サイトには絶対に向けないこと(無許可のセキュリティテストは法的問題になる)。

CSP2XSSから得られる教訓

  • セキュリティヘッダー自体が攻撃ベクトルになる構造はCSPに限らない(HSTS・Referrer-Policyでも将来同種の脆弱性が出る可能性)。
  • ・ISR・SSGキャッシュは「反射型XSSを保存型に格上げする増幅装置」になる。
  • ・属性値の補間は JSON.stringify では足りない。HTMLコンテキスト用のエスケープが別途必要

Cloudflare Managed WAFの動き:旧ルールが新CVEを”ついでに”防いだ

Cloudflareの公式発表で興味深いのは、過去CVE向けに導入したWAFルール2本が、今回の新CVEもブロックすると判明した点だ。具体的には:

  • Rule ID 2694f1610c0b471393b21aef102ec699:CVE-2025-55184(DoS+ソース漏洩)向けに2025年12月から展開。
  • Rule ID aaede80b4d414dc89c443cea61680354:CVE-2026-23864(メモリ枯渇DoS / CVSS 7.5)向けに2026年1月から展開。

これらはManaged Rulesetがデフォルト有効ならFree含む全顧客でBlock動作で稼働している。今回のDoS系CVE(CVE-2026-44579、CVE-2026-44577)に対しては追加設定なしでカバーされる

ただしCloudflareは同時に重要な但し書きを添えている:

残り高深刻度3件(ミドルウェアバイパス・SSRF系)についてはWAFルールで安全に緩和できるか調査中。誤爆で正規アプリ機能を壊さないかを慎重に評価している段階。

つまりWAFだけでは10件中の3件をカバーできない。さらに、ミドルウェアバイパス(CVE-2026-44574 / 44575)やSSRF(CVE-2026-44578)はリクエスト形状が正規利用と非常に近いため、WAFで弾く=”正規ユーザーも弾く” リスクが大きい。アプリ側パッチが本筋という主張はここから来ている。

Cloudflareユーザーの最短アクションパス

  1. ・Managed Rulesetが有効か確認(Security → WAF → Managed Rulesets)。
  2. ・ルール 2694f16...aaede80... がBlockで動作しているか確認。
  3. ・Pro以上ならManaged Rulesの新規ルール展開通知をWatch。
  4. ・Custom Ruleで Next-Resume ヘッダー受信を遮断(CVE-2026-44579の暫定緩和)。
  5. ・並行してアプリ側パッチを当てる(WAFを完了とみなさない)。
  6. ・ログで _rsc / Next-Action / Next-Router-State-Tree 関連の異常リクエストを観測。

Vinext と OpenNext on Cloudflare:なぜVinextは無傷だったのか

Vinextは10件すべて影響なし、OpenNext on Cloudflareは部分的に影響ありで追加ハードニングを適用済み——というのがCloudflare自身の評価だ。

Cloudflareは社内で Vinext(Vite上にNext.js APIを再実装したアダプタ)と OpenNext on Cloudflare(OSSコミュニティ製Next.jsアダプタ)を提供しており、それぞれの状況を以下のように整理した。

アダプタ 今回のCVE影響 理由
Vinext 影響なし アーキテクチャがNext.js本体と異なり、脆弱なコードパスを共有していない
OpenNext on Cloudflare 部分的に影響あり、追加ハードニング適用済み Next.js本体のコードを使用するため、ユーザー側のNext.js更新が前提

Vinextの「無傷」は設計上の偶然ではない。同プロジェクトはエッジ環境(Cloudflare Workers / Pages Functions)に最適化するため、ミドルウェア処理・RSC配送・キャッシュ層をゼロから書き直しており、結果としてVercelホスティング前提のNext.js本体に蓄積された境界条件バグを引き継いでいない構造になっている。

ただしVinextは「Next.jsの大半の機能を再現する代替実装」であり、完全な互換ではないpages/ ディレクトリAPI・一部のmiddleware機能・特定のサードパーティプラグインで挙動差があるため、本番アプリを丸ごと移行するのは現実的でない場合が多い。今回のCVE回避目的で乗り換えるよりも、本体パッチ適用が現実的だ。

OpenNextは構造上Next.js本体のコードを利用するため、追加ハードニングとしてCloudflareチームが攻撃ベクトル向けの追加チェックをアダプタ層で挟んだが、これはユーザー側のNext.jsアップグレードを置き換えるものではない点に注意。

編集後記:Cloudflareの対応速度に見る”第二の責任者”ポジション

今回の一件で個人的に印象に残ったのは、Cloudflareの対応の速さと網羅性だ。

脆弱性公開と同日(2026年5月6日)にChangelogが出て、しかも過去CVE(CVE-2025-55184・CVE-2026-23864)向けに展開済みのWAFルール2本が、新CVEもついでにブロックすることを検証済みで発表できる、というのは「先回り」というより過去の対応が再利用可能な資産になっていることの証明と言える。

WAFルールは一度作って終わりではなく、後続CVEへのカバレッジを継続検証していることが裏で動いていなければ、こうは出せない。

加えて Vinext が無傷だったのも偶然ではなく、Vercelホスティング前提の境界条件バグを引き継がない設計になっていたことの結果だ。

「自社実装をフレームワークと並行で持ち、エコシステムの脆弱性公開時に独立して影響範囲を即時表明できる」 というのは、現状ではCloudflareくらいしかやれていない芸当だ。OpenNextへのハードニングまで同時にコミットしているあたりも含めると、CDN事業者というよりNext.jsエコシステムの第二の責任者ポジションを取りにいっている、と読むのが自然だ。

この動きが意味すること

  • ・インフラ事業者の役割が「攻撃を弾く」から「フレームワーク本体と並走して影響範囲を共同で限定する」に拡張しつつある。
  • ・同じことが将来 RSC以外(DBクライアント・認証ライブラリ・ML推論ランタイム)でも起きると、CDNの差別化ポイントは"上流のセキュリティ運用にどこまで踏み込むか"になる。
  • ・今のところVercel・Cloudflare・Netlify でこのレベルの透明性ある即時開示ができているのはCloudflareが頭ひとつ抜けている印象。

ベンダー選定の評価軸として「インシデント時の透明性と対応速度」を改めて入れる価値がある、というのが今回の率直な感想だ。

自社アプリのチェックリスト:3段階の対応フロー

やるべきことは「初動10分でバージョン確認」「当日〜数日でパッチ適用」「翌週で設計レビュー」の3段構え——以上が結論で、以下は時間配分の目安と各フェーズの具体タスクを並べたチェックリストだ。

Phase 1: 初動(10分)

  1. pnpm why next で利用中のバージョン確認。
  2. ・WAF(Cloudflare/Akamai/Fastly)のManaged Rulesがデフォルト有効か確認。
  3. ・直近24時間の _rsc / Server Action / WebSocketアップグレード関連リクエストの異常スパイクをログ確認。
  4. ・通常のリリースサイクルに沿ってパッチ適用タスクを追加。

Phase 2: パッチ適用(当日〜数日)

  1. package.json を編集(next@^16.2.6 または next@^15.5.18react-server-dom-*@^19.2.6)。
  2. ・ステージングでビルド・E2Eテスト。
  3. ・プロダクションへロールアウト(カナリアがあればカナリアから)。
  4. ・直接依存だけでなく pnpm.overrides / npm overrides / resolutions強制バージョン固定

Phase 3: 翌週(追跡)

  1. ・ミドルウェアの認可ロジックを再レビュー(CVE-2026-44574 / 44575 の教訓)。
  2. ・WebSocketアップグレード許可URLの最小化(CVE-2026-44578 SSRFの教訓)。
  3. ・Image Optimization APIへの認証 or レート制限追加(CVE-2026-44577の教訓)。
  4. ・CI/CDに npm audit --audit-level=high の自動実行を追加。

overrides は特に重要で、間接依存で古い next が引きずられるケースを潰せる。package.json の例:

{
  "pnpm": {
    "overrides": {
      "next": "^16.2.6",
      "react-server-dom-webpack": "^19.2.6",
      "react-server-dom-parcel": "^19.2.6",
      "react-server-dom-turbopack": "^19.2.6"
    }
  }
}

過去CVEとの連続性:RSCは”枯れる”までもう少しかかる

2025年12月のCVE-2025-55182(RCE)、2026年1月のCVE-2025-55184(DoS+ソース漏洩)、CVE-2026-23864(メモリ枯渇)、そして今回の10件と、RSC関連CVEは半年で20件超に達する。これは脆弱性が”特に多い”のではなく、新しい仕組みが普及期に入って研究者・攻撃者の目に晒されている結果と読める。

歴史的には、Spring・Struts・Rails・Express といった主要フレームワークは普及してから2〜3年で一通りの境界条件CVEが出尽くし、その後は安定する。RSCの本格普及は2024年後半なので、2026年〜2027年前半は新規アドバイザリの公開ペースが続くと見ておくのが妥当だ。

運用上の前提を変えるべきタイミング

  • ・「Reactは安全」「Vercel管理だから大丈夫」という暗黙の前提はもう成り立たない
  • ・月次のNext.js / Reactパッチ適用を当然の運用工数として組み込む。
  • ・セキュリティアドバイザリの自動通知(Renovate / Dependabot / GitHub Security alerts)を必須化。
  • ・ペネトレーションテストではRSCエンドポイント・Server Actions・middleware・WebSocketを新たな標的領域として追加。
  • 不完全修正フォローアップ(GHSA-26hh-7cqf-hhc6のようなパターン)に備えて、初回パッチ適用後1週間は追加アドバイザリの監視を継続

まとめ:WAFは時間稼ぎ、本筋はパッチ適用

この記事のポイント

  • ・Vercelが2026年5月6日に 9件のCVE(CVE-2026-44574〜44582) を、翌7日に 不完全修正フォローアップ(GHSA-26hh-7cqf-hhc6) を公開。
  • ・最大は CVE-2026-44578(WebSocket SSRF, CVSS 8.6 / High)、続いて CVE-2026-44574(動的ルート注入, 8.1 / High)Critical級は含まれない
  • 最終修正版は Next.js 15.5.18 / 16.2.6(5月6日の15.5.16 / 16.2.5 では Turbopackミドルウェアの不完全修正が残る)。
  • Cloudflare Managed WAF は過去CVE向けルール2本が新CVEのDoS系をついでにブロック
  • ・残り高深刻度3件(SSRF・ミドルウェアバイパス)はWAFカバー調査中。WAFを完了とみなさず必ずアプリパッチ
  • Vinext は影響なし(アーキテクチャ差)、OpenNext on Cloudflare は追加ハードニング済み。
  • ・monorepo・Dockerキャッシュ・間接依存に旧バージョンが残りやすい。overrides で固定推奨。

今回のリリースの教訓は単純で、「CDN/WAFは攻撃を遅らせる装置であって、止める装置ではない」 という古典的原則がRSC時代にもそのまま通用するということだ。Cloudflareの先回り対応は実用的だが、それでも10件中3件はカバー外で、残りもアプリ更新が前提にある。最大CVSSは8.6でCritical級ではないものの、Next.js 16.2.6 / 15.5.18 への計画的なアップグレードを通常のリリースサイクルで進めるのが望ましい。

参照ソース

一次ソース:GitHub Security Advisory(Vercel公式)

二次ソース:解説・WAF対応