NGINX, принадлежащий F5, является широко используемым обратным прокси-сервером в мире. NGINX также является критически важной инфраструктурой глобального Интернета. Теперь компания, занимающаяся исследованием безопасности, обнаружила в своем программном обеспечении уязвимость высокого риска. Уязвимость имеет номер CVE-2026-42945. В скриптовом движке NGINX, существующем уже 18 лет, существует проблема переполнения буфера кучи.

Злоумышленнику достаточно отправить тщательно составленный HTTP-запрос на открытый сервер NGINX, чтобы удаленно захватить управление им. На долю NGINX приходится почти 30% основных полей глобального веб-сервера и обратного прокси-сервера, поэтому эта уязвимость может затронуть большое количество интернет-сервисов.

Влияет на онтологию NGINX и несколько производных:

Первоначально эта уязвимость была представлена ​​в NGINX версии 0.6.27, выпущенной в 2008 году. После этого уязвимость долгое время не была обнаружена и скрывалась до сих пор. Эта уязвимость затрагивает версии NGINX 0.6.27~1.30.0, а также различные производные NGINX, предоставляемые F5 коммерческим клиентам. Затронутые производные продукты включают, помимо прочего, NGINX WAF, F5 WAF, NGINX Gateway Fabric, NGINX Ingress Controller и т. д.

Условия срабатывания уязвимости очень скрыты. Когда в файле конфигурации NGINX одновременно появятся следующие две инструкции, уязвимость будет активирована:

rewrite ^/api/(.*)$ /internal?migrated=true;  # 重写规则末尾带 “?” set $original_endpoint $1;                     # 使用正则捕获组

Исследовательская группа, обнаружившая уязвимость, указала, что основная причина уязвимости кроется в скриптовом движке (ngx_http_script.c) ngx_http_rewrite_module. Когда инструкция перезаписи содержит вопросительный знак, устанавливается постоянный флаг is_args, но на последующем этапе расчета длины инструкции установки механизм использует новый очищенный подпроцесс, что приводит к пропуску логики экранирования URL-адреса во время расчета длины.

На этапе фактического копирования основной механизм используется для запуска функции ngx_escape_uri для экранирования таких символов, как + и &. Буфер выделяется в соответствии с неэкранированной длиной, но записывается расширенное содержимое, что в конечном итоге приводит к контролируемому переполнению буфера кучи.

F5 выпустила версию NGINX 1.31.0/1.30.1, в которой исправлены:

Получив уведомление об уязвимости, F5 быстро подтвердил наличие уязвимости. После того как F5 подготовила исправление, исследователи публично опубликовали уязвимость. Поэтому пользователям, которые в настоящее время используют NGINX и его производные, необходимо выполнить обновление до последней версии, на которую не влияет эта проблема. Версию NGINX с открытым исходным кодом необходимо обновить до версии 1.30.1 или 1.31.0. Этой уязвимости подвержены и другие более старые версии, например версии 0.6.27~1.30.0.

Информацию о версиях других производных см. в бюллетене по безопасности F5: https://my.f5.com/manage/s/article/K000160932.