← Voltar à lista

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

itadol5j

Nginx CVE-2026-42945

🚨 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

  1. A diretiva rewrite contém capturas sem nome $1/$2
  2. A string de substituição contém ?, acionando is_args = 1
  3. Fase de cálculo do comprimento: é usado um submotor recém-inicializado, com is_args = 0
  4. retorna o comprimento original: é alocado um buffer de heap muito pequeno
  5. Fase de cópia de dados: é usado o motor principal, com is_args = 1
  6. chama ngx_escape_uri: expande os bytes e estoura o buffer
  7. 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