Критическая уязвимость в фреймворке Next.js, получившая идентификатор CVE-2025-29927, позволяет неавторизованным злоумышленникам обходить проверки прав доступа, реализованные через промежуточное программное обеспечение (middleware). Проблема связана с неправильной обработкой HTTP-заголовка x-middleware-subrequest, который используется для различения внутренних подзапросов и внешнего трафика.
Детали узявимости
Уязвимость затрагивает все версии Next.js, использующие данный заголовок, и может привести к несанкционированному доступу к защищенным маршрутам и административным интерфейсам. Роль заголовка x-middleware-subrequest заключается в предотвращении бесконечных циклов, когда промежуточное программное обеспечение инициирует подзапросы к серверу. Однако из-за недостаточной проверки происхождения запросов злоумышленники могут произвольно устанавливать этот заголовок, заставляя систему пропускать критически важные проверки авторизации.
Техническая суть уязвимости заключается в логике обработки заголовка в коде Next.js. Система разделяет значение заголовка по двоеточиям и проверяет, содержится ли в полученном массиве имя текущего промежуточного программного обеспечения. Если совпадение обнаружено, запрос считается внутренним и все последующие проверки игнорируются. Это позволяет злоумышленнику имитировать внутренний подзапрос, просто добавив соответствующий заголовок.
Способы эксплуатации различаются в зависимости от версии Next.js. В версиях 12.2 и ранее имя файла промежуточного программного обеспечения имеет вид pages/_middleware, поэтому для обхода достаточно указать в заголовке значение pages/_middleware. В более поздних версиях, где используется имя middleware, злоумышленник может установить заголовок в значение middleware. Начиная с версии 13.2.0, разработчики добавили ограничение на глубину рекурсии, но обход с помощью многократного повторения значения (например, middleware:middleware:middleware) остается возможным.
Типичный сценарий атаки выглядит следующим образом: злоумышленник отправляет GET-запрос к защищенному маршруту, например /admin, добавляя заголовок x-middleware-subrequest со значением 1. Это заставляет промежуточное программное обеспечение пропустить все проверки и предоставить доступ к запрашиваемой странице. Особую опасность уязвимость представляет в комбинации с другими механизмами защиты, такими как JWT-токены или куки. Если разработчик дополнительно проверяет наличие действительного токена, но при этом учитывает значение заголовка, атака все равно может быть успешной.
Для автоматического тестирования на наличие уязвимости специалисты по кибербезопасности рекомендуют использовать скрипты, которые последовательно отправляют запросы к защищенным маршрутам с вредоносным заголовком. Пример такого скрипта на Node.js демонстрирует, как можно быстро проверить несколько конечных точек на подверженность атаке.
В качестве мер защиты эксперты советуют всегда проверять происхождение заголовка x-middleware-subrequest и не полагаться исключительно на его наличие при принятии решений об авторизации. Необходимо реализовывать проверки на стороне сервера, которые будут выполняться независимо от значений HTTP-заголовков. Также критически важно своевременно обновлять Next.js до последних версий, где разработчики устраняют известные уязвимости.
Непрерывный мониторинг и оперативное применение исправлений помогут минимизировать риски, связанные с эксплуатацией CVE-2025-29927. Организациям, использующим Next.js, рекомендуется провести аудит своих приложений и убедиться в наличии дополнительных механизмов контроля доступа, не зависящих от работы промежуточного программного обеспечения.
Ссылки
- https://www.cve.org/CVERecord?id=CVE-2025-29927
- http://www.openwall.com/lists/oss-security/2025/03/23/3
- http://www.openwall.com/lists/oss-security/2025/03/23/4
- https://security.netapp.com/advisory/ntap-20250328-0002/