← Вернуться к списку

Уязвимость Nginx CVE-2026-42945, скрывавшаяся 18 лет: принцип работы, PoC и способы исправления

itadol5j

Nginx CVE-2026-42945

🚨 Критическая уязвимость Nginx CVE-2026-42945, скрывавшаяся 18 лет: принцип работы, PoC и способы исправления

13 мая 2026 года исследовательская группа по безопасности depthfirst совместно с F5 раскрыла критическую уязвимость NGINX —CVE-2026-42945:

  • оценка CVSS v4.0 — 9.2: относится к критическим уязвимостям
  • переполнение буфера в куче: может привести к удалённому выполнению кода (RCE)
  • скрывалась 18 лет: код внесён в репозиторий в 2008 году
  • затрагивает 9,75 млн сайтов по всему миру: в Китае затронуто более 2,54 млн сайтов
  • PoC опубликован: QiAnXin успешно воспроизвёл атаку

Это уязвимость в базовом модуле NGINX, для захвата сервера злоумышленнику достаточно отправить один специально сформированный HTTP-запрос.

🔍 Обзор уязвимости

Основная информация

Свойство Описание
Идентификатор уязвимости CVE-2026-42945
Оценка CVSS v4.0: 9.2 | v3.1: 8.1
Тип уязвимости Переполнение буфера в куче (Heap-based Buffer Overflow)
Тип угрозы Удалённое выполнение кода (RCE), отказ в обслуживании (DoS)
Условия эксплуатации Аутентификация не требуется, достаточно специально сформированного HTTP-запроса
Затронутый компонент ngx_http_rewrite_module (встроенный базовый модуль NGINX)
Организация-первооткрыватель depthfirst (автоматизированная система обнаружила за 6 часов)

Масштаб воздействия

  • 9,75 млн сайтов в мирезатронуто
  • 2,54 млн сайтов в Китаезатронуто
  • NGINX обслуживает около 1/3 всех сайтов в мире, масштаб воздействия огромен
  • Код внесён в 2008 году и оставался скрытым 18 лет

⚠️ Условия срабатывания

Все три условия должны выполняться одновременно

Для срабатывания уязвимости требуется, чтобы конфигурация удовлетворяла определённой комбинации условий:

Условие Описание Пример
1. Безымянные PCRE-захваты директива rewrite использует безымянные группы захвата $1, $2, $3…
2. Знак вопроса в строке замены строка замены содержит символ ? /profile.php?id=$1&tab=$2
3. Далее следует rewrite/if/set после директивы rewrite идут другие директивы rewrite … last; if (…) { … }

Уязвимый пример

# 易受攻击配置
rewrite ^/users/([0-9]+)/profile/(.*)$ /profile.php?id=$1&tab=$2 last;
# 后跟其他指令
if ($arg_debug) {
    set $debug_flag 1;
}

Эта конфигурация удовлетворяет всем трём условиям:безымянные захваты $1/$2, символ ? в строке замены, следующая за этим директива if.

🔬 Принцип работы уязвимости

Рассогласование состояний при двухфазной обработке

Скриптовый движок NGINX использует двухфазную обработку:

  • первая фаза: вычисление необходимого размера буфера
  • вторая фаза: копирование данных в буфер

Суть уязвимости — в ошибке управления флагом is_args:

Фаза Состояние is_args Логика обработки Результат
Фаза вычисления длины is_args = 0 возвращается исходная длина захвата размер буфера занижен
Фаза копирования данных is_args = 1 вызывается ngx_escape_uri, каждый байт расширяется до 3 байтов переполнение буфера в куче

Подробный ход

  1. директива rewriteсодержит безымянные захваты $1/$2
  2. строка заменысодержит ?, что задаёт is_args = 1
  3. фаза вычисления длины: используется заново инициализированный дочерний движок, is_args = 0
  4. возвращается исходная длина: выделяется слишком маленький буфер в куче
  5. фаза копирования данных: используется основной движок, is_args = 1
  6. вызывается ngx_escape_uri: байты расширяются, буфер переполняется
  7. Контролируемые злоумышленником данные URIзаписываются в область переполнения

Способ эксплуатации

