nginx 1.31.7 и 1.30.6: пять CVE, njs 1.0.2 с двумя дырами в XML

14 октября 2026 года на nginx.org вышли nginx 1.31.7 (основная ветка, mainline) и 1.30.6 (стабильная), а вместе с ними njs 1.0.2. В nginx закрыто пять уязвимостей, в njs ещё две. Коротко новость дал и opennet.

Все пять дыр в nginx nginx.org оценивает как medium. Почти все они срабатывают только при определённых настройках: alias вместе с rewrite, map с регулярками, HTTP/3, автоматическая ротация ключей TLS-тикетов, SSI вместе с AIO. Если у вас nginx на VPS торчит в интернет, стоит пробежаться по списку и сверить со своим конфигом, а лучше просто обновиться.

Пять CVE в nginx 1.31.7 и 1.30.6

CVE-2026-15176, переполнение буфера при alias вместе с rewrite. Затронут ngx_http_core_module. Ошибка срабатывает, когда URI меняется директивой rewrite, а потом превращается в путь к файлу через alias. По описанию F5, нужен ещё set или return с переменной $request_filename, либо эта переменная в формате access-лога. Итог: переполнение кучи в рабочем процессе, его перезапуск, то есть DoS. При выключенном или обойдённом ASLR возможно выполнение кода. Уязвимы версии с 0.1.29 по 1.31.6.

CVE-2026-93479, переполнение буфера при вычислении строковых выражений с переменными. Задевает вычисление root и логирование запросов в модулях http и stream. В описании CVE типичный сценарий такой: map с регулярным выражением, а в root или формате лога захваты из регулярки стоят раньше самой переменной map. Последствия те же: падение воркера, при обходе ASLR возможен запуск кода. Эта ошибка свежая: уязвимы только 1.31.2-1.31.6 и 1.30.0-1.30.5.

CVE-2026-95101, подмена тела запроса в HTTP/3 (ngx_http_v3_module). Часть неизвестного фрейма HTTP/3 могла попасть в тело запроса. Так можно обойти лимит client_max_body_size или подсунуть свои данные в проксируемый запрос. F5 уточняет, что речь о HTTP/3 при proxy_request_buffering on. Уязвимы версии с 1.25.0 по 1.31.6. Если HTTP/3 не включён, проблема вас не касается.

CVE-2026-97629, подделка TLS-сессий (ngx_http_ssl_module). При ротации ключей session ticket один из ключей оставался неинициализированным. По описанию F5, это случается с ssl_session_cache shared:имя:размер без явного файла ssl_session_ticket_key, когда nginx сам меняет ключи. Атакующий может подделать сессию и обойти проверку клиентских сертификатов. На nginx.org уязвимыми названы 1.23.2-1.31.6.

CVE-2026-97205, use-after-free при асинхронном вводе/выводе. В некоторых конфигурациях с AIO обработка SSI-страницы с командами include virtual обращается к уже освобождённой памяти. Возможны порча памяти, падение воркера и, при обходе ASLR, выполнение кода. Уязвимы версии с 0.8.11 по 1.31.6.

Что ещё нового в nginx 1.31.7

Основная ветка, как обычно, получила и новые возможности. Это из CHANGES к 1.31.7:

  • ngx_http_geoip_module и ngx_stream_geoip_module научились работать с базами MaxMind DB (MMDB);
  • SSL-сертификаты бэкенда теперь можно проверять по IP-адресу;
  • QUIC с директивой quic_bpf теперь переживает переконфигурацию и обновление бинарника на лету;
  • ngx_http_v2_module перешёл на схему приоритетов из RFC 9218, сигналы приоритета по RFC 7540 игнорируются;
  • исправлено падение воркера при закэшированном заголовке X-Accel-Redirect и падение ngx_http_dav_module на COPY и MOVE в location с alias.

В стабильной 1.30.6 кроме тех же пяти исправлений безопасности понижен уровень логирования для ряда SSL-ошибок с crit до info и тоже исправлена ошибка с X-Accel-Redirect. Подробности в CHANGES-1.30.

njs 1.0.2: две уязвимости в XML и новые методы

njs это модуль для сценариев на JavaScript прямо в конфиге nginx. В njs 1.0.2 закрыты две дыры в XML-модуле, обе появились ещё в 0.7.10, уязвимы версии до 1.0.2:

  • CVE-2026-101025: утечка памяти при разборе битого XML в движке njs. Если xml.parse() падает, контекст парсера libxml2 не освобождается. Повторяя такие запросы, можно постепенно съесть память рабочего процесса.
  • CVE-2026-101019: значения XML-атрибутов со ссылками на сущности JavaScript видел не так, как их видит каноникализация. Из-за этого проверка подписанного XML могла пройти, а важные атрибуты при этом выглядели пустыми или обрезанными. Как пишет F5, затронут nginx-saml на встроенном движке njs.

Остальное в выпуске:

  • новые методы XMLNode.getAttributeNS() и XMLNode.getChildNS() для поиска атрибутов и дочерних элементов с учётом пространств имён;
  • движок njs ест меньше памяти при компиляции и освобождает временные данные парсера после неё;
  • HMAC-подпись в WebCrypto теперь проверяется за постоянное время;
  • в ngx.fetch() исправлены разбор тела ответа и переиспользование keepalive-соединений, ответы с конфликтующими Content-Length, с Transfer-Encoding вместе с Content-Length или с кодом 1xx теперь отклоняются; заодно max_response_body_size теперь соблюдается для chunked-ответов;
  • изменение XML-узлов стало строже: отсоединённые узлы отвергаются, значения текста и атрибутов должны быть строками.

Как проверить версию и обновиться

Версию nginx показывает ключ -v, а -V добавит параметры сборки и список модулей:

nginx -v
nginx -V 2>&1 | tr ' ' '\n' | grep -E 'http_v3|ssi|njs'

Если версия ниже 1.30.6 в стабильной ветке или ниже 1.31.7 в основной, пора обновляться. С официальным репозиторием nginx.org на Debian и Ubuntu это обычное обновление пакета, после него проверить конфиг и перезапустить:

sudo apt update
sudo apt install --only-upgrade nginx
sudo nginx -t && sudo systemctl restart nginx
nginx -v

На RHEL, AlmaLinux и Rocky то же самое через dnf:

sudo dnf upgrade nginx
sudo nginx -t && sudo systemctl restart nginx

Если nginx стоит из репозитория дистрибутива, номер версии там обычно старый, а исправления приезжают патчами в суффиксе пакета. В этом случае ориентир не nginx -v, а бюллетень безопасности вашего дистрибутива с нужными CVE. Модуль njs ставится отдельным пакетом, nginx-module-njs в репозитории nginx.org, и обновляется вместе с nginx.

Пока обновиться нельзя, можно сузить риск конфигом: задать свой файл ssl_session_ticket_key вместо автоматической ротации, временно выключить HTTP/3 и не смешивать SSI с aio. Но это полумеры, нормальное решение одно: свежий пакет.

Итог: nginx 1.31.7 и 1.30.6 закрывают пять уязвимостей средней опасности, три из них при неудачном стечении обстоятельств дают шанс на выполнение кода. njs 1.0.2 чинит две дыры в XML, важные прежде всего тем, кто проверяет подписанный XML, например в SAML. Предыдущий выпуск разбирал в посте про nginx 1.31.5 и njs 1.0.1.

Источники и ссылки


Комментарии загружаются…