
Escáner solo de detección para CVE-2026-42945 (NGINX Rift), un desbordamiento de montón en ngx_http_rewrite_module. Detección de versión + análisis de patrones de nginx.conf. Solo con la biblioteca estándar de Python 3, sin llamadas de red.
| Comprobación | Cómo |
|---|
| Versión | nginx -V, dpkg/rpm/apk, etiquetas de imagen de Dockerfile/compose |
| Patrón de configuración | Análisis sensible a llaves de nginx.conf + todos los archivos included |
| Edición | Vulnerable | Corregido |
|---|---|---|
| NGINX OSS | 0.6.27 – 1.30.1 | 1.31.0+ (o 1.30.1 parcheado) |
| NGINX Plus | R32 anterior a R32P6 | R32P6+ |
| NGINX Plus | R36 anterior a R36P4 | R36P4+ |
| NGINX Plus | R37+ | No afectado |
Nota sobre 1.30.1: la compilación estable parcheada 1.30.1 reporta la misma cadena de versión que la vulnerable, por lo que el escáner clasifica cualquier 1.30.1 como
POTENTIALLY_VULNERABLE(código de salida 1, conservador). Verifique el registro de cambios del paquete / backport del aviso para confirmar que el parche se aplicó.
Un bloque de ámbito se marca cuando se cumplen las tres condiciones:
rewrite, if o set utiliza una referencia de captura PCRE sin nombre
($1–$9, incluida la forma de llaves ${1}–${9}).?
(para rewrite/set el argumento de patrón regex queda excluido — un ? ahí
es un cuantificador PCRE; las condiciones if se escanean de forma conservadora).rewrite/if/set sigue en el mismo ámbito
(los includes se insertan en el ámbito contenedor, por lo que se detectan pares
que cruzan un límite de 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
Códigos de salida: 0 = limpio, 1 = versión VULNERABLE / POTENCIALMENTE_VULNERABLE
o patrón de configuración marcado.
| Bandera | Predeterminado | Descripción |
|---|---|---|
--nginx-binary PATH | nginx | Ruta al ejecutable de nginx |
--config PATH | /etc/nginx/nginx.conf | Configuración raíz de nginx a escanear |
--prefix PATH | directorio de --config | Prefijo de configuración de nginx usado para resolver rutas de include relativas (nginx las resuelve contra el prefijo, no contra el directorio del archivo que incluye) |
--scan-dir PATH | . | Directorio para buscar archivos Dockerfile/compose |
--json | — | Emitir informe JSON a stdout |
Actualizar (preferido):
Solución alternativa — reemplace las capturas sin nombre por capturas con nombre en cada
directiva rewrite/if/set que también contenga ?:
# Vulnerable
rewrite ^/api/(\w+)$ /new-api?path=$1 last;
# Safe
rewrite ^/api/(?<action>\w+)$ /new-api?path=$action last;
Los hallazgos de configuración son heurísticos. Una directiva marcada no garantiza
explotabilidad — el ? puede no estar en la ruta de construcción de URI, o la referencia
de captura puede no interactuar con la asignación que se desborda. Cada hallazgo debe ser
revisado por un humano antes de priorizar la remediación.
nginx (opcional — la comprobación de versión se omite si no está presente)| Archivo | Resultado esperado |
|---|---|
fixtures/vulnerable.nginx.conf | 3 hallazgos de configuración, salida 1 |
fixtures/safe.nginx.conf | 0 hallazgos de configuración, salida 0 |
python3 -m unittest discover -s tests -v