NextJSはもう終わりだ… 13件の「致命的な」脆弱性が発覚

원제 · Yeah it’s over for NextJS... 13 NEW vulnerabilities

16:033분 읽기Better Stack2026. 05. 11.컴퓨터/소프트웨어 · 경제 뉴스 · AI/미래기술

핵심 요약

Next.jsとReactで発覚した13件の脆弱性は、サーバーコンポーネントの通信プロトコルやミドルウェアのルーティング不備を突くものであり、最新バージョンへのアップデートが唯一の解決策となる。

하이라이트

  • Next.jsとReactにおいて、DoS攻撃、ミドルウェアのバイパス、SSRF、XSSを含む合計13件の脆弱性(CVE)が修正された。

  • サーバーコンポーネントのデシリアライズ処理における脆弱性は、特定のペイロード送信により演算回数を2億回まで増大させ、CPUを数秒間占有させる。

  • i18nを有効にしたPages Routerでは、ベースルート(/secretなど)がミドルウェアの保護対象から外れ、認証なしでサーバーサイドPropsを取得できる。

  • セルフホスト環境のNext.jsには、WebSocketのアップグレードリクエストを悪用して内部ネットワークのサービスに不正アクセスできるSSRF脆弱性が存在する。

  • beforeInteractive属性を持つスクリプトタグのProps処理において、HTMLエスケープの不備により任意のJavaScript実行(XSS)が可能となる。

  • キャッシュポイズニングの脆弱性は、クエリ文字列を含むリクエストがHTMLとして誤認されてキャッシュされることで、他ユーザーに不正なデータを返却させる。

타임라인

  1. ミドルウェアとプロキシのバイパス脆弱性

    多言語対応(i18n)を有効にすると、Next.jsは各言語ごとのURLを生成するが、ベースとなるURLパスがミドルウェアの監視から漏れる挙動が確認された。攻撃者はブラウザの検証ツールからビルドIDを取得し、特定のURL構造を組み立てるだけで、認証が必要なページのデータを取得できる。開発者はミドルウェアだけに依存せず、サーバーサイドのロジック自体に認証チェックを実装することが推奨される。

    • i18n設定が有効な場合、Pages Routerのミドルウェアによるルート保護が不完全になる。
    • _next/data/パスとビルドIDを組み合わせることで、本来保護されるべきserver-side propsをJSON形式で直接取得できる。
    • この脆弱性の深刻度は10点中7.5点であり、多言語設定時のベースルートのマッチング不備が根本的な原因である。
  2. React Server ComponentsにおけるDoS攻撃の詳細

    サーバーとクライアント間でデータをシリアライズするReact Flightプロトコルが攻撃の対象となった。従来のアルゴリズムでは、特定のポインタを探すためにすべてのキーを繰り返しスキャンしていたため、2億回もの比較演算が発生し、CPUリソースを枯渇させていた。最新の修正によって1回のリ通査で処理が完了するようになり、処理効率が1000倍近く改善されている。

    • React Flightプロトコルのデシリアライズ処理において、文字列比較の回数が爆発的に増加する不備が存在した。
    • 攻撃者が20万個のキーを含む悪意のあるペイロードを送信すると、サーバーのスレッドが数秒間ブロックされる。
    • 修正版ではカーソルベースの仕組みが導入され、演算回数がk*n(参照数×キー数)からn+kへ劇的に削減された。
  3. セルフホスト環境におけるSSRFの危険性

    特定のcurlリクエストを送信すると、Next.jsサーバーがリクエストターゲットを内部のローカルホスト(RedisやDBなど)と誤認し、そのままプロキシしてしまう。これにより、本来ファイアウォールで守られている内部サービスの情報が外部へ漏洩するリスクがある。修正案ではプロキシ処理の前に完了フラグとステータスコードを確認するチェック工程が追加され、不正な転送を遮断している。

    • WebSocketのアップグレードヘッダーを悪用することで、外部から隔離された内部サーバーへNext.js経由でリクエストを送信できる。
    • このSSRF脆弱性は深刻度8.6と評価されているが、Vercelホストの環境には影響しない。
    • 修正コードではresolveRoutes関数にガードを追加し、正当なプロキシリクエストであるかを厳密に判定するようになった。
  4. キャッシュポイズニングとXSSの仕組み

    キャッシュポイズニングは、システムの拡張子チェックがクエリ文字列を考慮していなかったために発生した。これにより、後続のユーザーに文字化けしたデータや誤ったコンテンツが表示される。また、XSSの事例では、検索パラメータに仕込まれたスクリプトがページ上で実行され、セッションCookieの窃取や偽のログインフォーム表示などの被害につながる恐れがある。

    • URL末尾にクエリ文字列を付加することで、サーバーコンポーネントのデータをHTMLとしてキャッシュに強制保存させることができる。
    • beforeInteractiveスクリプトタグで信頼できない入力を扱う際、エスケープ処理の不備によりスクリプトの注入が可能になる。
    • Next.js内部でJSON.stringifyを使用している箇所が、HTMLの閉じタグを適切に処理できていないことがXSSの直接の原因である。

설명

Next.js just dropped a security release fixing 13 CVEs — 6 of them high severity. In this video, we break down middleware bypasses, denial of service via the React Flight protocol, server-side request forgery, and cross-site scripting. Were server components a mistake? 🔗 Relevant Links Security Blog: https://vercel.com/changelog/next-js-may-2026-security-release ❤️ More about us Radically better observability stack: https://betterstack.com/ Written tutorials: https://betterstack.com/community/ Example projects: https://github.com/BetterStackHQ 📱 Socials Twitter: https://twitter.com/betterstackhq Instagram: https://www.instagram.com/betterstackhq/ TikTok: https://www.tiktok.com/@betterstack LinkedIn: https://www.linkedin.com/company/betterstack 📌 Chapters: 00:00 Intro 00:41 Middleware Bypass 03:50 Denial of Service 07:50 Request Forgery (Highest Severity) 10:57 Cache Poisoning 12:45 Cross-Site Scripting (XSS) 15:09 Mistake

커뮤니티 글

모든 글 보기
이 영상에 대해 글쓰기