Die CVE-2025-29927-Sicherheitslücke zur Umgehung der Autorisierung in Next.js: Alles, was Sie darüber wissen müssen

CVE-2025-29927 – CVE-2025-29927 -

Am 21. März 2025 gaben die Maintainer von Next.js eine neue Sicherheitslücke bekannt, die eine Umgehung der Autorisierung ermöglicht – CVE-2025-29927. Diese Sicherheitslücke kann leicht ausgenutzt werden, um die Autorisierung zu umgehen. In einigen Fällen kann die Ausnutzung der Sicherheitslücke auch zu Cache Poisoning und einem Denial-of-Service führen.

Welche Versionen von Next.js sind betroffen?

Next.js 15.x – von Version 15.0.0 bis einschließlich 15.2.2.

Next.js 14.x – von Version 14.0.0 bis einschließlich 14.2.24.

Frühere Next.js-Versionen – ab Version 11.1.4 bis einschließlich 13.5.6.

Angriffsszenarien für CVE-2025-29927

Damit die Schwachstelle überhaupt ausgenutzt werden kann, muss der betroffene Next.js-Server eine Next.js-Middleware verwenden. Dies umfasst das Einbinden einer Datei middleware.js oder middleware.ts ( _middleware.js oder _middleware.ts  für ältere Versionen von Next.js). Diese Datei definiert und exportiert die Funktion middleware, die die Logik enthält, die bei jeder eingehenden HTTP-Anfrage ausgeführt wird.

Umgehung der Autorisierung

Dies ist das wahrscheinlichste Szenario, das CVE-2025-29927 ausnutzt.

Dieses Szenario ist relevant, wenn der Next.js-Server des Opfers die Middleware-Funktion zur Durchführung der Autorisierung verwendet (und die zugrunde liegende Anwendung keine anderen Autorisierungsebenen verwendet).

Szenario in Bezug auf die Autorisierungs-Middleware ohne Ausnutzung von CVE-2025-29927

Autorisierungs-Middleware-Szenario ohne Ausnutzung von CVE-2025-29927

Denial of Service durch Cache Poisoning

Next.js-Middleware kann auch bei der Lokalisierung von Websites helfen. Beispielsweise kann die Middleware Nutzer basierend auf ihrem Standort automatisch weiterleiten, indem sie etwa /en für englischsprachige oder /fr für französische Besucher hinzufügt. Wenn jemand CVE-2025-29927 ausnutzt und die Middleware umgeht, die diese Weiterleitungen durchführt, landen sie, statt auf einer lokalisierten Seite, auf der Website-Root (/), für die die Entwickler nie eine Seite erstellt haben. Wozu führt das? Einem 404-Fehler oder einem 500-Serverfehler, je nach Konfiguration.

Wenn die Website ein CDN oder eine andere Caching-Schicht verwendet, können diese Fehlerantworten gespeichert und zukünftigen Besuchern bereitgestellt werden. Sobald sie zwischengespeichert sind, sehen legitime Nutzer möglicherweise weltweit fehlerhafte Seiten. Dadurch entsteht ein selbst verursachter Ausfall, der die Verfügbarkeit beeinträchtigt, ohne eine einzige Zeile Code zu ändern.

Redirector-Middleware-Szenario ohne Ausnutzung von CVE-2025-29927

 

Redirector-Middleware-Szenario mit Ausnutzung von CVE-2025-29927

 

Next.js-Middleware verstehen

Next.js-Middleware ist eine leistungsstarke Funktion, die in Next.js v12 eingeführt wurde und Entwicklern ermöglicht, Code auszuführen, bevor eine Anfrage abgeschlossen wird. Middleware wird am Edge ausgeführt, näher am Nutzer als herkömmlicher serverseitiger Code, und kann Response-Header ändern, Anfragen umschreiben oder umleiten und – was am wichtigsten ist – Authentifizierungs- und Autorisierungsprüfungen implementieren.

