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

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 (opens in a new tab)
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 (opens in a new tab)


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


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

ProdutoVersões vulneráveis
NGINX Open Source0.6.27 – 1.30.0
NGINX PlusR32 – R36
NGINX Instance Manager2.16.0 – 2.21.1
F5 WAF for NGINX5.9.0 – 5.12.1
NGINX App Protect WAF4.9.0 – 4.16.0 e 5.1.0 – 5.8.0
F5 DoS for NGINX4.8.0
NGINX App Protect DoS4.3.0 – 4.7.0
NGINX Gateway Fabric1.3.0 – 1.6.2 e 2.0.0 – 2.5.1
NGINX Ingress Controller3.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

ProdutoVersão corrigida
NGINX Open Source1.31.0 ou 1.30.1
NGINX Plus R36R36 P4
NGINX Plus R32R32 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

DataEvento
~2007Bug introduzido no NGINX (v0.6.27)
2026Descoberto autonomamente pela plataforma depthfirst
13/05/2026F5 publica advisory coordenado com patch (K000161019 (opens in a new tab))
13/05/2026CVE-2026-42945 registrado no NVD (NIST (opens in a new tab))
29/05/2026Webinar 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

© JUCARSS