
Preuve de concept d'exploitation pour CVE-2025-29927, une vulnérabilité de contournement du middleware Next.js. Inclut des payloads spécifiques aux versions et un laboratoire basé sur Docker pour tester l'accès non autorisé aux routes protégées.

Toutes les versions de Next.js de 11.1.4 à 13.5.6, les versions 14.x antérieures à 14.2.25 et les versions 15.x antérieures à 15.2.3 sont concernées par cette vulnérabilité. L'impact est particulièrement significatif pour les applications qui s'appuient sur le middleware pour implémenter des contrôles d'accès, car les attaquants peuvent obtenir un accès non autorisé à des ressources protégées sans authentification.
La vulnérabilité CVE-2025-29927 provient d'un défaut de conception dans la manière dont Next.js traite l'en-tête x-middleware-subrequest. Cet en-tête était initialement destiné à un usage interne au sein du framework Next.js pour empêcher les boucles infinies d'exécution du middleware.
Lorsqu'une application Next.js utilise un middleware, la fonction runMiddleware est appelée pour traiter les requêtes entrantes. Dans le cadre de ses fonctionnalités, cette fonction vérifie la présence de l'en-tête x-middleware-subrequest. Si cet en-tête existe et contient une valeur spécifique, l'exécution du middleware est complètement ignorée et la requête est transmise directement à sa destination d'origine via .
NextResponse.next()La vulnérabilité réside dans le fait que cette vérification d'en-tête peut être exploitée par des utilisateurs externes. En ajoutant l'en-tête x-middleware-subrequest avec la valeur correcte à une requête, un attaquant peut contourner complètement tous les mécanismes de protection basés sur le middleware.
Clonez le dépôt :
git clone <repository_url>
Accédez au répertoire du projet :
cd nextjs-docker-app
Construisez l'image Docker :
docker build -t nextjs-app .
Exécutez le conteneur Docker :
docker run -p 3000:3000 nextjs-app
Accédez à l'application dans votre navigateur à l'adresse http://localhost:3000.
La méthode d'exploitation varie légèrement selon la version de Next.js :
Dans ces versions, les fichiers middleware devaient être nommés _middleware.ts et placés dans le dossier pages. La valeur de middlewareInfo.name était composée du nom du répertoire et du nom du fichier :
x-middleware-subrequest: pages/_middleware
Pour les routes imbriquées, il pouvait y avoir plusieurs fichiers middleware à différents niveaux, ce qui donnait plusieurs valeurs possibles pour l'en-tête :
x-middleware-subrequest: pages/dashboard/_middleware
ou
x-middleware-subrequest: pages/dashboard/panel/_middleware
À partir de la version 12.2, Next.js a modifié les conventions du middleware. Le fichier doit être nommé middleware.ts (sans le tiret bas) et ne doit plus se trouver dans le dossier pages. Pour ces versions, la charge utile est plus simple :
x-middleware-subrequest: middleware
De plus, Next.js permet une structure de projet alternative avec un répertoire /src. Dans ce cas, la charge utile serait :
x-middleware-subrequest: src/middleware
Pour les versions 13.2.0 et supérieures, Next.js a introduit une profondeur de récursion maximale pour l'exécution du middleware. Cela a été implémenté pour empêcher les boucles infinies, mais n'affecte pas la vulnérabilité. L'exploitation reste la même, car la vérification de l'en-tête se produit avant toute vérification de profondeur de récursion.
x-middleware-subrequest: middleware:middleware:middleware:middleware:middleware
Alternativement, pour les projets utilisant une structure de répertoire /src :
x-middleware-subrequest: src/middleware:src/middleware:src/middleware:sr
=======
# cve-2025-29927
>>>>>>> 56c7b2dcd548caf771750519107bf7c57749a864