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

🚨 Критическая уязвимость 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 байтов | переполнение буфера в куче |
Подробный ход
- директива rewriteсодержит безымянные захваты $1/$2
- строка заменысодержит ?, что задаёт is_args = 1
- фаза вычисления длины: используется заново инициализированный дочерний движок, is_args = 0
- возвращается исходная длина: выделяется слишком маленький буфер в куче
- фаза копирования данных: используется основной движок, is_args = 1
- вызывается ngx_escape_uri: байты расширяются, буфер переполняется
- Контролируемые злоумышленником данные 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