
Scanner apenas de deteção para CVE-2026-42945 (NGINX Rift), um estouro de heap no ngx_http_rewrite_module. Deteção de versão + análise de padrões do nginx.conf. Apenas stdlib do Python 3, sem chamadas de rede.
| Verificação | Como |
|---|
| Versão | nginx -V, dpkg/rpm/apk, tags de imagem Dockerfile/compose |
| Padrão de configuração | Análise ciente de chaves do nginx.conf + todos os arquivos include |
| Edição | Vulnerável | Corrigido |
|---|---|---|
| NGINX OSS | 0.6.27 – 1.30.1 | 1.31.0+ (ou 1.30.1 com patch) |
| NGINX Plus | R32 antes de R32P6 | R32P6+ |
| NGINX Plus | R36 antes de R36P4 | R36P4+ |
| NGINX Plus | R37+ | Não afetado |
Nota sobre 1.30.1: a versão estável 1.30.1 corrigida reporta a mesma string de versão que a vulnerável, portanto o scanner classifica qualquer 1.30.1 como
POTENCIALMENTE_VULNERÁVEL(código de saída 1, conservador). Verifique o changelog do pacote / backport do advisory para confirmar que o patch foi aplicado.
Um bloco de escopo é sinalizado quando todas as três condições são verdadeiras:
rewrite, if ou set usa uma referência de captura PCRE sem nome
($1–$9, incluindo a forma com chaves ${1}–${9}).?
(para rewrite/set o argumento do padrão regex é excluído — um ? ali
é um quantificador PCRE; condições if são verificadas de forma conservadora).rewrite/if/set segue no mesmo escopo
(includes são inseridos no escopo que os inclui, portanto pares que abrangem um
limite de include são detectados).# Clone e execute
git clone https://github.com/simota/nginx-rift-scanner.git
cd nginx-rift-scanner
# Verifique o nginx local (binário no PATH, config em /etc/nginx/nginx.conf)
python3 scripts/scan_nginx_rift.py
# Caminhos personalizados
python3 scripts/scan_nginx_rift.py \
--nginx-binary /usr/sbin/nginx \
--config /etc/nginx/nginx.conf \
--prefix /etc/nginx \
--scan-dir /app
# Saída JSON (CI / SIEM)
python3 scripts/scan_nginx_rift.py --json
# Valide com fixtures incluídas
python3 scripts/scan_nginx_rift.py --config fixtures/vulnerable.nginx.conf
python3 scripts/scan_nginx_rift.py --config fixtures/safe.nginx.conf
Códigos de saída: 0 = limpo, 1 = versão VULNERÁVEL / POTENCIALMENTE_VULNERÁVEL
ou padrão de configuração sinalizado.
| Flag | Padrão | Descrição |
|---|---|---|
--nginx-binary PATH | nginx | Caminho para o executável nginx |
--config PATH | /etc/nginx/nginx.conf | Configuração raiz do nginx a ser verificada |
--prefix PATH | diretório de --config | Prefixo de configuração do nginx usado para resolver caminhos relativos de include (o nginx os resolve em relação ao prefixo, não ao diretório do arquivo que inclui) |
--scan-dir PATH | . | Diretório para buscar arquivos Dockerfile/compose |
--json | — | Emitir relatório JSON para stdout |
Atualização (preferida):
Solução alternativa — substituir capturas sem nome por capturas nomeadas em toda
diretiva rewrite/if/set que também contenha ?:
# Vulnerável
rewrite ^/api/(\w+)$ /new-api?path=$1 last;
# Seguro
rewrite ^/api/(?<action>\w+)$ /new-api?path=$action last;
As descobertas de configuração são heurísticas. Uma diretiva sinalizada não
garante explorabilidade — o ? pode não estar no caminho de construção da URI, ou
a referência de captura pode não interagir com a alocação que causa o estouro. Cada
descoberta deve ser revisada por um humano antes de priorizar a remediação.
nginx (opcional — verificação de versão ignorada se ausente)| Arquivo | Resultado esperado |
|---|---|
fixtures/vulnerable.nginx.conf | 3 descobertas de configuração, saída 1 |
fixtures/safe.nginx.conf | 0 descobertas de configuração, saída 0 |
python3 -m unittest discover -s tests -v