Laboratorio basado en Docker que reproduce el contrabando de solicitudes de CVE-2026-29057 en Next.js, comparando la versión vulnerable 15.5.12 con la parcheada 15.5.13 mediante una carga útil HTTP fragmentada en bruto.
Este repositorio es un laboratorio de presentación enfocado en CVE-2026-29057. Compara un objetivo Next.js vulnerable (15.5.12) con la versión parcheada (15.5.13) usando la misma topología y carga útil HTTP en bruto.
Úsalo solo en un laboratorio aislado. Las sondas de desincronización de solicitudes pueden interrumpir conexiones compartidas en entornos reales.
Este repositorio está adaptado del repositorio original de Prueba de Concepto de Next.js de Nayaka Ghana Subrata. Todo el crédito es para el autor original por el trabajo fundacional de prueba de concepto.
Reorganicé y modifiqué ese trabajo para centrarme específicamente en CVE-2026-29057, incluyendo los materiales de presentación, la demostración guiada, el escenario de laboratorio, los comentarios explicativos y la comparación entre vulnerable y parcheado. Este repositorio es una adaptación educativa y no debe confundirse con el repositorio del autor original.
DELETE /api/workspace/tasks/1042 en formato chunked.GET /secret.Transfer-Encoding y añade Content-Length: 0, mientras los bytes del cuerpo aún se reenvían.| Objetivo | Next.js | Solicitudes al backend |
|---|---|---|
| Vulnerable | 15.5.12 | DELETE /api/workspace/tasks/1042, luego GET /secret |
| Parcheado | 15.5.13 | Solo DELETE /api/workspace/tasks/1042 |
.
├── 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
Requisitos: Docker Compose y Node.js 18 o superior.
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
Evidencia esperada del vulnerable:
[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}
Evidencia esperada del parcheado:
[after] {"backendRequests":["DELETE /api/workspace/tasks/1042"],"flag":null}
PoC result: smuggled request was not observed. This usually means the target is patched.
La evidencia significativa es diferencial: la topología y la carga útil permanecen sin cambios; solo difiere la versión de Next.js.
El laboratorio no requiere que el presentador finja que un atacante conoce mágicamente ambas rutas:
DELETE /api/workspace/tasks/1042, por lo que la ruta portadora proviene directamente del tráfico normal de la aplicación./robots.txt. Apunta al artefacto /ops/release-manifest desplegado accidentalmente./api/workspace/ como el prefijo del servicio público, filtra /secret como una ruta interna y nombra /api/state como el registro de solicitudes. No revela la flag en sí.El manifiesto es una debilidad deliberada de divulgación de información para la narrativa del laboratorio. Es independiente de CVE-2026-29057; el CVE proporciona el bypass de enmarcado de solicitudes que alcanza la ruta del backend divulgada.
Los nombres de las rutas son elementos del laboratorio, no rutas recuperadas de una víctima real. El parche oficial de Vercel añadió una prueba de regresión que define /rewrites/:path*, usa /rewrites/poc como portador y crea /secret en el backend de prueba. Este laboratorio le da al portador un nombre con forma de producto mientras preserva esa estructura de prueba.
docker-compose.yml — versiones vulnerable versus parcheada.pocs/cve-2026-29057/next.config.js — límite de reescritura externa.pocs/cve-2026-29057/support/server.js — analizadores del intermediario y del backend.scripts/run-cve-2026-29057.mjs — carga útil chunked en bruto y verificador de resultados.pocs/cve-2026-29057/app/api/ — endpoints de reinicio de evidencia y lectura.docker compose down