NGINX Rift: Falha Crítica de 18 Anos Permite RCE Sem Autenticação

15 mai. 2026

NGINX Rift — CVE-2026-42945

Em 13 de maio de 2026, a F5 Networks e a plataforma de segurança depthfirst divulgaram coordenadamente uma vulnerabilidade crítica no NGINX apelidada de NGINX Rift. Trata-se de um bug de heap buffer overflow com 18 anos de idade — presente desde a versão 0.6.27 —, que permite execução remota de código (RCE) por um atacante não autenticado por meio de simples requisições HTTP.

CVE: CVE-2026-42945
CWE: CWE-122 — Heap-based Buffer Overflow
CVSS v4.0: 9.2 (Critical) — AV:N/AC:H/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H
CVSS v3.1: 8.1 (High) — AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H
Descoberto por: depthfirst (de forma autônoma)
Advisory F5: K000161019


O que é o NGINX Rift?

O NGINX é o servidor web mais utilizado no mundo, presente em front-ends, reverse proxies, load balancers, API gateways e controladores de ingress em Kubernetes. Uma falha explorável remotamente nele tem impacto massivo.

O NGINX Rift vive no módulo ngx_http_rewrite_module — embutido em toda build padrão do NGINX. O bug é ativado por um padrão de configuração muito comum: um rewrite com captura PCRE sem nome ($1, $2) combinado a uma string de substituição com ? (query string), seguido de outro rewrite, if ou set no mesmo escopo.

Quando esse padrão está presente, o NGINX calcula o tamanho do buffer de destino com um conjunto de premissas de escape e depois escreve nele com outro — corrompendo o heap de forma determinística. Os bytes escritos além da alocação são derivados da URI enviada pelo atacante, tornando a corrupção controlável.


Impacto técnico

  • Acesso necessário: nenhum. Qualquer cliente HTTP pode disparar o bug.
  • Efeito imediato: crash do worker process do NGINX (negação de serviço).
  • Com ASLR desativado: execução remota de código no contexto do worker.
  • Com ASLR ativado: requisições repetidas mantêm o worker em crash loop, degradando disponibilidade de todos os sites servidos pela instância.
  • Vetor: plano de dados (request-handling path). Não há exposição do plano de controle.

Raiz técnica do bug

O problema está em src/http/ngx_http_script.c. O fluxo defeituoso é o seguinte:

  1. Quando o replacement do rewrite contém ?, a função ngx_http_script_start_args_code seta e->is_args = 1 no engine principal e nunca limpa essa flag.
  2. Uma chamada posterior a ngx_http_script_complex_value_code recalcula o tamanho do destino com um sub-engine recém zerado, então ngx_http_script_copy_capture_len_code mede a captura em bytes brutos.
  3. A cópia real roda no engine principal, que ainda tem is_args = 1 — fazendo ngx_http_script_copy_capture_code re-escapar a captura via ngx_escape_uri no modo NGX_ESCAPE_ARGS.
  4. Caracteres como +, % e & expandem dois bytes extras cada. O buffer foi dimensionado para o tamanho bruto — a escrita passa da alocação.

Resultado: heap overflow determinístico, moldado pelo conteúdo da URI do atacante.


Produtos e versões afetados

| Produto | Versões vulneráveis | |---|---| | NGINX Open Source | 0.6.27 – 1.30.0 | | NGINX Plus | R32 – R36 | | NGINX Instance Manager | 2.16.0 – 2.21.1 | | F5 WAF for NGINX | 5.9.0 – 5.12.1 | | NGINX App Protect WAF | 4.9.0 – 4.16.0 e 5.1.0 – 5.8.0 | | F5 DoS for NGINX | 4.8.0 | | NGINX App Protect DoS | 4.3.0 – 4.7.0 | | NGINX Gateway Fabric | 1.3.0 – 1.6.2 e 2.0.0 – 2.5.1 | | NGINX Ingress Controller | 3.5.0 – 3.7.2, 4.0.0 – 4.0.1 e 5.0.0 – 5.4.1 |

⚠️ Produtos não afetados: F5 Distributed Cloud, F5 Silverline, NGINX One Console, BIG-IP, BIG-IQ, F5OS, Traffix SDC e F5 AI Gateway.


Como verificar se você está exposto

# Verificar versão do NGINX instalada
nginx -v

# Procurar padrões vulneráveis na configuração
grep -rn 'rewrite' /etc/nginx/ | grep -E '\$[0-9]'

A regra prática: se você tiver uma diretiva rewrite com captura sem nome ($1, $2) e a string de substituição conter ?, e for seguida de outro rewrite, if ou set no mesmo bloco — você está exposto.


Remediação

Ação recomendada: atualizar

| Produto | Versão corrigida | |---|---| | NGINX Open Source | 1.31.0 ou 1.30.1 | | NGINX Plus R36 | R36 P4 | | NGINX Plus R32 | R32 P6 |

Após o upgrade, reinicie o NGINX para que os workers recarreguem o binário corrigido:

sudo systemctl restart nginx
# ou
sudo nginx -s reload

Mitigação temporária (se não puder atualizar agora)

Substitua capturas sem nome por capturas com nome em todas as diretivas rewrite afetadas.

Configuração vulnerável:

rewrite ^/users/([0-9]+)/profile/(.*)$ /profile.php?id=$1&tab=$2 last;

Configuração mitigada:

rewrite ^/users/(?<user_id>[0-9]+)/profile/(?<section>.*)$ /profile.php?id=$user_id&tab=$section last;

A diferença: capturas nomeadas ((?<nome>...)) eliminam o caminho de código defeituoso no ngx_http_script_copy_capture_code.


Linha do tempo

| Data | Evento | |---|---| | ~2007 | Bug introduzido no NGINX (v0.6.27) | | 2026 | Descoberto autonomamente pela plataforma depthfirst | | 13/05/2026 | F5 publica advisory coordenado com patch (K000161019) | | 13/05/2026 | CVE-2026-42945 registrado no NVD (NIST) | | 29/05/2026 | Webinar técnico depthfirst — Securing low level code: NGINX Rift |


Exploração ativa

Até a data de publicação deste post, a depthfirst não identificou exploração ativa na natureza. O advisory foi divulgado de forma coordenada com o lançamento do patch. Isso não significa que exploits públicos não surjam em breve — dado o impacto e a ampla adoção do NGINX, a janela de tempo para patching é crítica.


Referências