
Проверьте вашу конфигурацию NGINX, чтобы определить, затронута ли она уязвимостью CVE-2026-42945.
Статический сканер для конфигурационных файлов NGINX, который обнаруживает шаблон rewrite/set, связанный с CVE-2026-42945.
Сканер обрабатывает конфиги NGINX с помощью crossplane, обходит блоки location и выводит каждый потенциально уязвимый location в следующем формате:
/<path-to>/xxx.conf:<line-number> -> location XXXXX
Пример:
/path/to/nginx.conf:39 -> location ~ ^/api/(.*)$
Ссылка: CVE-2026-42945-POC.
Зависимости управляются с помощью uv в pyproject.toml и закреплены в uv.lock.
Единственная зависимость времени выполнения — .
crossplaneИз корня репозитория:
uv sync
Вы также можете пропустить отдельный шаг настройки и позволить uv run создать окружение при первом использовании.
Сканирование одного конфигурационного файла:
uv run ./scan.py /etc/nginx/nginx.conf
Рекурсивное сканирование директории:
uv run ./scan.py -r /etc/nginx
Рекурсивное сканирование из текущей директории для файлов *.conf:
uv run ./scan.py -r './*.conf'
Заключайте glob-шаблоны в кавычки, если хотите, чтобы сканер разворачивал их рекурсивно. Если ваша оболочка сначала раскроет ./*.conf, сканер получит только файлы, совпадающие с шаблоном в оболочке.
Сканирование только указанных файлов без обработки директив include:
uv run ./scan.py --single ./site.conf
Показать предупреждения парсера, включая отсутствующие файлы include:
uv run ./scan.py -v -r /etc/nginx
Реализация на Go с тем же форматом вывода и кодами завершения доступна в папке go/. Она использует nginx-go-crossplane для парсинга конфигов NGINX и pflag для флагов командной строки. Требуется Go 1.23 или новее.
Запуск с помощью go run:
cd go
go run . -r ../tests/fixtures
Когда обнаружены опасные места, сканер завершается с кодом 1. go run выведет дополнительную строку exit status 1 в таком случае; соберите бинарный файл, если нужен только вывод сканера.
Сборка автономного бинарного файла:
cd go
go build -o cve-2026-42945-scan-go .
./cve-2026-42945-scan-go -r ../tests/fixtures
Опасный шаблон конфигурации — это location, который содержит:
rewrite, в замене которой присутствует неэкранированный ?last, break, redirect или permanent)set, копирующую захват регулярного выражения, например $1, ${1}, $name или ${name}Пример уязвимого шаблона:
location ~ ^/api/(.*)$ {
rewrite ^/api/(.*)$ /internal?migrated=true;
set $original_endpoint $1;
}
Сканер сообщает о строке location, а не о строке rewrite или set, поскольку именно location является блоком, который нужно проверить и исправить.
Директория tests/fixtures/ содержит небольшие конфиги NGINX, которые можно использовать в качестве примеров:
| Фикстура | Ожидаемый результат |
|---|---|
tests/fixtures/vulnerable.conf | сообщает о находке с позиционным захватом |
tests/fixtures/named_capture.conf | сообщает о находке с именованным захватом |
tests/fixtures/missing_include_still_scans.conf | сообщает о находке, даже если отсутствует include |
tests/fixtures/safe_break_flag.conf | находок нет, так как rewrite использует break |
tests/fixtures/safe_no_capture.conf | находок нет, так как захват недоступен |
Запуск сканера на всех примерах фикстур:
uv run ./scan.py -r tests/fixtures
Ожидаемые находки:
/absolute/path/to/tests/fixtures/missing_include_still_scans.conf:6 -> location ~ ^/partial/(.*)$
/absolute/path/to/tests/fixtures/named_capture.conf:2 -> location /users
/absolute/path/to/tests/fixtures/vulnerable.conf:2 -> location ~ ^/api/(.*)$
Если найдены затронутые location, каждый результат выводится на отдельной строке:
/absolute/path/to/file.conf:30 -> location ~ ^/aaaa/dddd/(.*)$
/absolute/path/to/nginx.conf:39 -> location ~ ^/api/(.*)$
Отсутствие вывода означает, что в проанализированной конфигурации не найдено ни одного затронутого location.
Это статический сканер конфигурации. Он не выполняет:
Относитесь к находкам как к местам, требующим проверки и устранения. Хост считается реально затронутым только при одновременном наличии уязвимого диапазона версий NGINX и опасного шаблона конфигурации.
Запуск набора тестов:
uv run python -m unittest discover -s tests -v
Запуск тестов на Go:
cd go
go test ./...
Проверка синтаксиса:
uv run python -m py_compile scan.py
Запуск на прилагаемой конфигурации POC:
uv run ./scan.py CVE-2026-42945-POC/env/nginx.conf
Ожидаемый результат:
/absolute/path/to/CVE-2026-42945-POC/env/nginx.conf:39 -> location ~ ^/api/(.*)$