Переполнение буфера в модуле HTTP/3 nginx приводит к перезапуску рабочих процессов

NGINX

В nginx исправили уязвимость, из-за которой обработка запросов по HTTP/3 могла обрушить рабочий процесс и повредить данные. Ошибка живёт в модуле ngx_http_v3_module, отвечающем за поддержку третьей версии протокола. Чтобы она сработала, нужны три условия сразу: включённый HTTP/3, библиотека OpenSSL версии 3.5.0 или старше и подходящая конфигурация сервера. Атака идёт из сети, учётная запись злоумышленнику не нужна. Зато предсказуемого результата он не получает.

Уязвимость CVE-2026-90439

Проблему описали как переполнение буфера в куче. Речь о записи данных за границы выделенного участка памяти. Выход за границы ломает служебные структуры процесса. В зависимости от того, что именно окажется перезаписано, сервер либо перезапускает рабочий процесс, либо возвращает искажённый ответ. Оценка по шкале CVSS - 6.5 из 10, средний уровень. Идентификатор - CVE-2026-90439. Тип ошибки в бюллетене обозначен как CWE-122.

Сбой возникает при разборе рукопожатия TLS. Рукопожатие - процедура, в ходе которой клиент и сервер договариваются о параметрах шифрования. Происходит он не всегда и не по воле атакующего. Разработчики прямо называют поведение недетерминированным: один и тот же запрос может пройти штатно, а может привести к переполнению. Поэтому собрать из ошибки надёжный эксплойт (вредоносный код, использующий уязвимость) нелегко. Для отказа в обслуживании она тоже неудобна: злоумышленнику пришлось бы угадывать удачный момент.

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

F5 указала исследователя, нашедшего ошибку, - им стал Banny Liao. О реальных атаках с использованием этой уязвимости не сообщается. HTTP/3 пока развёрнут далеко не везде, что снижает масштаб проблемы. Обычно третью версию включают вручную, а большинство установок nginx продолжают работать по HTTP/1.1 и HTTP/2. Кроме того, уязвимость лежит в плоскости передачи данных, а не управления. Интерфейсы администрирования и настройки не затронуты, поэтому получить доступ к конфигурации через эту ошибку нельзя.

Уязвимы открытые сборки начиная с 1.29.2 - то есть ветки 1.29, 1.30 и 1.31 до выхода исправлений. Платную NGINX Plus проблема тоже затронула, и F5 обновила её отдельно. Исправления вошли в nginx 1.30.5 (stable) и nginx 1.31.6 (mainline), обе версии вышли 15 сентября. Администраторам стоит перейти на них или на более свежие выпуски. Если обновление откладывается, остаётся временно отключить HTTP/3. Второй запасной путь - библиотека OpenSSL новее 3.5.0: с более поздними её версиями, по данным F5, ошибка не проявляется.

Вместе с исправлением разработчики изменили поведение сервера при обработке расширения, которое передаёт транспортные параметры QUIC в SSL-соединении. QUIC - транспортный протокол, на котором строится HTTP/3. Теперь это расширение всегда игнорируется. Раньше nginx пытался его учитывать, и такой разбор добавлял лишние пути обработки входящих данных. Отказ от учёта параметров сокращает поверхность атаки, хотя формально и не связан с самим переполнением.

В mainline-ветке заодно поправили несколько давних недочётов. Обновление исполняемого файла на лету отказывалось работать, если был задан сокет для API управления, а новый файл собран с модулем Perl. Ошибка при вычислении условия в блоке местоположений игнорировалась, и условие считалось ложным. Похожая ошибка могла теряться при вложенном поиске местоположений. Ещё один сбой приводил к аварийному завершению при чтении конфигурации, если настройки геолокации опирались на диапазоны адресов и бинарный файл базы оказывался повреждён.

HTTP/3 появился в nginx относительно недавно, и его связка с библиотекой шифрования остаётся молодой частью кода. Чем больше логики добавляют в разбор нового протокола, тем чаще в ней находят ошибки работы с памятью. Переполнение буфера в рабочем процессе - как раз из этой категории. Обновление до 1.30.5 или 1.31.6 снимает риск для тех, кто уже включил третью версию. Остальным спешить некуда, но проверку версии отложить не помешает.

Ссылки

Комментарии: 0