
Сканер только для обнаружения CVE-2026-42945 (NGINX Rift) — переполнение кучи в ngx_http_rewrite_module. Определение версии + анализ паттернов nginx.conf. Только стандартная библиотека Python 3, без сетевых вызовов.
| Проверка | Метод |
|---|
| Версия | nginx -V, dpkg/rpm/apk, теги образов Dockerfile/compose |
| Паттерн конфигурации | Разбор nginx.conf с учётом фигурных скобок + всех подключаемых через include файлов |
| Издание | Уязвимые | Исправленные |
|---|---|---|
| NGINX OSS | 0.6.27 – 1.30.1 | 1.31.0+ (или пропатченная 1.30.1) |
| NGINX Plus | R32 до R32P6 | R32P6+ |
| NGINX Plus | R36 до R36P4 | R36P4+ |
| NGINX Plus | R37+ | Не затронута |
Примечание по 1.30.1: пропатченная стабильная сборка 1.30.1 сообщает ту же строку версии, что и уязвимая, поэтому сканер относит любую 1.30.1 к
POTENTIALLY_VULNERABLE(exit 1, консервативно). Проверьте журнал изменений пакета / бэкпорт из бюллетеня, чтобы подтвердить установку патча.
Блок области (scope) помечается, когда выполняются все три условия:
rewrite, if или set использует ссылку на безымянную группу захвата PCRE ($1–$9, включая форму с фигурными скобками ${1}–${9}).? (для rewrite/set аргумент с регулярным выражением исключается — ? там является квантификатором PCRE; условия if проверяются консервативно).rewrite/if/set (подключаемые через include файлы встраиваются в объемлющую область, поэтому пары, пересекающие границу include, обнаруживаются).# Clone and run
git clone https://github.com/simota/nginx-rift-scanner.git
cd nginx-rift-scanner
# Scan local nginx (binary in PATH, config at /etc/nginx/nginx.conf)
python3 scripts/scan_nginx_rift.py
# Custom paths
python3 scripts/scan_nginx_rift.py \
--nginx-binary /usr/sbin/nginx \
--config /etc/nginx/nginx.conf \
--prefix /etc/nginx \
--scan-dir /app
# JSON output (CI / SIEM)
python3 scripts/scan_nginx_rift.py --json
# Validate with included fixtures
python3 scripts/scan_nginx_rift.py --config fixtures/vulnerable.nginx.conf
python3 scripts/scan_nginx_rift.py --config fixtures/safe.nginx.conf
Коды выхода: 0 = чисто, 1 = обнаружена уязвимая / потенциально уязвимая версия или сработал паттерн конфигурации.
| Флаг | По умолчанию | Описание |
|---|---|---|
--nginx-binary PATH | nginx | Путь к исполняемому файлу nginx |
--config PATH | /etc/nginx/nginx.conf | Корневой конфиг nginx для сканирования |
--prefix PATH | каталог --config | Префикс конфигурации nginx, используемый для разрешения относительных путей include (nginx разрешает их относительно префикса, а не каталога включаемого файла) |
--scan-dir PATH | . | Каталог для поиска Dockerfile/файлов compose |
--json | — | Вывести JSON-отчёт в stdout |
Обновление (предпочтительно):
Обходной путь — замените безымянные группы захвата именованными в каждой директиве rewrite/if/set, которая также содержит ?:
# Vulnerable
rewrite ^/api/(\w+)$ /new-api?path=$1 last;
# Safe
rewrite ^/api/(?<action>\w+)$ /new-api?path=$action last;
Результаты проверки конфигурации являются эвристическими. Помеченная директива не гарантирует эксплуатируемость — символ ? может находиться не в пути построения URI, или ссылка на группу захвата может не взаимодействовать с переполняемым выделением памяти. Каждое обнаружение должно быть проверено человеком перед расстановкой приоритетов по устранению.
nginx (необязательно — при отсутствии проверка версии пропускается)| Файл | Ожидаемый результат |
|---|---|
fixtures/vulnerable.nginx.conf | 3 обнаружения в конфигурации, exit 1 |
fixtures/safe.nginx.conf | 0 обнаружений в конфигурации, exit 0 |
python3 -m unittest discover -s tests -v