Middleware in Next.js wird vor dem Rendering ausgeführt und kann über Matcher-Konfigurationen für die Ausführung auf bestimmten Pfaden konfiguriert werden.

Einige Anwendungsbeispiele für Next.js-Middleware sind:

  • Überprüfung von Authentifizierungs-Tokens
  • Implementierung einer rollenbasierten Zugriffskontrolle
  • Weiterleitung nicht authentifizierter Benutzer

Eine typische Next.js-Middleware-Implementierung, die eine Authentifizierung durchführt, könnte wie folgt aussehen:

 

 import { NextResponse } from 'next/server'
 import type { NextRequest } from 'next/server'

 export function middleware(request: NextRequest) {
   // Token des Benutzers aus den Cookies abrufen
   const token = request.cookies.get('token').value
  
   // Prüfen, ob der Benutzer authentifiziert ist
   const isAuthenticated = validateToken(token)
  
   // Wenn nicht authentifiziert, zur Anmeldung weiterleiten
   if (!isAuthenticated) {
     return NextResponse.redirect(new URL('/login', request.url))
   }
  
   // Bei erfolgreicher Authentifizierung mit der geschützten Route fortfahren
   return NextResponse.next()
 }

 // Konfigurieren, welche Routen diese Middleware verwenden
 export const config = {
   matcher: ['/dashboard/:path*', '/settings/:path*'],
 }
 

Technische Analyse von CVE-2025-29927

CVE-2025-29927 deckt einen kritischen Fehler bei der Verarbeitung bestimmter Anfragetypen durch die Next.js-Middleware auf, der zu einer möglichen Umgehung von Authentifizierung und Autorisierung führt.

Diese Schwachstelle betrifft Anwendungen, die in bestimmten Konfigurationen Middleware zur Zugriffskontrolle verwenden.

Die Schwachstelle beruht auf der inkonsistenten Verarbeitung der benutzerdefinierten x-middleware-subrequest-Header durch Next.js. Wenn dieser Header in Anfragen an geschützte Routen enthalten ist, erlaubt Next.js der Anfrage fälschlicherweise, die Ausführung der Middleware vollständig zu umgehen. Der Header veranlasst die Next.js-Laufzeitumgebung, die Phase der Middleware-Auswertung zu überspringen, während der zugrundeliegende Route-Handler weiterhin verarbeitet wird.

Um diese Schwachstelle auszunutzen, muss ein Angreifer beim Zugriff auf geschützte Ressourcen lediglich den Header x-middleware-subrequest zu seinen HTTP-Anfragen hinzufügen. Beispielsweise wird eine Anfrage an /api/admin/users, die normalerweise durch Autorisierungsprüfungen der Middleware blockiert würde, bei Vorhandensein dieses Headers normal verarbeitet. Der Server verarbeitet die Anfrage, als wäre die Middleware bereits ausgeführt worden und hätte sie genehmigt, wodurch eine vollständige Umgehung der Sicherheitsmechanismen entsteht. Diese Header-Manipulation lässt sich einfach mit Browser-Entwicklertools, curl-Befehlen oder einfachen Skripten umsetzen.

