needhelp
← Back to blog

NGINX Rift (CVE-2026-42945): 18-летний heap overflow в модуле rewrite

by xingwangzhe
NGINX
CVE
Security
RCE
Heap Overflow
Web Server

NGINX Rift (CVE-2026-42945, CVSS 9.2): критический heap buffer overflow в модуле rewrite NGINX, автономно обнаруженный AI-системой depthfirst. Представлен в 2008, затрагивает 18 лет релизов NGINX, позволяет неаутентифицированному атакующему выполнить код одним HTTP-запросом.

Уязвимость, скрывавшаяся на виду

13 мая 2026 года F5 и depthfirst совместно раскрыли CVE-2026-42945 — критический heap buffer overflow в ngx_http_rewrite_module. Уязвимость сидела в кодовой базе с 2008 года (NGINX 0.6.27), затрагивая все последующие версии до 1.30.0.

Примечательно, как она была найдена: не человеком, а автономной системой анализа уязвимостей depthfirst. AI просканировал исходный код NGINX и за шесть часов отметил heap overflow, ускользавший от людей 18 лет.

Метрика Значение
CVE CVE-2026-42945
CVSS v4.0 9.2 (Critical)
Кем найдено depthfirst (автономный AI)
Представлена 2008 (NGINX 0.6.27)
Скрывалась 18 лет
Тип Heap buffer overflow (двухпроходное несоответствие длины)
Аутентификация Не требуется
Влияние RCE или DoS (падение worker)
Исправление NGINX 1.31.0 / 1.30.1

Затронутые версии

Продукт Затронутые версии
NGINX Open Source 0.6.27 – 1.30.0
NGINX Plus R32 – R36
NGINX Ingress Controller 3.5.0–3.7.2, 4.0.0–4.0.1, 5.0.0–5.4.1

NGINX обслуживает примерно треть всех сайтов в мире — радиус взрыва огромен.

Технический разбор

Двухпроходный дизайн

NGINX оценивает директивы rewrite и set в два прохода:

  1. Length pass: вычисляет размер буфера для вывода
  2. Copy pass: выделяет буфер и пишет данные

Контракт: проход 1 говорит, сколько байт выделить, проход 2 пишет ровно столько. Если они не совпадают — heap overflow.

Корневая причина: флаг is_args

Когда строка замены rewrite содержит вопросительный знак (?), функция ngx_http_script_start_args_code устанавливает флаг e->is_args = 1. Проблема: флаг никогда не сбрасывается. Он остается на главном движке скриптов до конца обработки запроса.

Несоответствие

При последующей set директиве, ссылающейся на группу захвата (например, $1):

  • Length pass использует свежий обнуленный под-движок — возвращает сырую длину без экранирования
  • Copy pass работает на главном движке с is_args = 1 — применяет URI-экранирование, расширяя +, %, & с 1 до 3 байт каждый

Буфер выделен на сырую длину — запись выходит за пределы выделения.

Эксплуатация

Свойство Деталь
Размер переполнения Полностью контролируется атакующим
Данные переполнения Контролируются (экранированное содержимое URI)
Воспроизводимость Детерминированная
Попытки Бесконечные — упавшие worker перезапускаются с той же heap-разметкой

Проверьте вашу конфигурацию

Terminal window
grep -rn 'rewrite.*\?.*\$[0-9]' /etc/nginx/

Если есть совпадения — конфигурация уязвима.

Смягчение

Немедленно: обновитесь до 1.31.0 или 1.30.1.

Workaround: замените безымянные группы захвата на именованные:

# Уязвимо
rewrite ^/users/([0-9]+)/profile/(.*)$ /profile.php?id=\$1&tab=\$2 last;
# Исправлено
rewrite ^/users/(?<user_id>[0-9]+)/profile/(?<section>.*)$ /profile.php?id=$user_id&tab=$section last;

Таймлайн

Дата Событие
2008 Уязвимость введена (NGINX 0.6.27)
2026-04 depthfirst сканирует NGINX, отметил heap overflow за 6 часов
2026-04-24 F5 подтверждает и согласует раскрытие
2026-05-13 F5 выпускает NGINX 1.31.0 с исправлением
2026-05-14 Настоящая статья

AI-обнаруженные уязвимости: более широкая картина

CVE-2026-42945 примечателен не только серьезностью, но и методом обнаружения. Автономная AI-система нашла баг в кодовой базе, аудированной тысячами инженеров за 18 лет — за шесть часов.

Уязвимость Кем найдена Время
Copy Fail (Linux kernel) Xint Code (AI) ~1 час
Dirty Frag (Linux kernel) Человек Ручной аудит
CVE-2026-42945 (NGINX) depthfirst (AI) 6 часов

Разрыв между тем, что может найти решительная AI-система, и тем, что исторически находили люди, быстро растет. Если у вас есть NGINX — считайте, что вы затронуты, пока не проверили конфигурацию.

References

Share this page