Вышла версия 1.0.1 модуля njs, который добавляет в веб-сервер NGINX поддержку языка JavaScript. В ней закрыты три уязвимости, связанные с безопасностью. Одна из них позволяет обойти контроль доступа, вторая приводит к аварийному завершению рабочего процесса сервера, третья - к повреждению памяти при обработке XML. Все три ошибки могут быть инициированы удалённо при определённых условиях, поэтому обновление необходимо всем, кто использует njs в публичных конфигурациях.
Детали уязвимостей
Модуль njs применяется для написания скриптов, которые выполняются внутри NGINX в процессе обработки запросов. Нередко на эти скрипты возлагают задачи проверки прав доступа, аутентификации и маршрутизации. Именно с этим связана наиболее значимая уязвимость, получившая идентификатор CVE-2026-18329. Проблема затрагивает механизм js_access, который предназначен для контроля доступа к ресурсам до того, как запрос будет передан дальше по цепочке обработки. Если скрипт использует асинхронное чтение тела запроса, а во время такой проверки возникает исключение или необработанное отклонение промиса, то NGINX может ошибочно продолжить обработку запроса, как будто проверка завершилась успешно. Злоумышленнику достаточно отправить запрос, который вызовет ошибку в логике проверки, и доступ к защищённому ресурсу окажется открыт без необходимой авторизации. Уязвимость была внесена в кодовую базу в версии 0.9.9 и также присутствует в версии 1.0.0. Обход контроля доступа в подобном модуле означает прямой несанкционированный доступ к данным или функциям, которые должны быть скрыты от внешних пользователей.
Вторая уязвимость связана с работой метода fetch, который позволяет скриптам njs выполнять HTTP-запросы к другим серверам. Такая возможность часто используется для обращения к внутренним сервисам, проверки токенов или получения дополнительной информации о пользователе. Когда вышестоящий сервер возвращает ответ со статусной строкой, содержащей код, но без текста причины, например "HTTP/1.1 200" вместо "HTTP/1.1 200 OK", а скрипт после этого обращается к свойству statusText, в движке возникает обращение к пустому указателю. Это приводит к аварийному завершению рабочего процесса NGINX. Рабочие процессы автоматически перезапускаются, поэтому одиночный сбой может остаться незамеченным, однако повторение таких запросов способно вызвать продолжительный отказ в обслуживании. Для эксплуатации требуется возможность влиять на ответ вышестоящего сервера, к которому обращается скрипт. В некоторых приложениях адрес такого сервера формируется на основе внешних данных, что делает ошибку доступной удалённому атакующему. Уязвимость присутствует начиная с версии 0.5.1.
Третья проблема имеет идентификатор CVE-2026-78689 и затрагивает XML-модуль njs. Ошибка возникает в методе exclusiveC14n, который выполняет канонизацию XML-документов, то есть приводит их к стандартному виду, необходимому для проверки цифровых подписей. При разборе списка префиксов пространств имён происходит переполнение буфера: данные записываются за границы выделенной области памяти. На практике повреждение соседних структур вызывает аварийное завершение рабочего процесса NGINX. В альтернативном движке QuickJS, который подключается отдельной директивой, помимо этого при каждом вызове происходит утечка памяти, из-за чего потребление памяти рабочим процессом постепенно растёт. Особую опасность этой уязвимости придаёт способ её достижения. Официальная реализация NGINX SAML, используемая для интеграции с системами единого входа, передаёт в метод exclusiveC14n непроверенные данные из SAML-сообщения до проверки подписи. Это значит, что атакующему не нужен действительный подписанный документ: достаточно отправить специально сформированный SAML-ответ, ассерцию или запрос на завершение сеанса. Выполнение произвольного кода в результате этой ошибки пока не продемонстрировано, но специалисты не исключают такой возможности на некоторых платформах. Уязвимость затрагивает обе реализации движка и появляется начиная с версии 0.7.10.
Все перечисленные ошибки исправлены в версии njs 1.0.1, которая вышла 2 сентября 2026 года. Пользователям NGINX с включённым njs следует обновить модуль до этой версии как можно скорее. Затронуты релизы, начиная с тех, где ошибки были внесены: обход js_access присутствует в версиях 0.9.9 и 1.0.0, проблема с чтением статуса ответа затрагивает версии начиная с 0.5.1, а переполнение буфера в XML-модуле - начиная с 0.7.10. После обновления модуля необходимо перезапустить NGINX или перезагрузить его конфигурацию, чтобы изменения вступили в силу. Тем, кто использует готовые контейнеры или официальную реализацию NGINX SAML, нужно пересобрать образы и убедиться, что внутри применяется njs версии 1.0.1.
Публикация этих исправлений лишний раз подтверждает, что дополнительные скриптовые компоненты веб-серверов требуют такого же регулярного обновления, как и основной код. njs нередко применяется именно в задачах безопасности - для разграничения доступа, проверки подлинности и обработки чувствительных данных. Уязвимости в таком модуле напрямую влияют на уровень защиты всей инфраструктуры, поэтому промедление с установкой исправления может обернуться утечкой данных или простоем сервисов. Своевременный переход на актуальную версию закрывает все три описанные проблемы, что особенно важно для конфигураций, работающих с внешними запросами и SAML-потоками.
Ссылки
- https://nginx.org/en/docs/njs/changes.html#njs1.0.1
- https://www.cve.org/CVERecord?id=CVE-2026-18329
- https://www.cve.org/CVERecord?id=CVE-2026-78222
- https://www.cve.org/CVERecord?id=CVE-2026-78689