Лаборатория на базе Docker, воспроизводящая контрабандную передачу запросов CVE-2026-29057 в Next.js, сравнивающая уязвимую версию 15.5.12 с исправленной 15.5.13 с использованием необработанной полезной нагрузки HTTP с chunked-кодированием.
Этот репозиторий представляет собой специализированную лабораторию для презентации CVE-2026-29057. В ней сравнивается уязвимая цель Next.js (15.5.12) с исправленным релизом (15.5.13) при одинаковой топологии и одном и том же сыром HTTP-полезной нагрузке.
Используйте её только в изолированной лаборатории. Пробы на десинхронизацию запросов могут нарушить работу общих соединений в реальных средах.
Этот репозиторий адаптирован из оригинального репозитория Nayaka Ghana Subrata с Proof of Concept для Next.js. Полная заслуга принадлежит оригинальному автору за основополагающую работу над proof-of-concept.
Я реорганизовал и изменил эту работу, чтобы сосредоточиться именно на CVE-2026-29057, включая материалы презентации, управляемую демонстрацию, лабораторный сценарий, пояснительные комментарии и сравнение уязвимой и исправленной версий. Этот репозиторий является образовательной адаптацией и не должен восприниматься как репозиторий оригинального автора.
DELETE /api/workspace/tasks/1042.GET /secret.Transfer-Encoding и добавляет Content-Length: 0, при этом байты тела всё ещё пересылаются.| Цель | Next.js | Запросы к бэкенду |
|---|---|---|
| Уязвимая | 15.5.12 | DELETE /api/workspace/tasks/1042, затем GET /secret |
| Исправленная | 15.5.13 | только 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
Требования: Docker Compose и Node.js 18 или новее.
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
Ожидаемое свидетельство уязвимости:
[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}
Ожидаемое свидетельство исправления:
[after] {"backendRequests":["DELETE /api/workspace/tasks/1042"],"flag":null}
PoC result: smuggled request was not observed. This usually means the target is patched.
Значимое свидетельство является дифференциальным: топология и полезная нагрузка остаются неизменными; различается только версия Next.js.
Лаборатория не требует, чтобы докладчик делал вид, будто атакующий волшебным образом знает оба пути:
DELETE /api/workspace/tasks/1042, поэтому путь-носитель берётся непосредственно из обычного трафика приложения./robots.txt. Он указывает на случайно развёрнутый артефакт /ops/release-manifest./api/workspace/ как публичный префикс сервиса, раскрывает /secret как внутренний маршрут и называет /api/state как журнал запросов. Сам флаг он не раскрывает.Манифест представляет собой намеренную слабость раскрытия информации для сюжета лаборатории. Он отделён от CVE-2026-29057; CVE обеспечивает обход фрейминга запросов, который достигает раскрытого маршрута бэкенда.
Имена маршрутов — это лабораторные фикстуры, а не пути, восстановленные из реальной жертвы. Официальный патч Vercel добавил регрессионный тест, который определяет /rewrites/:path*, использует /rewrites/poc в качестве носителя и создаёт /secret на тестовом бэкенде. Эта лаборатория даёт носителю имя в форме продукта, сохраняя ту же структуру теста.
docker-compose.yml — уязвимая и исправленная версии.pocs/cve-2026-29057/next.config.js — граница внешнего rewrite.pocs/cve-2026-29057/support/server.js — парсеры посредника и бэкенда.scripts/run-cve-2026-29057.mjs — сырая chunked-полезная нагрузка и проверка результата.pocs/cve-2026-29057/app/api/ — эндпоинты сброса и чтения свидетельств.docker compose down