
Escanea tu configuración de NGINX para determinar si está afectada por CVE-2026-42945.
Escáner estático para archivos de configuración de NGINX que detecta el patrón rewrite/set asociado con CVE-2026-42945.
El escáner analiza configuraciones de NGINX con crossplane, recorre los bloques location e imprime cada ubicación que parezca afectada en este formato:
/<path-to>/xxx.conf:<line-number> -> location XXXXX
Ejemplo:
/path/to/nginx.conf:39 -> location ~ ^/api/(.*)$
Referencia: CVE-2026-42945-POC.
Las dependencias se gestionan con uv en pyproject.toml y se fijan en uv.lock. La única dependencia en tiempo de ejecución es crossplane.
Desde la raíz del repositorio:
uv sync
También puedes omitir un paso de configuración por separado y dejar que uv run cree el entorno en el primer uso.
Escanea un archivo de configuración:
uv run ./scan.py /etc/nginx/nginx.conf
Escanea un directorio recursivamente:
uv run ./scan.py -r /etc/nginx
Escanea recursivamente desde el directorio actual los archivos *.conf:
uv run ./scan.py -r './*.conf'
Encierra los globs entre comillas cuando quieras que el escáner los expanda recursivamente. Si tu shell expande ./*.conf primero, el escáner solo recibe los archivos que coinciden con el shell.
Escanea solo los archivos proporcionados y no sigas las directivas include:
uv run ./scan.py --single ./site.conf
Muestra las advertencias del analizador, incluidos los archivos include faltantes:
uv run ./scan.py -v -r /etc/nginx
Hay una implementación en Go con el mismo formato de salida y los mismos códigos de salida disponible en go/. Utiliza nginx-go-crossplane para analizar la configuración de NGINX y pflag para los flags de CLI. Requiere Go 1.23 o superior.
Ejecútalo con go run:
cd go
go run . -r ../tests/fixtures
Cuando hay hallazgos, el escáner sale con el código 1. go run imprimirá una línea adicional exit status 1 en ese caso; compila el binario cuando quieras solo la salida del escáner.
Compila un binario independiente:
cd go
go build -o cve-2026-42945-scan-go .
./cve-2026-42945-scan-go -r ../tests/fixtures
El patrón de configuración de riesgo es un location que contiene:
rewrite cuyo reemplazo contiene un ? sin escaparlast, break, redirect o permanentset posterior que copia una captura de expresión regular como $1, ${1}, $name o ${name}Ejemplo de patrón vulnerable:
location ~ ^/api/(.*)$ {
rewrite ^/api/(.*)$ /internal?migrated=true;
set $original_endpoint $1;
}
El escáner informa de la línea del location, no de la de rewrite o set, porque la ubicación es el bloque accionable que se debe inspeccionar y corregir.
El directorio tests/fixtures/ contiene configuraciones pequeñas de NGINX que se pueden usar como ejemplos:
Ejecuta el escáner contra todos los fixtures de ejemplo:
uv run ./scan.py -r tests/fixtures
Hallazgos 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/(.*)$
Si se encuentran ubicaciones afectadas, cada hallazgo se imprime en su propia línea:
/absolute/path/to/file.conf:30 -> location ~ ^/aaaa/dddd/(.*)$
/absolute/path/to/nginx.conf:39 -> location ~ ^/api/(.*)$
La ausencia de salida significa que no se encontró ninguna ubicación afectada en la configuración analizada.
Este es un escáner estático de configuración. No:
Trata los hallazgos como ubicaciones que necesitan revisión y remediación. Un host solo está realmente afectado cuando están presentes tanto el rango de versiones vulnerable de NGINX como el patrón de configuración de riesgo.
Ejecuta la suite de pruebas:
uv run python -m unittest discover -s tests -v
Ejecuta la suite de pruebas de Go:
cd go
go test ./...
Ejecuta la verificación de sintaxis:
uv run python -m py_compile scan.py
Ejecuta contra la configuración del POC incluido:
uv run ./scan.py CVE-2026-42945-POC/env/nginx.conf
Salida esperada:
/absolute/path/to/CVE-2026-42945-POC/env/nginx.conf:39 -> location ~ ^/api/(.*)$
| Fixture | Resultado esperado |
|---|
tests/fixtures/vulnerable.conf | informa de un hallazgo de captura posicional |
tests/fixtures/named_capture.conf | informa de un hallazgo de captura con nombre |
tests/fixtures/missing_include_still_scans.conf | informa de un hallazgo aunque falte un include |
tests/fixtures/safe_break_flag.conf | sin hallazgo porque el rewrite usa break |
tests/fixtures/safe_no_capture.conf | sin hallazgo porque no hay ninguna captura disponible |