Lab basé sur Docker reproduisant le request smuggling de CVE-2026-29057 dans Next.js, comparant la version vulnérable 15.5.12 à la version corrigée 15.5.13 avec une charge utile HTTP chunked brute.
Ce dépôt est un laboratoire de présentation ciblé sur CVE-2026-29057. Il compare une cible Next.js vulnérable (15.5.12) avec la version corrigée (15.5.13) en utilisant la même topologie et la même charge utile HTTP brute.
Utilisez-le uniquement dans un laboratoire isolé. Les sondes de désynchronisation de requêtes peuvent perturber les connexions partagées dans des environnements réels.
Ce dépôt est adapté du dépôt original de preuve de concept Next.js de Nayaka Ghana Subrata. Le crédit complet revient à l'auteur original pour le travail de preuve de concept fondamental.
J'ai réorganisé et modifié ce travail pour me concentrer spécifiquement sur CVE-2026-29057, y compris les supports de présentation, la démonstration guidée, le scénario de laboratoire, les commentaires explicatifs et la comparaison vulnérable versus corrigé. Ce dépôt est une adaptation éducative et ne doit pas être confondu avec le dépôt de l'auteur original.
DELETE /api/workspace/tasks/1042 en mode chunked.GET /secret.Transfer-Encoding et ajoute Content-Length: 0, tandis que les octets du corps sont toujours transmis.| Cible | Next.js | Requêtes backend |
|---|---|---|
| Vulnérable | 15.5.12 | DELETE /api/workspace/tasks/1042, puis GET /secret |
| Corrigé | 15.5.13 | DELETE /api/workspace/tasks/1042 uniquement |
.
├── docker-compose.yml
├── DEMO-RUNBOOK.md
├── PRESENTATION-SCRIPT.md
├── PRESENTATION-QA.md
├── pocs/cve-2026-29057/
│ ├── app/
│ ├── support/server.js
│ ├── next.config.js
│ └── Dockerfile
└── scripts/run-cve-2026-29057.mjs
Prérequis : Docker Compose et Node.js 18 ou plus récent.
docker compose up --build cve-2026-29057-vuln cve-2026-29057-fixed
node scripts/run-cve-2026-29057.mjs http://localhost:3105
node scripts/run-cve-2026-29057.mjs http://localhost:3106
Preuve attendue pour la version vulnérable :
[after] {"backendRequests":["DELETE /api/workspace/tasks/1042","GET /secret"],"flag":"FLAG{one_stream_two_requests}"}
PoC result: vulnerable behavior reproduced.
Flag: FLAG{one_stream_two_requests}
Preuve attendue pour la version corrigée :
[after] {"backendRequests":["DELETE /api/workspace/tasks/1042"],"flag":null}
PoC result: smuggled request was not observed. This usually means the target is patched.
La preuve significative est différentielle : la topologie et la charge utile restent inchangées ; seule la version de Next.js diffère.
Le laboratoire n'exige pas que le présentateur prétende qu'un attaquant connaisse magiquement les deux chemins :
DELETE /api/workspace/tasks/1042, donc le chemin porteur provient directement du trafic applicatif normal./robots.txt. Il pointe vers l'artefact /ops/release-manifest déployé accidentellement./api/workspace/ comme préfixe de service public, divulgue /secret comme route interne, et nomme /api/state comme journal des requêtes. Il ne révèle pas le flag lui-même.Le manifeste est une faiblesse délibérée de divulgation d'informations pour le récit du laboratoire. Elle est distincte de CVE-2026-29057 ; la CVE fournit le contournement de cadrage de requête qui atteint la route backend divulguée.
Les noms de routes sont des fixtures de laboratoire, pas des chemins récupérés d'une victime réelle. Le correctif officiel de Vercel a ajouté un test de régression qui définit /rewrites/:path*, utilise /rewrites/poc comme porteur, et crée /secret sur le backend de test. Ce laboratoire donne au porteur un nom à consonance produit tout en préservant cette structure de test.
docker-compose.yml — versions vulnérable versus corrigée.pocs/cve-2026-29057/next.config.js — frontière de réécriture externe.pocs/cve-2026-29057/support/server.js — analyseurs intermédiaire et backend.scripts/run-cve-2026-29057.mjs — charge utile chunked brute et vérificateur de résultat.pocs/cve-2026-29057/app/api/ — points de terminaison de réinitialisation et de lecture des preuves.docker compose down