Heap Feng Shui между запросами:

  • тело POST-запросараспыляет память кучи (поскольку URI не может содержать нулевые байты)
  • данные переполненияповреждают указатель cleanup соседнего ngx_pool_t
  • подделывается ngx_pool_cleanup_s, указывающий на system()
  • при уничтожении poolсрабатывает вызов system()
  • реализуется RCE

Влияние ASLR

  • ASLR включён: приводит лишь к падению рабочего процесса (DoS)
  • ASLR отключён: возможно удалённое выполнение кода (RCE)

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

NGINX Open Source

Диапазон версий Исправленные версии
0.6.27 – 1.30.0 1.31.0, 1.30.1

NGINX Plus

Диапазон версий Исправленные версии
R32 – R36 R36 P4, R35 P2, R32 P6

Другие затронутые компоненты

  • NGINX Instance Manager: 2.16.0 – 2.21.1
  • NGINX App Protect WAF: 4.9.0 – 5.8.0
  • NGINX Ingress Controller: 3.5.0 – 5.4.1
  • NGINX Gateway Fabric: 1.3.0 – 2.5.1
  • F5 DoS for NGINX: 4.8.0

🔥 Статус PoC

PoC опубликован

  • Репозиторий на GitHub:https://github.com/DepthFirstDisclosures/Nginx-Rift
  • Воспроизведено QiAnXin: исследователи центра анализа угроз успешно воспроизвели атаку
  • Технические детали опубликованы: depthfirst выпустила технический анализ
  • Эксплуатация в дикой природе: пока не обнаружена

Как пользоваться PoC

# 构建容器
./setup.sh

# 启动易受攻击的 NGINX 服务器
docker compose -f env/docker-compose.yml up

# 执行 PoC 获取 Shell
python3 poc.py --shell

✅ Способы исправления

Способ 1: обновление версии

# 升级到修复版本
NGINX Open Source >= 1.31.0
NGINX Open Source >= 1.30.1
NGINX Plus >= R32 P6
NGINX Plus >= R36 P4

# 升级后重启 NGINX
nginx -s reload

Способ 2: изменение конфигурации (меры смягчения)

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

# 易受攻击配置(未命名捕获)
rewrite ^/users/([0-9]+)/profile/(.*)$ /profile.php?id=$1&tab=$2 last;

# 修复后配置(命名捕获)
rewrite ^/users/(?[0-9]+)/profile/(?.*)$ /profile.php?id=$user_id&tab=$section last;

именованные группы захвата не вызывают срабатывание уязвимости.

Способ 3: проверка конфигурации

Проверьте конфигурацию на наличие уязвимых мест:

# 搜索易受攻击的 rewrite 指令
grep -E "rewrite.*\$[0-9]+.*\?.*(rewrite|if|set)" /etc/nginx/nginx.conf
grep -rE "rewrite.*\$[0-9]+.*\?.*(rewrite|if|set)" /etc/nginx/conf.d/

🔍 Как была обнаружена

Обнаружена автоматизированной системой

depthfirst использует систему анализа безопасности:

  • за 6 часовнайдено 5 проблем
  • 4 подтверждены NGINX
  • CVE-2026-42945 — самая серьёзная из них
  • прослеживается до 2008 года и присутствует практически во всех стандартных сборках

Другие связанные уязвимости

  • CVE-2026-42946: проблема повреждения памяти
  • CVE-2026-40701: проблема повреждения памяти
  • CVE-2026-42934: проблема повреждения памяти

📝 Итоги

CVE-2026-42945 — одна из самых опасных уязвимостей в истории NGINX:

  • скрывалась 18 лет: код внесён в репозиторий в 2008 году
  • CVSS 9.2: переполнение буфера в куче, может привести к RCE
  • условия срабатывания: директива rewrite с безымянными захватами + символ ? в строке замены + следующие за ней другие директивы
  • масштаб воздействия: 9,75 млн сайтов в мире, 2,54 млн сайтов в Китае
  • PoC опубликован: репозиторий на GitHub + воспроизведён QiAnXin
  • способы исправления: обновление версии или использование именованных групп захвата

Уязвимость, скрывавшаяся 18 лет, раскрыта — рекомендуется как можно скорее обновить версию или изменить конфигурацию.

Официальное объявление:https://my.f5.com/manage/s/article/K000161019

Репозиторий PoC:https://github.com/DepthFirstDisclosures/Nginx-Rift

Технический анализ:https://depthfirst.com/research/nginx-rift