Der anfällige Code in der neuesten anfälligen Version (v15.2.2) lautet wie folgt:


 export const run = withTaggedErrors(async function runWithTaggedErrors(params) {
 const runtime = await getRuntimeContext(params)
 const subreq = params.request.headers[`x-middleware-subrequest`]        [1]
 const subrequests = typeof subreq === 'string' ? subreq.split(':') : [] [2]

 const MAX_RECURSION_DEPTH = 5
 const depth = subrequests.reduce(                                       [3]
  (acc, curr) => (curr === params.name ? acc + 1 : acc),
  0
 )

 if (depth >= MAX_RECURSION_DEPTH) {                                     [4]
  return {
     waitUntil: Promise.resolve(),
     response: new runtime.context.Response(null, {
       headers: {
         'x-middleware-next': '1',
       },
     }),
   }
 }
 

Der Header x-middleware-subrequest wird in [1] aus der Anfrage übernommen.
Anschließend wird er mithilfe des Trennzeichens : in [2] aufgeteilt und durch eine Reduce-Funktion geführt, die zählt, wie viele Elemente in diesem Array (subrequests) in [3] mit dem Dateinamen der Middleware übereinstimmen.
Wenn diese Zahl in [4] gleich oder größer als MAX_RECURSION_DEPTH (also 5) ist, umgeht sie die Funktionalität der Middleware und leitet sie an ihre Route weiter.

Mögliche Werte für Attack-Header

Wie bereits erläutert, lautet der Name des anfälligen Headers  x-middleware-subrequest. Der ihm zugewiesene Wert hängt von Next.js ab, da er entsprechend dem Wert von middlewareInfo.name festgelegt wird, der im Wesentlichen dem Pfad zur Datei middleware.js oder middleware.ts entspricht.

Vor Version 12.2 hieß die Middleware-Datei tatsächlich _middleware.js/_middleware.ts und konnte sich auf jeder Ebene des Unterverzeichnisses befinden, auf das man zugreifen möchte. In diesem Fall versuchen wir, auf /admin/dashboard zuzugreifen, was bedeutet, dass middlewareInfo.name pages/_middleware oder pages/admin/_middleware hätte sein können. Hätten wir dashboard als Verzeichnis mit einer index.js-Datei festgelegt,hätte es auch pages/admin/dashboard/_middleware sein können.

Wenn wir beispielsweise mit unserem PoC-Code eine Next.js-Version vor 12.2 verwendet hätten, hätten wir middleware.js in das Verzeichnis pages verschieben und in _middleware.js umbenennen müssen, und unsere „bösartige“ HTTP-Anfrage würde lauten:


 GET /admin/dashboard HTTP/1.1
 x-middleware-subrequest: pages/_middleware
 

Seit Version 12.2 und bis Version 13 muss die Middleware-Datei im Stammverzeichnis des Projekts vorhanden sein und muss middleware.js/middleware.ts heißen. Um diese Versionen von Next.js anzugreifen, würde die Payload für den Header also einfach middleware lauten – und wir wissen mit Sicherheit, dass sie sich im Stammverzeichnis befindet.

Hätten wir eine Next.js-Version zwischen den Versionen 12.2 und 13 verwendet, würde sich unsere „bösartige“ Anfrage wie folgt ändern:


 GET /admin/dashboard HTTP/1.1
 x-middleware-subrequest: middleware
 

Ab Version 13 von Next.js wurde die zuvor beschriebene Rekursionsprüfung implementiert – das bedeutet, dass ein Angreifer den bösartigen Header auf middleware:middleware:middleware:middleware:middleware setzen müsste, um 5 Rekursionsebenen zu simulieren.

Da unser PoC auf dieser Version läuft, ist dies ein Ausschnitt aus der von uns verwendeten Anfrage:


 GET /admin/dashboard HTTP/1.1
 x-middleware-subrequest: middleware:middleware:middleware:middleware:middleware
 

Wichtig ist, dass sich der Middleware-Code in allen Phasen in einem src -Verzeichnis hätte befinden können – was bedeuten würde, dass zum Ausnutzen src den oben dargestellten Werten vorangestellt werden müsste. Wenn wir unseren PoC-Code beispielsweise in einem src -Verzeichnis abgelegt hätten, hätte unsere Payload wie folgt aussehen müssen:


 GET /admin/dashboard HTTP/1.1
 x-middleware-subrequest: src/middleware:src/middleware:src/middleware:src/middleware:src/middleware.
 

Ausnutzung von CVE-2025-29927

Wie immer ist es am besten, die vollständige Ausnutzung der Schwachstelle zu sehen, um zu verstehen, welche Next.js-Instanzen anfällig wären.

Wir haben eine eigene PoC-Website mit folgendem Arbeitsbaum eingerichtet:

├── middleware.js
├── package-lock.json
├── package.json
└── pages
├── admin
│   └── dashboard.js
└── index.js

Zunächst unsere Anmeldeseite:

Folgendes passiert, wenn ein Benutzer ohne Administratorrechte versucht, sich anzumelden:

Und dies ist das Admin-Dashboard unter /admin/dashboard mit den richtigen Anmeldedaten:

Kommen wir zum Exploit – versuchen wir zunächst, eine GET-Anfrage an /admin/dashboard ohne den schädlichen Header zu senden:

Wir erhalten eine „401 Unauthorized“-Antwort, da unsere Middleware aktiv wird und erkennt, dass es sich nicht um ein Admin-Konto handelt:

Versuchen wir jedoch dasselbe noch einmal mit dem Header x-middleware-subrequest

und wir erhalten eine 200-OK-Antwort!

Mithilfe der Webvorschau können wir außerdem sehen, dass wir das Dokument bereits zuvor erhalten haben:

Behebung von CVE-2025-29927

Versions-Upgrade

Der beste Weg, CVE-2025-29927 zu beheben, ist ein Upgrade Ihrer Next.js-Version auf eine der behobenen Versionen –

  • 15.2.3
  • 14.2.25

Stellen Sie sicher, dass Sie alle potenziell gefährdeten Versionen identifizieren, von 11.1.4 bis einschließlich 13.5.6, 14.2.24 sowie 15.2.2, und aktualisieren Sie diese auf die neue, korrigierte Version.

Blockieren des anfälligen Headers im Webserver

Wenn ein Upgrade keine Option ist, kann die Schwachstelle entschärft werden, indem Sie Ihren Webserver anweisen, den `x-middleware-subrequest` aus eingehenden Anfragen zu entfernen –

Fügen Sie in Apache die folgende Direktive zu Ihrer .htaccess-Datei hinzu (mod_headers muss installiert und aktiviert sein) –

 <IfModule mod_headers.c>
   RequestHeader unset x-middleware-subrequest
 </IfModule>

Bearbeiten Sie in NGINX Ihre Datei nginx.conf und fügen Sie Ihrem Serverblock die folgende proxy_set_header-Direktive hinzu –

 proxy_set_header x-middleware-subrequest "";

Beispiel:

 server {
   listen 80;
   server_name your_domain.com;
   location / {
     proxy_set_header x-middleware-subrequest "";
   }
 }

Fügen Sie in Express.js die folgende Direktive zu Ihrem JavaScript-Quellcode hinzu –

 // Middleware zum Entfernen des Headers x-middleware-subrequest
 app.use((req, res, next) => {
   delete req.headers['x-middleware-subrequest'];
   next();
 });

Blockieren des anfälligen Headers mit einer WAF

Wenn ein Upgrade keine Option ist, kann die Schwachstelle durch den Einsatz einer Web Application Firewall entschärft werden, die Anfragen blockiert, welche den HTTP-Header x-middleware-subrequest` enthalten.

Behebung von CVE-2025-29927 mit JFrog Xray und JFrog Advanced Security

Wie immer kann JFrog Security Essentials (Xray) verwendet werden, um das Vorkommen von Next.js in Ihrer gesamten Codebasis und kompilierten Artefakten zu identifizieren, einschließlich Docker-Containern, Repository-Paketen und sogar eigenständigen Binärdateien.

Zusätzlich wurde JFrog Advanced Security um einen Contextual Analysis Scanner erweitert, der automatisch überprüft, ob Ihre Next.js-Bereitstellung tatsächlich für CVE-2025-29927 anfällig ist, indem er prüft, ob eine Next.js-Middleware verwendet wird.


JFrog Plattform: JFrog Contextual Analysis für CVE-2025-29927 von Next.js (Klicken Sie auf das Bild für Vollansicht)

Informieren Sie sich im JFrog Security Research Center über die neuesten CVEs, Schwachstellen und Fehlerbehebungen.