
Gixy-Next: Scanner de Segurança de Configuração NGINX & Verificador de Desempenho
# Gixy-Next: Scanner de Segurança para Configurações NGINX para Auditorias de Segurança
## Visão Geral
<a href="https://gixy.io/"><img width="192" height="192" alt="Gixy-Next Mascot Logo" style="float: right;" align="right" src="https://assets.kitploit.com/production/public/readmes/10695/943d5c952685014f6540ef9cb02fe9d8cd895479a41a8f78786b5f2997207ec0.jpg" /></a>
Gixy-Next (Gixy) é um scanner de segurança e ferramenta de hardening para configurações NGINX de código aberto que analisa estaticamente seu nginx.conf para detectar configurações incorretas de segurança, lacunas de hardening e armadilhas de desempenho comuns antes que cheguem à produção. É um fork ativamente mantido do [Gixy](https://github.com/yandex/gixy) do Yandex. O código-fonte do Gixy-Next está [disponível no GitHub](https://github.com/megamansec/gixy-next).
O Gixy-Next também pode ser executado no navegador [nesta página](https://gixy.io/scanner/). Não é necessário download; você pode escanear suas configurações no site (localmente, usando WebAssembly).
### Início rápido
O Gixy-Next (a CLI `gixy` ou `gixy-next`) é distribuído no [PyPI](https://pypi.python.org/pypi/Gixy-Next). Você pode instalá-lo com pip ou uv:
```shell-session
# pip
pip3 install gixy-next
# uv
uv pip install gixy-next
```
Você pode então executá-lo:
```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
```
Também pode exportar a sua configuração NGINX para um único ficheiro de dump (consulte [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 -
```
### Scanner baseado na web
Em vez de baixar e executar o Gixy-Next localmente, você pode usar [esta página web](https://gixy.io/scanner/) e escanear uma configuração a partir do seu navegador web (localmente, usando WebAssembly).
### Escanear com Docker
O Gixy-Next está disponível como uma imagem Docker no [Docker Hub](https://hub.docker.com/r/megamansec/gixy-next/) ou no [GitHub Registry](https://github.com/MegaManSec/Gixy-Next/pkgs/container/gixy-next).
Escaneie um arquivo de configuração local montando-o no contêiner:
```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
```
Examine um dump da configuração ativa do 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
```
Ler da entrada padrão:
```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 -
```
## O que ele pode fazer
O Gixy-Next pode detectar uma ampla variedade de configurações incorretas de segurança e desempenho do NGINX em `nginx.conf` e nos arquivos de configuração incluídos. Os seguintes plugins são suportados:
- [[add_header_content_type] Definir Content-Type via add_header](https://gixy.io/plugins/add_header_content_type/)
- [[add_header_multiline] Cabeçalhos de resposta multilinha](https://gixy.io/plugins/add_header_multiline/)
- [[add_header_redefinition] Redefinição de cabeçalhos de resposta pela diretiva "add_header"](https://gixy.io/plugins/add_header_redefinition/)
- [[alias_traversal] Path traversal via alias mal configurado](https://gixy.io/plugins/alias_traversal/)
- [[allow_without_deny] Allow especificado sem deny](https://gixy.io/plugins/allow_without_deny/)
- [[default_server_flag] Falta a flag default_server](https://gixy.io/plugins/default_server_flag/)
- [[error_log_off] `error_log` definido como `off`](https://gixy.io/plugins/error_log_off/)
- [[filesystem_root_exposure] Raiz do sistema de arquivos usada como document root](https://gixy.io/plugins/filesystem_root_exposure/)
- [[hash_without_default] Falta o default em blocos hash](https://gixy.io/plugins/hash_without_default/)
- [[host_spoofing] Falsificação do cabeçalho Host da requisição](https://gixy.io/plugins/host_spoofing/)
- [[http2_misdirected_request] Falta a proteção contra requisições mal direcionadas do 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 quando usado no contexto location](https://gixy.io/plugins/if_is_evil/)
- [[invalid_regex] Grupos de captura de regex inválidos](https://gixy.io/plugins/invalid_regex/)
- [[low_keepalive_requests] `keepalive_requests` baixo](https://gixy.io/plugins/low_keepalive_requests/)
- [[missing_worker_processes] Falta `worker_processes`](https://gixy.io/plugins/missing_worker_processes/)
- [[mixed_case_variable] Referências a variáveis com maiúsculas e minúsculas misturadas](https://gixy.io/plugins/mixed_case_variable/)
- [[origins] Problemas com a validação dos cabeçalhos referer/origin](https://gixy.io/plugins/origins/)
- [[overlapping_captures] Capturas sobrepostas no contexto de redirect/args de rewrite](https://gixy.io/plugins/overlapping_captures/)
- [[proxy_buffering_off] Desativação de `proxy_buffering`](https://gixy.io/plugins/proxy_buffering_off/)
- [[proxy_pass_normalized] `proxy_pass` pode enviar um caminho não intencional ao upstream](https://gixy.io/plugins/proxy_pass_normalized/)
- [[proxy_set_header_redefinition] Redefinição de cabeçalhos de requisição proxiados pela diretiva "proxy_set_header"](https://gixy.io/plugins/proxy_set_header_redefinition/)
- [[quic_bpf_reuseport] Conexões QUIC descartadas silenciosamente após reload](https://gixy.io/plugins/quic_bpf_reuseport/)
- [[regex_redos] Negação de serviço por expressão regular (ReDoS)](https://gixy.io/plugins/regex_redos/)
- [[resolver_external] Uso de nameservers DNS externos](https://gixy.io/plugins/resolver_external/)
- [[return_bypasses_allow_deny] A diretiva return contorna as restrições allow/deny](https://gixy.io/plugins/return_bypasses_allow_deny/)
- [[ssl_ecdh_curve] Grupos pós-quânticos impedem o NGINX de iniciar em OpenSSL mais antigos](https://gixy.io/plugins/ssl_ecdh_curve/)
- [[ssl_stapling_letsencrypt] O OCSP stapling não faz nada para um certificado Let's Encrypt](https://gixy.io/plugins/ssl_stapling_letsencrypt/)
- [[ssl_stapling_without_resolver] O OCSP stapling falha silenciosamente sem um resolver](https://gixy.io/plugins/ssl_stapling_without_resolver/)
- [[ssrf] Server Side Request Forgery](https://gixy.io/plugins/ssrf/)
- [[stale_dns_cache] Registros DNS em cache desatualizados/expirados usados em proxy_pass](https://gixy.io/plugins/stale_dns_cache/)
- [[status_page_exposed] Garante que status_page não está exposto ao mundo](https://gixy.io/plugins/status_page_exposed/)
- [[try_files_is_evil_too] A diretiva `try_files` is evil sem open_file_cache](https://gixy.io/plugins/try_files_is_evil_too/)
- [[unanchored_regex] Expressões regulares não ancoradas](https://gixy.io/plugins/unanchored_regex/)
- [[unnamed_groups] Grupos de captura sem nome na query string de rewrite](https://gixy.io/plugins/unnamed_groups/)
- [[valid_referers] none/blocked em 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` deve ser pelo menos o dobro de `worker_connections`](https://gixy.io/plugins/worker_rlimit_nofile_vs_connections/)
Não detectou algo? Por favor, abra uma [issue](https://github.com/MegaManSec/Gixy-Next/issues) no GitHub informando o que está faltando!
## Uso (flags)
Por padrão, o `gixy` lê a configuração do NGINX do sistema a partir de `/etc/nginx/nginx.conf`. Você também pode especificar o local passando-o para o `gixy`:
```shell-session
# Analyze the configuration in /opt/nginx.conf
gixy /opt/nginx.conf
```
Você pode executar um subconjunto focado de verificações com `--tests`:
```shell-session
# Only run these checks
gixy --tests http_splitting,ssrf,version_disclosure
```
Ou pule algumas verificações ruidosas com `--skips`:
```shell-session
# Run everything except these checks
gixy --skips low_keepalive_requests,worker_rlimit_nofile_vs_connections
```
Para relatar apenas problemas de uma determinada severidade ou superior, use a flag cumulativa `-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 padrão, a saída do `gixy` é colorida com ANSI; melhor visualizada em um terminal compatível. Você pode usar a flag `--format` (`-f`) com o valor `text` para obter uma saída sem cores:
```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
```
Também é possível usar `-f json` para obter uma saída JSON reproduzível e legível 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."}]
```
Você também pode usar `-f sarif` para obter um log [SARIF 2.1.0](https://sarifweb.azurewebsites.net/), por exemplo, para enviar ao GitHub code scanning:
```shell-session
# Write a SARIF report to a file, e.g. for `github/codeql-action/upload-sarif`
gixy -f sarif -o gixy-results.sarif
```
Mais flags de uso podem ser encontradas passando `--help` para `gixy`. Você também pode encontrar mais informações no [Guia de Uso](https://gixy.io/usage/).
## Configuração e opções de plugins
Alguns plugins expõem opções que você pode definir via flags de CLI ou um arquivo de configuração. Você pode ler mais sobre isso no [guia de Configuração](https://gixy.io/configuration/).
## Gixy-Next para segurança e conformidade do NGINX
Diferente de executar `nginx -t`, que apenas verifica a sintaxe, o Gixy-Next realmente analisa sua configuração e detecta instâncias não endurecidas e vulnerabilidades.
Com o Gixy-Next, você pode realizar uma revisão automatizada de segurança da configuração do NGINX que pode ser executada localmente a cada alteração, seja para auditoria, conformidade ou testes gerais, ajudando a produzir descobertas acionáveis que ajudam a prevenir servidores NGINX instáveis/lentos e a reduzir o risco de diretivas inseguras e padrões inseguros.
## Contribuindo
O Gixy-Next é mantido por [Joshua Rogers](https://joshua.hu), mas contribuições são sempre bem-vindas! Você pode nos ajudar de diferentes maneiras, como:
- Relatando bugs.
- Sugerindo novos plugins para detecção.
- Melhorando a documentação.
- Corrigindo, refatorando, melhorando e escrevendo novo código.
Antes de enviar quaisquer alterações em pull requests, leia o documento de diretrizes de contribuição, [Contribuindo para o Gixy-Next](https://gixy.io/contributing/).
A página inicial oficial do Gixy-Next é [https://gixy.io/](https://gixy.io/). Quaisquer alterações na documentação do Gixy-Next serão automaticamente refletidas nesse site.
O código-fonte pode ser encontrado em [https://github.com/MegaManSec/Gixy-Next](https://github.com/MegaManSec/Gixy-Next).
## O que é o Gixy? (Contexto)
_Gixy_ é um analisador de configuração do NGINX que foi [originalmente](https://github.com/yandex/gixy) desenvolvido por Andrew Krasichkov, do Yandex. Foi lançado pela primeira vez em 2017 e desde então ficou sem manutenção. Ele não suporta versões modernas do Python, contém inúmeros bugs e é limitado em sua funcionalidade e capacidade de detectar configurações vulneráveis do NGINX. Executar o Gixy original hoje em um sistema moderno resultará no seguinte erro:
```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'?
```
O Gixy-Next, portanto, é um fork que adiciona suporte a sistemas modernos, adiciona novas verificações, melhorias de desempenho, sugestões de hardening e suporte a versões modernas de Python e NGINX.
### Por que não o `gixy-ng`?
O Gixy-Next é, na verdade, um fork do `gixy-ng`, que por sua vez era um fork do `gixy` original. O Gixy-Next foi criado depois que o mantenedor do `gixy-ng` começou a produzir grandes quantidades de alterações assistidas por IA e código gerado automaticamente que era tanto grande demais para ser revisado quanto defeituoso.
Depois de algum tempo, o mantenedor do `gixy-ng` começou a commitar alterações geradas por IA no código-fonte que introduziram regressões óbvias, quebraram comportamentos críticos da ferramenta (que qualquer pessoa usando a ferramenta teria percebido), adicionaram artefatos aleatórios de ferramentas de IA e introduziram código que simplesmente não fazia o que deveria fazer. Mais importante ainda, o mantenedor também **adicionou marketing para o seu negócio em toda a documentação, em toda a saída e em todo o código-fonte** do `gixy-ng`.
Em outras palavras, o mantenedor do `gixy-ng` pegou o `gixy` original, pediu à IA para fazer alterações, introduziu uma série de bugs (e outras porcarias de IA) e depois adicionou publicidade ao código. Ele também aceitou contribuições na forma de merge requests, mas removeu as informações do autor (veja [este](https://joshua.hu/gixy-ng-new-version-gixy-updated-checks#quality-degradation) post e [este](https://joshua.hu/gixy-ng-ai-slop-gixy-next-maintained) post).
O Gixy-Next tem como foco restaurar a qualidade e foi testado em batalha em configurações NGINX com quase 100.000 linhas de extensão. Ele corrige bugs e detecções incorretas introduzidas por alterações feitas no `gixy-ng`, remove artefatos/lixo de ferramentas de IA e tenta manter o código-fonte revisável e sustentável. Este fork é para quem se interessa por código limpo e manutenibilidade a longo prazo.