Домой Новости Железо 18-летнее RCE в nginx (CVE-2026-42945)

18-летнее RCE в nginx (CVE-2026-42945)

Критическая брешь в популярном веб-сервере оставалась незамеченной с 2008 года.

Уязвимость в nginx CVE-2026-42945
Обновление безопасности nginx Источник: linux.org.ru

13 мая была исправлена уязвимость в популярном для нагруженных систем веб-сервере nginx — CVE-2026-42945, которая потенциально может привести к удаленному выполнению кода (RCE). Ошибка появилась в коде еще 18 лет назад, в далёком 2008 году, начиная с версии 0.6.27.

Для успешной эксплуатации уязвимости в конфигурационном файле сервера должна присутствовать специфическая комбинация директив. Хотя она встречается не у каждого администратора, определенные риски существуют.

Существенные детали:

  • Сначала идет директива rewrite, где первый аргумент представляет собой регулярное выражение с выделяемым параметром в круглых скобках, который заменяется на путь, содержащий знак вопроса.
  • Затем используется директива set (вместо нее также подойдет второй rewrite или условие if), которая задействует выделенный параметр из исходного перезаписанного пути (в данном случае — $1).

Механизм возникновения уязвимости выглядит следующим образом:

  • Первая директива rewrite при встрече со знаком вопроса устанавливает внутренний флаг is_args. Он означает, что система начинает сбор GET-параметров для измененного URL и требует обязательного экранирования. Суть бага заключается в том, что сервер забывает сбросить этот флаг по завершении своей работы.
  • Последующая директива set при формировании значения переменной ошибочно применяет ранее установленный флаг is_args и записывает в переменную экранированную версию выделенного параметра $1. Проблема усугубляется тем, что буфер для переменной выделяется заранее, еще до выполнения подстановок, а его размер рассчитывается исходя из состояния is_args = 0. В результате экранированное значение оказывается длиннее выделенного буфера, что приводит к переполнению памяти и записи данных в соседние структуры сервера. Чтобы спровоцировать баг, достаточно отправить запрос со специальными символами (например, знаками «плюс»), подлежащими экранированию в месте захвата параметра регулярного выражения.

Если на хосте отсутствует рандомизация адресного пространства (ALSR), данную брешь можно использовать для удаленного выполнения кода с привилегиями рабочего процесса nginx. На данный момент существует демонстрационный PoC (выполненный в условиях изолированной песочницы).

Уязвимость была оперативно устранена в стабильной ветке nginx 1.30.1, а также в новой девелоперской версии 1.31.0.

Примечательно, что 14 лет назад, в 2012 году, разработчики уже сталкивались с похожей ошибкой и исправляли аналогичный сбой в соседнем участке кода.

Компания F5 опубликовала официальные рекомендации по временной нейтрализации угрозы на случай, если быстрое обновление nginx невозможно. В качестве обходного пути предлагается заменить неименованные захваченные параметры на именованные — по заверениям специалистов, в таком случае уязвимость не проявляется.

Первоначальная информация об опасной ошибке была предоставлена исследователем Zhenpeng (Leo) Lin из компании DepthFirst. Кроме того, он сообщил о ряде других уязвимостей, которые также были успешно исправлены разработчиками:

  • CVE-2026-40701 — уязвимость типа use-after-free при совместном использовании директив ssl_verify_client и ssl_ocsp (по предварительным данным, вектор атаки не ведет к RCE).
  • CVE-2026-42934 — ошибка чтения за пределами буфера в парсере UTF-8 при определенных условиях, способная вызвать небольшую утечку данных или аварийное завершение рабочего процесса.
  • CVE-2026-42946 — избыточное выделение памяти и чтение за границами буфера при использовании модулей SCGI и uwsgi. Проблема проявляется при наличии скомпрометированного бэкенда (upstream) через указанные протоколы либо в случае проведения атаки типа MitM на канал связи с бэкендом, что может привести к утечке данных из памяти nginx или падению процесса.
Источник: https://www.linux.org.ru