Vulnerabilidade do Nginx latente por 18 anos, CVE-2026-42945: análise completa do mecanismo, do PoC e das correções

🚨 Vulnerabilidade de alta gravidade do Nginx latente por 18 anos, CVE-2026-42945: mecanismo, PoC e soluções de correção
Em 13 de maio de 2026, a organização de pesquisa em segurança depthfirst, em conjunto com a F5, divulgou com destaque a vulnerabilidade mais grave da história do NGINX — CVE-2026-42945:
- pontuação CVSS v4.0 de 9.2: classificada como vulnerabilidade de alta gravidade
- estouro de buffer de heap: pode levar à execução remota de código (RCE)
- latente por 18 anos: presente no código-fonte desde 2008
- afeta 9,75 milhões de sites no mundo: mais de 2,54 milhões de sites na China são afetados
- PoC já é público: a QiAnXin já reproduziu com sucesso
Esta é uma vulnerabilidade histórica do módulo central do NGINX, em que o atacante precisa apenas enviar uma requisição HTTP especialmente elaborada para assumir remotamente o controle do servidor.
🔍 Visão geral da vulnerabilidade
Informações básicas
| Propriedade da vulnerabilidade | Detalhes |
|---|---|
| Identificador da vulnerabilidade | CVE-2026-42945 |
| Pontuação CVSS | v4.0: 9.2 | v3.1: 8.1 |
| Tipo de vulnerabilidade | Estouro de buffer de heap (Heap-based Buffer Overflow) |
| Tipo de ameaça | Execução remota de código (RCE) e negação de serviço (DoS) |
| Condições de exploração | Sem necessidade de autenticação; basta elaborar uma requisição HTTP |
| Componente afetado | ngx_http_rewrite_module (módulo integrado central do NGINX) |
| Organização que descobriu | depthfirst (sistema automatizado descobriu em 6 horas) |
Escopo do impacto
- 9,75 milhões de sites no mundoafetados
- 2,54 milhões de sites na Chinaafetados
- O NGINX serve cerca de 1/3 dos sites do mundo, o alcance do impacto é imenso
- O código foi incluído em 2008, latente há 18 anos
⚠️ Condições de acionamento
As três condições devem ser satisfeitas simultaneamente
Para acionar a vulnerabilidade, é necessário que a configuração atenda a uma combinação específica de condições:
| Condição | Descrição | Exemplo |
|---|---|---|
| 1. Captura PCRE sem nome | a diretiva rewrite usa grupos de captura sem nome | $1, $2, $3… |
| 2. String de substituição contém ponto de interrogação | a string de substituição contém o caractere ? | /profile.php?id=$1&tab=$2 |
| 3. Seguida de rewrite/if/set | outras diretivas vêm imediatamente após a diretiva rewrite | rewrite … last; if (…) { … } |
Exemplo de configuração vulnerável
# 易受攻击配置
rewrite ^/users/([0-9]+)/profile/(.*)$ /profile.php?id=$1&tab=$2 last;
# 后跟其他指令
if ($arg_debug) {
set $debug_flag 1;
}
Esta configuração satisfaz simultaneamente as três condições:captura sem nome $1/$2, string de substituição contém ?, seguida da diretiva if.
🔬 Mecanismo da vulnerabilidade
Inconsistência de estado no processamento em duas fases
O motor de scripts do NGINX usa um processamento em duas fases:
- Primeira fase: calcula o tamanho do buffer necessário
- Segunda fase: copia os dados para o buffer
O núcleo da vulnerabilidade está em um gerenciamento incorreto do sinalizador is_args:
| Fase | Estado do is_args | Lógica de processamento | Resultado |
|---|---|---|---|
| Fase de cálculo do comprimento | is_args = 0 | retorna o comprimento original da captura | subestima o tamanho do buffer |
| Fase de cópia de dados | is_args = 1 | chama ngx_escape_uri; cada byte se expande para 3 bytes | estouro de buffer de heap |
Fluxo detalhado
- A diretiva rewrite contém capturas sem nome $1/$2
- A string de substituição contém ?, acionando is_args = 1
- Fase de cálculo do comprimento: é usado um submotor recém-inicializado, com is_args = 0
- retorna o comprimento original: é alocado um buffer de heap muito pequeno
- Fase de cópia de dados: é usado o motor principal, com is_args = 1
- chama ngx_escape_uri: expande os bytes e estoura o buffer
- Os dados do URI controlados pelo atacante são gravados na área de estouro
Método de exploração
Feng Shui de heap entre requisições (Heap Feng Shui):
- O corpo das requisições POST faz spray na memória do heap (porque o URI não pode conter bytes nulos)
- Os dados do estouro corrompem o ponteiro cleanup do ngx_pool_t adjacente
- um ngx_pool_cleanup_s forjado, apontando para system()
- Quando o pool é destruído, a chamada a system() é acionada
- , concretizando a RCE
Impacto do ASLR
- ASLR ativado: causa apenas falhas no processo worker (DoS)
- ASLR desativado: é possível concretizar a execução remota de código (RCE)
📊 Versões afetadas
NGINX Open Source
| Faixa de versões | Versões corrigidas |
|---|---|
| 0.6.27 – 1.30.0 | 1.31.0, 1.30.1 |
NGINX Plus
| Faixa de versões | Versões corrigidas |
|---|---|
| R32 – R36 | R36 P4, R35 P2, R32 P6 |
Outros componentes afetados
- NGINX Instance Manager: 2.16.0 – 2.21.1
- NGINX App Protect WAF: 4.9.0 – 5.8.0
- NGINX Ingress Controller: 3.5.0 – 5.4.1
- NGINX Gateway Fabric: 1.3.0 – 2.5.1
- F5 DoS for NGINX: 4.8.0
🔥 Status do PoC
PoC já é público
- Repositório no GitHub: https://github.com/DepthFirstDisclosures/Nginx-Rift
- Reproduzida pela QiAnXin: pesquisadores de segurança do centro de inteligência de ameaças reproduziram com sucesso
- Detalhes técnicos já são públicos: a depthfirst publicou a análise técnica
- Exploração em ambiente real: ainda não detectada
Como usar o PoC
# 构建容器 ./setup.sh # 启动易受攻击的 NGINX 服务器 docker compose -f env/docker-compose.yml up # 执行 PoC 获取 Shell python3 poc.py --shell
✅ Soluções de correção
Método 1: atualizar a versão
# 升级到修复版本 NGINX Open Source >= 1.31.0 NGINX Open Source >= 1.30.1 NGINX Plus >= R32 P6 NGINX Plus >= R36 P4 # 升级后重启 NGINX nginx -s reload
Método 2: modificar a configuração (medida de mitigação)
Substituir grupos de captura sem nome por grupos de captura nomeados:
# 易受攻击配置(未命名捕获) rewrite ^/users/([0-9]+)/profile/(.*)$ /profile.php?id=$1&tab=$2 last; # 修复后配置(命名捕获) rewrite ^/users/(?[0-9]+)/profile/(?.*)$ /profile.php?id=$user_id&tab=$section last;
Grupos de captura nomeados não acionam a vulnerabilidade.
Método 3: verificar a configuração
Verifique se há configurações vulneráveis:
# 搜索易受攻击的 rewrite 指令 grep -E "rewrite.*\$[0-9]+.*\?.*(rewrite|if|set)" /etc/nginx/nginx.conf grep -rE "rewrite.*\$[0-9]+.*\?.*(rewrite|if|set)" /etc/nginx/conf.d/
🔍 Processo de descoberta
Descoberta pelo sistema automatizado
depthfirst, com seu sistema de análise de segurança:
- em 6 horasencontrou 5 problemas
- 4 deles confirmados pelo NGINX
- CVE-2026-42945 é a vulnerabilidade mais grave
- Pode ser rastreada até 2008 e está presente em quase todas as builds padrão
Outras vulnerabilidades relacionadas
- CVE-2026-42946: problema de corrupção de memória
- CVE-2026-40701: problema de corrupção de memória
- CVE-2026-42934: problema de corrupção de memória
📝 Resumo
CVE-2026-42945 é uma das vulnerabilidades mais graves da história do NGINX:
- Latente por 18 anos: presente no código-fonte desde 2008
- CVSS 9.2: estouro de buffer de heap, pode levar à RCE
- Condições de acionamento: diretiva rewrite com capturas sem nome + string de substituição contendo ? + seguida de outras diretivas
- Escopo do impacto: 9,75 milhões de sites no mundo, 2,54 milhões de sites na China
- PoC já é público: repositório no GitHub + reproduzida pela QiAnXin
- Correção: atualizar a versão ou usar grupos de captura nomeados
Com a revelação dessa vulnerabilidade latente por 18 anos, recomenda-se atualizar ou ajustar a configuração o quanto antes.
Anúncio oficial: https://my.f5.com/manage/s/article/K000161019
Repositório do PoC: https://github.com/DepthFirstDisclosures/Nginx-Rift
Análise técnica: https://depthfirst.com/research/nginx-rift