
Локальный сканер только для чтения для CVE-2026-42945 (NGINX Rift), который проверяет экземпляры NGINX, OpenResty и Tengine на наличие уязвимых конфигураций перезаписи без выполнения эксплойтов или изменения сервисов.
Этот репозиторий содержит два скрипта локальной проверки для Linux/Windows, предназначенных для выявления потенциальных рисков, связанных с CVE-2026-42945, в Nginx, OpenResty и Tengine на самом сервере.
Скрипты выполняют только чтение и локальную оценку: не запускают PoC уязвимости, не отправляют атакующие запросы, не изменяют конфигурацию, не перезапускают службы и не обновляют программное обеспечение.
CVE-2026-42945 также известна как NGINX Rift. В открытых источниках она описывается как переполнение кучи (heap buffer overflow) в модуле ngx_http_rewrite_module. Согласно описанию NVD, при определённом сочетании директивы rewrite с последующими директивами rewrite/if/set, использующими безымянные захваченные переменные PCRE (например, $1, ) и строку замены, содержащую вопросительный знак , злоумышленник может вызвать переполнение буфера в куче рабочего процесса NGINX путём отправки специально сконструированного HTTP-запроса. Эта проблема может привести к перезапуску рабочего процесса; при определённых условиях, таких как отключённый ASLR, существует риск выполнения произвольного кода.
$2?Официальное уведомление NGINX о безопасности помечает CVE-2026-42945 как переполнение буфера в ngx_http_rewrite_module и указывает границы исправления для NGINX Open Source:
| Статус | Версия NGINX Open Source |
|---|---|
| Исправлено | 1.31.0+ / 1.30.1+ |
| Предположительно уязвимы | 0.6.27-1.30.0 |
Дистрибутивы, коммерческие продукты, OpenResty, Tengine или пользовательские сборки могут иметь обратное портирование исправлений или различия в соответствии версий. Скрипт постарается собрать как можно больше доказательств, но в конечном итоге рекомендуется сверяться с уведомлениями вендора.
Этот инструмент не является средством проверки эксплуатации уязвимости; это инструмент локального сбора и статической проверки конфигурации. Он в первую очередь выявляет следующие комбинации:
$1, $2, в строке замены директивы rewrite.? в той же строке замены rewrite (литеральный \? не считается рискованным).rewrite, if или set в той же области конфигурации.Пример рискованного шаблона:
location ~ ^/api/(.*)$ {
rewrite ^/api/(.*)$ /internal?endpoint=$1 last;
set $flag 1;
}
Риск возникает не от отдельной директивы rewrite или set, а от комбинации версии, контекста конфигурации и порядка выполнения. Если уязвимость подтверждена, всё равно рекомендуется вручную проверить, является ли эта конфигурация активной, доступна ли она для внешних запросов, и не было ли исправления, портированного обратно дистрибутивом.
| Файл | Описание |
|---|---|
check_nginx_linux.sh | Скрипт локальной проверки для Linux |
check_nginx_windows.ps1 | Скрипт локальной проверки для Windows |
README.md | Описание на китайском |
README.en.md | Описание на английском |
Первая версия поддерживает:
rewrite, связанных с CVE-2026-42945.summary.txt, summary.json и каталога с сырыми доказательствами.Первая версия НЕ включает:
Рекомендуется запускать с правами администратора:
root или пользователя с правами sudo.Без прав администратора скрипт постарается собрать максимум информации; если не удастся экспортировать полную активную конфигурацию (nginx -T), результат будет помечен как требует ручной проверки.
Загрузите check_nginx_linux.sh на сервер и выполните:
chmod +x check_nginx_linux.sh
sudo ./check_nginx_linux.sh
Если sudo недоступен, можно выполнить напрямую:
./check_nginx_linux.sh
Загрузите check_nginx_windows.ps1 на сервер, запустите PowerShell от имени администратора и выполните:
powershell -ExecutionPolicy Bypass -File .\check_nginx_windows.ps1
Скрипт создаёт каталог результатов в той же директории, где он находится. Имя каталога содержит имя хоста, время и PID скрипта, чтобы избежать смешивания доказательств при повторных запусках в одну секунду.
nginx_check_<имя_хоста>_<время>_<PID>/
summary.txt
summary.json
raw/
host_info.txt
process_info.txt
service_info.txt
package_info.txt
nginx_paths.txt
instances/
instance_01/
nginx_invocation.txt
nginx_version.txt
nginx_build.txt
nginx_config_dump.txt
risky_config_matches.txt
instance_02/
...
| Файл или каталог | Описание |
|---|---|
summary.txt | Сводка на китайском, удобная для просмотра и передачи |
summary.json | Структурированный результат для последующей пакетной обработки |
raw/ | Вывод сырых команд и файлы доказательств |
raw/instances/instance_XX/ | Отдельные версии, конфигурации и доказательства рисков для каждого экземпляра |
Сводка содержит следующие поля:
| Поле | Описание |
|---|---|
Количество экземпляров | Количество найденных и проверенных экземпляров Nginx / OpenResty / Tengine на хосте |
Размер конфигурации | Размер файла с экспортированной конфигурацией (nginx -T) |
Количество просканированных строк | Число строк вывода конфигурации, обработанных скриптом |
Количество найденных опасных конфигураций | Число срабатываний по опасным правилам rewrite |
Сводка доказательств | Предварительный просмотр доказательств для наиболее рискованного экземпляра; полные доказательства — в соответствующем каталоге экземпляра |
Если конфигурация Nginx велика, скрипт не выводит её полностью на консоль; полная активная конфигурация сохраняется в файл nginx_config_dump.txt в каталоге соответствующего экземпляра. Если размер экспортированного файла превышает 10 МБ, скрипт продолжит автоматическое сканирование и предложит провести выборочную ручную проверку на основе raw/.
Если на сервере обнаружено несколько исполняемых файлов-кандидатов (nginx, openresty, tengine), скрипт проверяет каждый по отдельности и формирует подробную информацию по экземплярам.
Заключение в общей сводке берётся по самому рискованному экземпляру. Общий приоритет консервативен:
Уязвим с опасной конфигурациейТребует ручной проверкиУязвим без опасной конфигурацииНе уязвимNginx не установленПри этом Требует ручной проверки стоит выше Уязвим без опасной конфигурации, что означает наличие неподтверждённого экземпляра, требующего дальнейшей проверки, а не подтверждение наличия опасной конфигурации.
| Заключение | Значение |
|---|---|
Nginx не установлен | Не найдена команда, процесс или служба Nginx / OpenResty / Tengine |
Не уязвим | Чётко указана исправленная версия, опасные конфигурации не обнаружены |
Уязвим без опасной конфигурации | Версия предположительно уязвима, но опасных конфигураций rewrite не найдено |
Уязвим с опасной конфигурацией | Версия предположительно уязвима или требует проверки для производных, и найдена опасная конфигурация rewrite |
Требует ручной проверки | Версия неизвестна, производная сборка, не удалось собрать конфигурацию, недостаточно прав или доказательств |
| Продукт | Определение версии |
|---|---|
NGINX 1.31.0+ | Исправлено, скрипт показывает Исправлено (mainline) |
NGINX 1.30.1+ | Исправлено, скрипт показывает Исправлено (stable) |
NGINX 0.6.27-1.30.0 | Предположительно уязвима |
| OpenResty / Tengine | Можно собрать версию и конфигурацию, но влияние версии по умолчанию требует ручной проверки |
Дистрибутивы могут иметь старую версию, в которую уже портировано исправление. При наличии подтверждения от вендора можно провести ручную проверку с помощью summary.txt и информации о пакете.
location, server, if на комбинации rewrite/if/set.$1, $2) в строках замены rewrite, содержащих ?.nginx -T не может полностью экспортировать конфигурацию, скрипт не считает систему безопасной.