
Analise sua configuração do NGINX para determinar se ela é afetada pelo CVE-2026-42945.
Scanner estático para arquivos de configuração do NGINX que detecta o padrão rewrite/set associado ao CVE‑2026‑42945.
O scanner interpreta configurações do NGINX usando crossplane, percorre os blocos location e imprime cada localização que pareça afetada, no seguinte formato:
/<caminho>/xxx.conf:<número‑da‑linha> -> location XXXXX
Exemplo:
/path/to/nginx.conf:39 -> location ~ ^/api/(.*)$
Referência: CVE‑2026‑42945‑POC.
As dependências são gerenciadas com uv em pyproject.toml e travadas em uv.lock. A única dependência em tempo de execução é .
crossplaneA partir da raiz do repositório:
uv sync
Você também pode pular a etapa de configuração separada e deixar que uv run crie o ambiente na primeira execução.
Escaneie um único arquivo de configuração:
uv run ./scan.py /etc/nginx/nginx.conf
Escaneie um diretório recursivamente:
uv run ./scan.py -r /etc/nginx
Escaneie recursivamente a partir do diretório atual em busca de arquivos *.conf:
uv run ./scan.py -r './*.conf'
Coloque os globs entre aspas quando desejar que o scanner os expanda recursivamente. Se o seu shell expandir ./*.conf primeiro, o scanner receberá apenas os arquivos que o shell encontrou.
Escaneie apenas os arquivos fornecidos e não siga as diretivas include:
uv run ./scan.py --single ./site.conf
Mostre os avisos do parser, incluindo arquivos de include ausentes:
uv run ./scan.py -v -r /etc/nginx
Uma implementação em Go com o mesmo formato de saída e códigos de saída está disponível em go/. Ela utiliza nginx‑go‑crossplane para análise de configurações do NGINX e pflag para os flags da CLI. Requer Go 1.23 ou superior.
Execute‑a com go run:
cd go
go run . -r ../tests/fixtures
Quando houver achados, o scanner sairá com o código 1. O go run imprimirá uma linha extra exit status 1 nesse caso; compile o binário quando quiser apenas a saída do scanner.
Compile um binário autônomo:
cd go
go build -o cve-2026-42945-scan-go .
./cve-2026-42945-scan-go -r ../tests/fixtures
O padrão de configuração arriscado é um bloco location que contém:
rewrite cuja substituição contém um ? não escapadolast, break, redirect ou permanentset posterior que copia uma captura de regex como $1, ${1}, $name ou ${name}Exemplo de padrão vulnerável:
location ~ ^/api/(.*)$ {
rewrite ^/api/(.*)$ /internal?migrated=true;
set $original_endpoint $1;
}
O scanner informa a linha do location, não a linha do rewrite ou set, porque a location é o bloco acionável para inspecionar e corrigir.
O diretório tests/fixtures/ contém pequenas configurações do NGINX que podem ser usadas como exemplos:
| Fixture | Resultado esperado |
|---|---|
tests/fixtures/vulnerable.conf | relata um achado de captura posicional |
tests/fixtures/named_capture.conf | relata um achado de captura nomeada |
tests/fixtures/missing_include_still_scans.conf | relata um achado mesmo com um include ausente |
tests/fixtures/safe_break_flag.conf | nenhum achado porque o rewrite usa break |
tests/fixtures/safe_no_capture.conf | nenhum achado porque não há captura disponível |
Execute o scanner contra todas as fixtures de exemplo:
uv run ./scan.py -r tests/fixtures
Achados esperados:
/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/(.*)$
Se forem encontradas localizações afetadas, cada achado é impresso em sua própria linha:
/absolute/path/to/file.conf:30 -> location ~ ^/aaaa/dddd/(.*)$
/absolute/path/to/nginx.conf:39 -> location ~ ^/api/(.*)$
Nenhuma saída significa que nenhuma localização afetada foi encontrada na configuração analisada.
Este é um scanner estático de configuração. Ele não:
Trate os achados como localizações que precisam de revisão e correção. Um host só é realmente afetado quando tanto a faixa de versão vulnerável do NGINX quanto o padrão de configuração arriscado estão presentes.
Execute a suíte de testes:
uv run python -m unittest discover -s tests -v
Execute a suíte de testes em Go:
cd go
go test ./...
Execute a verificação de sintaxe:
uv run python -m py_compile scan.py
Execute contra a configuração POC incluída:
uv run ./scan.py CVE-2026-42945-POC/env/nginx.conf
Saída esperada:
/absolute/path/to/CVE-2026-42945-POC/env/nginx.conf:39 -> location ~ ^/api/(.*)$