Contexte
Le 21 mars 2025, l'équipe Next.js a divulgué une vulnérabilité critique affectant le système de middleware du framework. La faille permet à un attaquant distant de contourner toute logique d'authentification ou d'autorisation implémentée dans les fichiers middleware.ts / middleware.js en forgeant un header HTTP interne utilisé par Next.js pour son routage.
La vulnérabilité est particulièrement sévère car de nombreuses applications Next.js utilisent exclusivement le middleware pour protéger leurs routes — sans couche d'autorisation additionnelle côté serveur ou dans les API routes.
Elle est inscrite sur la liste des vulnérabilités activement exploitées de la CISA (Known Exploited Vulnerabilities).
Versions affectées
- Next.js 12.x < 12.3.5
- Next.js 13.x < 13.5.9
- Next.js 14.x < 14.2.25
- Next.js 15.x < 15.2.3
Mécanisme d'exploitation
Next.js utilise en interne le header x-middleware-subrequest pour distinguer les requêtes traitées par le middleware des sous-requêtes internes, afin d'éviter les boucles infinies.
La faille : ce header n'est pas filtré côté serveur sur les requêtes entrantes. Un attaquant peut l'injecter dans sa requête HTTP pour faire croire à Next.js que la requête provient déjà d'un traitement middleware interne, causant le bypass complet du middleware.
GET /admin/dashboard HTTP/1.1
Host: example.com
x-middleware-subrequest: middleware
Cette unique ligne suffit à contourner n'importe quel middleware.ts qui protège /admin.
Impact
Toute logique de protection implémentée dans le middleware est contournable :
- Authentification — accès à des routes réservées aux utilisateurs connectés
- Autorisation par rôle — accès à des sections admin ou premium
- Vérification de tokens JWT / sessions — bypass complet
- Géo-restriction ou IP allowlist — contournement
- Redirections de maintenance — accès au site en mode maintenance
L'impact dépend de la criticité des routes protégées : tableau de bord admin, API privées, données utilisateurs, etc.
Détection
Vérifiez si votre version est vulnérable :
# Vérifier la version Next.js installée
cat package.json | grep '"next"'
# ou
npx next --version
Recherchez des accès suspects dans vos logs :
# Nginx — requêtes avec le header x-middleware-subrequest
grep -i "x-middleware-subrequest" /var/log/nginx/access.log
# Rechercher des accès anormaux à des routes protégées
# (IPs sans session valide accédant à /admin, /api/admin, etc.)
grep "/admin" /var/log/nginx/access.log | grep -v "302\|301"
Remédiation
-
Mettez à jour Next.js vers une version corrigée :
- 12.x → 12.3.5
- 13.x → 13.5.9
- 14.x → 14.2.25
- 15.x → 15.2.3
npm install next@latest # ou version spécifique npm install next@14.2.25 -
Ne reposez pas exclusivement sur le middleware pour l'autorisation — ajoutez une vérification de session/token dans chaque route API et Server Component sensible :
// Dans une API route ou Server Component import { getServerSession } from "next-auth/next"; const session = await getServerSession(authOptions); if (!session) { return new Response("Unauthorized", { status: 401 }); } -
Bloquez le header au niveau du reverse proxy si la mise à jour est impossible immédiatement (mesure palliative) :
# Nginx — supprimer le header avant de passer à Next.js proxy_set_header x-middleware-subrequest "";# Apache RequestHeader unset x-middleware-subrequest
Recommandations
- Principe de défense en profondeur — le middleware est un premier filtre, pas l'unique rempart : vérifiez toujours les autorisations au plus près des données
- Mettez à jour Next.js régulièrement — abonnez-vous aux alertes de sécurité du dépôt GitHub (
vercel/next.js) - Revue des routes protégées — auditez quelles routes sont protégées uniquement par middleware et ajoutez une couche d'autorisation serveur sur les plus critiques
- Tests d'intrusion sur le middleware — intégrez des tests vérifiant que les routes protégées retournent bien 401/403 en l'absence de credentials valides