
Эксплойт Proof-of-concept для CVE-2025-29927, уязвимости обхода промежуточного программного обеспечения Next.js. Включает полезные нагрузки для конкретных версий и лабораторную среду на базе Docker для тестирования несанкционированного доступа к защищенным маршрутам.

Все версии Next.js с 11.1.4 по 13.5.6, 14.x до 14.2.25 и 15.x до 15.2.3 подвержены этой уязвимости. Особенно значительное влияние она оказывает на приложения, использующие middleware для реализации контроля доступа, поскольку злоумышленники могут получить несанкционированный доступ к защищённым ресурсам без аутентификации.
Уязвимость CVE-2025-29927 связана с конструктивным недостатком в том, как Next.js обрабатывает заголовок x-middleware-subrequest. Этот заголовок изначально был предназначен для внутреннего использования в рамках фреймворка Next.js, чтобы предотвратить бесконечные циклы выполнения middleware.
Когда приложение Next.js использует middleware, вызывается функция runMiddleware для обработки входящих запросов. В рамках своей функциональности эта функция проверяет наличие заголовка x-middleware-subrequest. Если этот заголовок существует и содержит определённое значение, выполнение middleware полностью пропускается, а запрос напрямую перенаправляется к исходному назначению через NextResponse.next().
Уязвимость заключается в том, что эту проверку заголовка могут использовать внешние пользователи. Добавив заголовок x-middleware-subrequest с правильным значением в запрос, злоумышленник может полностью обойти любые механизмы защиты, основанные на middleware.
Клонируйте репозиторий:
git clone <repository_url>
Перейдите в директорию проекта:
cd nextjs-docker-app
Соберите Docker-образ:
docker build -t nextjs-app .
Запустите Docker-контейнер:
docker run -p 3000:3000 nextjs-app
Откройте приложение в браузере по адресу http://localhost:3000.
Метод эксплуатации незначительно различается в зависимости от версии Next.js:
В этих версиях файлы middleware должны были называться _middleware.ts и размещаться внутри папки pages. Значение middlewareInfo.name состояло из имени директории и имени файла:
x-middleware-subrequest: pages/_middleware
Для вложенных маршрутов могло быть несколько файлов middleware на разных уровнях, что приводило к нескольким возможным значениям заголовка:
x-middleware-subrequest: pages/dashboard/_middleware
или
x-middleware-subrequest: pages/dashboard/panel/_middleware
Начиная с версии 12.2, Next.js изменил соглашения для middleware. Файл должен называться middleware.ts (без подчёркивания) и больше не должен находиться в папке pages. Для этих версий полезная нагрузка проще:
x-middleware-subrequest: middleware
Кроме того, Next.js допускает альтернативную структуру проекта с директорией /src. В таких случаях полезная нагрузка будет:
x-middleware-subrequest: src/middleware
Для версий 13.2.0 и выше Next.js ввёл максимальную глубину рекурсии для выполнения middleware. Это было реализовано для предотвращения бесконечных циклов, но не влияет на уязвимость. Эксплуатация остаётся той же, поскольку проверка заголовка происходит до любых проверок глубины рекурсии.
x-middleware-subrequest: middleware:middleware:middleware:middleware:middleware
Или для проектов, использующих структуру с директорией /src:
x-middleware-subrequest: src/middleware:src/middleware:src/middleware:sr
=======
# cve-2025-29927
>>>>>>> 56c7b2dcd548caf771750519107bf7c57749a864