
Gixy-Next: Escáner de seguridad de configuración y verificador de rendimiento de NGINX
# Gixy-Next: Escáner de seguridad para configuraciones de NGINX para auditorías de seguridad
## Descripción general
<a href="https://gixy.io/"><img width="192" height="192" alt="Logotipo de la mascota de Gixy-Next" style="float: right;" align="right" src="https://assets.kitploit.com/production/public/readmes/10695/943d5c952685014f6540ef9cb02fe9d8cd895479a41a8f78786b5f2997207ec0.jpg" /></a>
Gixy-Next (Gixy) es un escáner de seguridad y herramienta de endurecimiento para configuraciones de NGINX de código abierto que analiza estáticamente tu nginx.conf para detectar configuraciones de seguridad incorrectas, carencias de endurecimiento y problemas de rendimiento comunes antes de que lleguen a producción. Es un fork mantenido activamente de [Gixy](https://github.com/yandex/gixy) de Yandex. El código fuente de Gixy-Next está [disponible en GitHub](https://github.com/megamansec/gixy-next).
Gixy-Next también se puede ejecutar en el navegador en [esta página](https://gixy.io/scanner/). No se necesita descargar nada; puedes escanear tus configuraciones en el sitio web (localmente, usando WebAssembly).
### Inicio rápido
Gixy-Next (la CLI `gixy` o `gixy-next`) se distribuye en [PyPI](https://pypi.python.org/pypi/Gixy-Next). Puedes instalarlo con pip o uv:
```shell-session
# pip
pip3 install gixy-next
# uv
uv pip install gixy-next
```
A continuación puedes ejecutarlo:
```shell-session
# gixy defaults to reading /etc/nginx/nginx.conf
gixy
# But you can also specify a path to the configuration
gixy /opt/nginx.conf
```
También puedes exportar tu configuración de NGINX a un único archivo de volcado (consulta [nginx -T Live Configuration Dump](https://gixy.io/nginx-config-dump)):
```shell-session
# Dumps the full NGINX configuration into a single file (including all includes)
nginx -T > ./nginx-dump.conf
# Scan the dump elsewhere (or via stdin):
gixy ./nginx-dump.conf
# or
cat ./nginx-dump.conf | gixy -
```
### Escáner basado en web
En lugar de descargar y ejecutar Gixy-Next localmente, puedes usar [esta página web](https://gixy.io/scanner/) y escanear una configuración desde tu navegador web (localmente, usando WebAssembly).
### Escanear con Docker
Gixy-Next está disponible como imagen de Docker desde [Docker Hub](https://hub.docker.com/r/megamansec/gixy-next/) o [GitHub Registry](https://github.com/MegaManSec/Gixy-Next/pkgs/container/gixy-next).
Escanea un archivo de configuración local montándolo en el contenedor:
```shell-session
# Use Github Registry
docker run --pull=always --rm -v "$PWD/nginx.conf:/nginx.conf:ro" ghcr.io/megamansec/gixy-next /nginx.conf
# Or Docker Hub
docker run --pull=always --rm -v "$PWD/nginx.conf:/nginx.conf:ro" megamansec/gixy-next /nginx.conf
```
Analizar un volcado de configuración activa de NGINX:
```shell-session
# Dumps the full NGINX configuration into a single file (including all includes)
nginx -T > ./nginx-dump.conf
# Use Github Registry
docker run --pull=always --rm -v "$PWD/nginx-dump.conf:/nginx-dump.conf:ro" ghcr.io/megamansec/gixy-next /nginx-dump.conf
# Or Docker Hub
docker run --pull=always --rm -v "$PWD/nginx-dump.conf:/nginx-dump.conf:ro" megamansec/gixy-next /nginx-dump.conf
```
Escanear desde stdin:
```shell-session
# Use Github Registry
nginx -T | docker run --pull=always --rm -i ghcr.io/megamansec/gixy-next gixy-next -
# Or Docker Hub
nginx -T | docker run --pull=always --rm -i megamansec/gixy-next gixy-next -
```
## Qué puede hacer
Gixy-Next puede detectar una amplia gama de configuraciones incorrectas de seguridad y rendimiento de NGINX en `nginx.conf` y en los archivos de configuración incluidos. Se admiten los siguientes plugins:
- [[add_header_content_type] Configuración de Content-Type mediante add_header](https://gixy.io/plugins/add_header_content_type/)
- [[add_header_multiline] Cabeceras de respuesta multilínea](https://gixy.io/plugins/add_header_multiline/)
- [[add_header_redefinition] Redefinición de cabeceras de respuesta mediante la directiva "add_header"](https://gixy.io/plugins/add_header_redefinition/)
- [[alias_traversal] Path traversal mediante alias mal configurado](https://gixy.io/plugins/alias_traversal/)
- [[allow_without_deny] Allow especificado sin deny](https://gixy.io/plugins/allow_without_deny/)
- [[default_server_flag] Falta la marca default_server](https://gixy.io/plugins/default_server_flag/)
- [[error_log_off] `error_log` establecido en `off`](https://gixy.io/plugins/error_log_off/)
- [[filesystem_root_exposure] Raíz del sistema de archivos usada como document root](https://gixy.io/plugins/filesystem_root_exposure/)
- [[hash_without_default] Falta el valor por defecto en los bloques hash](https://gixy.io/plugins/hash_without_default/)
- [[host_spoofing] Falsificación de la cabecera Host de la petición](https://gixy.io/plugins/host_spoofing/)
- [[http2_misdirected_request] Falta la protección contra peticiones mal dirigidas de HTTP/2](https://gixy.io/plugins/http2_misdirected_request/)
- [[http_splitting] HTTP Response Splitting](https://gixy.io/plugins/http_splitting/)
- [[if_is_evil] If is evil cuando se usa en el contexto location](https://gixy.io/plugins/if_is_evil/)
- [[invalid_regex] Grupos de captura de regex no válidos](https://gixy.io/plugins/invalid_regex/)
- [[low_keepalive_requests] `keepalive_requests` bajo](https://gixy.io/plugins/low_keepalive_requests/)
- [[missing_worker_processes] Falta `worker_processes`](https://gixy.io/plugins/missing_worker_processes/)
- [[mixed_case_variable] Referencias a variables con mayúsculas y minúsculas mezcladas](https://gixy.io/plugins/mixed_case_variable/)
- [[origins] Problemas con la validación de las cabeceras referer/origin](https://gixy.io/plugins/origins/)
- [[overlapping_captures] Capturas superpuestas en el contexto de redirección/args de rewrite](https://gixy.io/plugins/overlapping_captures/)
- [[proxy_buffering_off] Deshabilitar `proxy_buffering`](https://gixy.io/plugins/proxy_buffering_off/)
- [[proxy_pass_normalized] `proxy_pass` puede enviar una ruta no deseada al upstream](https://gixy.io/plugins/proxy_pass_normalized/)
- [[proxy_set_header_redefinition] Redefinición de cabeceras de petición proxificadas mediante la directiva "proxy_set_header"](https://gixy.io/plugins/proxy_set_header_redefinition/)
- [[quic_bpf_reuseport] Conexiones QUIC descartadas silenciosamente tras una recarga](https://gixy.io/plugins/quic_bpf_reuseport/)
- [[regex_redos] Denegación de servicio por expresión regular (ReDoS)](https://gixy.io/plugins/regex_redos/)
- [[resolver_external] Uso de servidores de nombres DNS externos](https://gixy.io/plugins/resolver_external/)
- [[return_bypasses_allow_deny] La directiva return omite las restricciones allow/deny](https://gixy.io/plugins/return_bypasses_allow_deny/)
- [[ssl_ecdh_curve] Los grupos post-cuánticos impiden que NGINX arranque en versiones antiguas de OpenSSL](https://gixy.io/plugins/ssl_ecdh_curve/)
- [[ssl_stapling_letsencrypt] El stapling OCSP no hace nada para un certificado de Let's Encrypt](https://gixy.io/plugins/ssl_stapling_letsencrypt/)
- [[ssl_stapling_without_resolver] El stapling OCSP falla silenciosamente sin un resolver](https://gixy.io/plugins/ssl_stapling_without_resolver/)
- [[ssrf] Server Side Request Forgery](https://gixy.io/plugins/ssrf/)
- [[stale_dns_cache] Registros DNS en caché desactualizados/obsoletos usados en proxy_pass](https://gixy.io/plugins/stale_dns_cache/)
- [[status_page_exposed] Garantiza que status_page no esté expuesto al mundo](https://gixy.io/plugins/status_page_exposed/)
- [[try_files_is_evil_too] La directiva `try_files` es evil sin open_file_cache](https://gixy.io/plugins/try_files_is_evil_too/)
- [[unanchored_regex] Expresiones regulares sin anclar](https://gixy.io/plugins/unanchored_regex/)
- [[unnamed_groups] Grupos de captura sin nombre en la cadena de consulta de rewrite](https://gixy.io/plugins/unnamed_groups/)
- [[valid_referers] none/blocked en valid_referers](https://gixy.io/plugins/valid_referers/)
- [[version_disclosure] Uso de valores inseguros para server_tokens](https://gixy.io/plugins/version_disclosure/)
- [[worker_rlimit_nofile_vs_connections] `worker_rlimit_nofile` debe ser al menos el doble de `worker_connections`](https://gixy.io/plugins/worker_rlimit_nofile_vs_connections/)
¿Algo no detectado? ¡Abre un [issue](https://github.com/MegaManSec/Gixy-Next/issues) en GitHub indicando qué falta!
## Uso (flags)
`gixy` lee por defecto la configuración de NGINX del sistema desde `/etc/nginx/nginx.conf`. También puedes especificar la ubicación pasándosela a `gixy`:
```shell-session
# Analyze the configuration in /opt/nginx.conf
gixy /opt/nginx.conf
```
Puedes ejecutar un subconjunto específico de comprobaciones con `--tests`:
```shell-session
# Only run these checks
gixy --tests http_splitting,ssrf,version_disclosure
```
O omite algunas comprobaciones ruidosas con `--skips`:
```shell-session
# Run everything except these checks
gixy --skips low_keepalive_requests,worker_rlimit_nofile_vs_connections
```
Para reportar solo problemas de una severidad determinada o superior, utilice el flag compuesto `-l`:
```shell-session
# -l for LOW severity issues and higher, -ll for MEDIUM and higher, and -lll for only HIGH severity issues
gixy -ll
```
Por defecto, la salida de `gixy` tiene color ANSI; se visualiza mejor en una terminal compatible. Puedes usar el flag `--format` (`-f`) con el valor `text` para obtener una salida sin color:
```shell-session
$ gixy -f text
==================== Results ===================
Problem: [http_splitting] Possible HTTP-Splitting vulnerability.
Description: Using variables that can contain "\n" may lead to http injection.
Additional info: https://gixy.io/plugins/http_splitting/
Reason: At least variable "$action" can contain "\n"
Pseudo config:
include /etc/nginx/sites/default.conf;
server {
location ~ /v1/((?<action>[^.]*)\.json)?$ {
add_header X-Action $action;
}
}
==================== Summary ===================
Total issues:
Informational: 0
Low: 0
Medium: 0
High: 1
```
También puedes usar `-f json` para obtener una salida JSON reproducible y legible por máquina:
```shell-session
$ gixy -f json
[{"config":"\nserver {\n\n\tlocation ~ /v1/((?<action>[^.]*)\\.json)?$ {\n\t\tadd_header X-Action $action;\n\t}\n}","description":"Using variables that can contain \"\\n\" or \"\\r\" may lead to http injection.","file":"/etc/nginx/nginx.conf","line":4,"path":"/etc/nginx/nginx.conf","plugin":"http_splitting","reason":"At least variable \"$action\" can contain \"\\n\"","reference":"https://gixy.io/plugins/http_splitting/","severity":"HIGH","summary":"Possible HTTP-Splitting vulnerability."}]
```
También puedes usar `-f sarif` para obtener un registro [SARIF 2.1.0](https://sarifweb.azurewebsites.net/), por ejemplo, para subirlo al escaneo de código de GitHub:
```shell-session
# Write a SARIF report to a file, e.g. for `github/codeql-action/upload-sarif`
gixy -f sarif -o gixy-results.sarif
```
Puedes encontrar más flags de uso pasando `--help` a `gixy`. También puedes encontrar más información en la [Guía de uso](https://gixy.io/usage/).
## Opciones de configuración y de plugins
Algunos plugins exponen opciones que puedes establecer mediante flags de CLI o un archivo de configuración. Puedes leer más sobre ellas en la [Guía de configuración](https://gixy.io/configuration/).
## Gixy-Next para la seguridad y el cumplimiento de NGINX
A diferencia de ejecutar `nginx -t`, que solo comprueba la sintaxis, Gixy-Next analiza realmente tu configuración y detecta instancias no endurecidas y vulnerabilidades.
Con Gixy-Next, puedes realizar una revisión automatizada de la seguridad de la configuración de NGINX que puede ejecutarse localmente en cada cambio, ya sea para auditoría, cumplimiento o pruebas generales, ayudando a producir hallazgos accionables que ayudan a prevenir servidores NGINX inestables/lentos y a reducir el riesgo derivado de directivas inseguras y valores predeterminados no seguros.
## Contribuir
Gixy-Next está mantenido por [Joshua Rogers](https://joshua.hu), ¡pero las contribuciones siempre son bienvenidas! Puedes ayudarnos de diferentes maneras, como:
- Reportando errores.
- Sugiriendo nuevos plugins de detección.
- Mejorando la documentación.
- Corrigiendo, refactorizando, mejorando y escribiendo nuevo código.
Antes de enviar cualquier cambio en pull requests, lee el documento de directrices de contribución, [Contributing to Gixy-Next](https://gixy.io/contributing/).
La página oficial de Gixy-Next es [https://gixy.io/](https://gixy.io/). Cualquier cambio en la documentación de Gixy-Next se reflejará automáticamente en ese sitio web.
El código fuente se puede encontrar en [https://github.com/MegaManSec/Gixy-Next](https://github.com/MegaManSec/Gixy-Next).
## ¿Qué es Gixy? (Antecedentes)
_Gixy_ es un analizador de configuración de NGINX que fue [originalmente](https://github.com/yandex/gixy) desarrollado por Andrew Krasichkov, de Yandex. Se lanzó por primera vez en 2017 y desde entonces ha quedado sin mantenimiento. No es compatible con versiones modernas de Python, contiene numerosos errores y está limitado en su funcionalidad y en su capacidad para detectar configuraciones de NGINX vulnerables. Ejecutar el Gixy original hoy en un sistema moderno dará como resultado el siguiente error:
```text
File "gixy/core/sre_parse/sre_parse.py", line 61, in <module>
"t": SRE_FLAG_TEMPLATE,
^^^^^^^^^^^^^^^^^
NameError: name 'SRE_FLAG_TEMPLATE' is not defined. Did you mean: 'SRE_FLAG_VERBOSE'?
```
Gixy-Next, por lo tanto, es un fork que añade soporte para sistemas modernos, incorpora nuevas comprobaciones, mejoras de rendimiento, sugerencias de endurecimiento (hardening) y soporte para versiones modernas de Python y NGINX.
### ¿Por qué no `gixy-ng`?
Gixy-Next es en realidad un fork de `gixy-ng`, que a su vez era un fork del `gixy` original. Gixy-Next se creó después de que el mantenedor de `gixy-ng` comenzara a producir grandes cantidades de cambios asistidos por IA y código autogenerado que resultaba ser tanto imposible de revisar por su tamaño como defectuoso.
Tras algún tiempo, el mantenedor de `gixy-ng` comenzó a confirmar cambios generados por IA en el código base que introdujeron regresiones evidentes, rompieron el comportamiento crítico de la herramienta (algo que cualquiera que usara la herramienta habría detectado), añadieron artefactos aleatorios de herramientas de IA e introdujeron código que simplemente no hacía lo que se suponía que debía hacer. Lo más importante es que el mantenedor también **añadió publicidad de su negocio a toda la documentación, a toda la salida y a todo el código fuente** de `gixy-ng`.
En otras palabras, el mantenedor de `gixy-ng` tomó el `gixy` original, pidió a la IA que hiciera cambios, introdujo un montón de errores (y otra basura de IA), y luego añadió publicidad al código. También aceptó contribuciones en forma de merge requests, pero eliminó la información del autor (véase [esta](https://joshua.hu/gixy-ng-new-version-gixy-updated-checks#quality-degradation) publicación y [esta](https://joshua.hu/gixy-ng-ai-slop-gixy-next-maintained) publicación).
Gixy-Next se centra en restaurar la calidad, y ha sido probado en batalla con configuraciones de NGINX de casi 100.000 líneas de longitud. Corrige errores y detecciones incorrectas introducidas por los cambios realizados en `gixy-ng`, elimina artefactos y basura de herramientas de IA, y trata de mantener el código base revisable y mantenible. Este fork es para quienes están interesados en el código limpio y la mantenibilidad a largo plazo.