Mitigando o CVE-2025-29927: bypass de autorização no middleware do Next.js

O CVE-2025-29927 é uma vulnerabilidade crítica (CVSS 9.1) no Next.js que permite que atacantes ignorem completamente a execução do middleware enviando um único header HTTP manipulado. Como o middleware do Next.js é amplamente utilizado para aplicar autenticação, autorização e rate limiting, uma exploração bem-sucedida pode expor rotas protegidas, dados sensíveis e APIs internas sem nenhuma credencial.

Este guia explica como a vulnerabilidade funciona e como mitigá-la usando Azion Applications com uma regra no Rules Engine que remove o header malicioso antes que ele chegue à sua origem Next.js.


Versões afetadas

Versão do Next.jsIntervalo vulnerávelVersão com patch
15.x>= 15.0.0, < 15.2.315.2.3
14.x>= 14.0.0, < 14.2.2514.2.25
13.x>= 13.0.0, < 13.5.913.5.9
12.x>= 12.0.0, < 12.3.512.3.5
11.xTodas as versõesSem patch — use apenas o workaround

Como o ataque funciona

O Next.js utiliza um header interno, x-middleware-subrequest, para rastrear chamadas recursivas de middleware e evitar loops infinitos. Esse header nunca foi projetado para ser enviado por clientes externos.

Quando um atacante envia uma requisição com esse header definido com um valor específico, o Next.js interpreta a requisição como uma subrequisição interna e ignora completamente a execução do middleware. Isso significa que todas as verificações de segurança implementadas no middleware — autenticação, autorização, rate limiting — são contornadas.

Exemplos de exploit:

Para Next.js 14.x e 15.x:

x-middleware-subrequest: middleware:middleware:middleware:middleware:middleware

Para Next.js 11.1.4 até 12.1.x:

x-middleware-subrequest: pages/_middleware
x-middleware-subrequest: pages/dashboard/_middleware

O ataque não requer credenciais, privilégios especiais e funciona a partir de qualquer rede — tornando-o trivialmente explorável em larga escala.

Impacto potencial:

  • Acesso não autorizado a rotas protegidas e painéis administrativos
  • Bypass de verificações de autenticação e autorização
  • Exposição de dados sensíveis e APIs internas
  • Contorno de rate limiting e outras medidas de proteção
  • Cache poisoning levando a Denial of Service

Detectando aplicações vulneráveis

Antes de aplicar a mitigação, identifique se suas aplicações estão rodando uma versão vulnerável do Next.js. Procure estes indicadores nas respostas HTTP:

  1. O header de resposta x-powered-by: Next.js (pode ser desabilitado, então a ausência não garante segurança)
  2. Headers como x-middleware-rewrite ou x-nextjs-cache
  3. Referências a /_next/static/ no corpo das respostas
  4. Uma resposta diferente ao enviar o header de exploit versus uma requisição normal

Você pode usar o template Nuclei para CVE-2025-29927 para escanear suas aplicações:

Terminal window
# Escanear um único alvo
nuclei -u https://sua-app.exemplo.com -t ./CVE-2025-29927-6mile.yaml -fr
# Escanear uma lista de alvos
nuclei -l websites.list -t ./CVE-2025-29927-6mile.yaml -fr -silent

Estratégia de mitigação

A recomendação oficial do Next.js é bloquear qualquer requisição externa que contenha o header x-middleware-subrequest antes que ela chegue à sua aplicação.

A Azion Applications aplica isso na borda da rede — antes que a requisição chegue à sua origem — usando uma regra no Rules Engine com o behavior Filter Request Header. Isso remove o header x-middleware-subrequest de cada requisição recebida, de modo que o Next.js nunca o veja e a execução do middleware prossiga normalmente.

Esta abordagem:

  • Protege todas as rotas da aplicação simultaneamente com uma única regra
  • Não requer alterações no código da sua aplicação
  • Pode ser implantada e revertida independentemente do seu ciclo de releases
  • Entra em vigor em minutos após salvar

Pré-requisitos


Criando a regra de mitigação

  1. Acesse o Azion Console > Applications.

  2. Selecione a application que serve sua carga de trabalho Next.js.

  3. Clique na aba Rules Engine.

  4. Clique em + Rule.

  5. Dê um nome descritivo à regra, como Remover x-middleware-subrequest - CVE-2025-29927.

  6. Opcionalmente, adicione uma descrição: Remove o header x-middleware-subrequest de todas as requisições recebidas para mitigar o CVE-2025-29927 no Next.js.

  7. Certifique-se de que Request Phase está selecionado.

  8. Na seção Criteria, configure:

    • Variável: ${uri}
    • Operador: starts with
    • Argumento: /

    Isso corresponde a todas as requisições recebidas pela application.

  9. Na seção Behaviors, selecione Filter Request Header.

  10. No campo do nome do header, insira: x-middleware-subrequest

  11. Clique em Save.

A regra será propagada pela infraestrutura global da Azion em alguns minutos.


Validando a mitigação

Após a propagação da regra, teste se o header está sendo removido antes de chegar à sua origem:

Terminal window
# Enviar o header de exploit — sua aplicação deve responder normalmente (sem bypass de autenticação)
curl -i -H 'x-middleware-subrequest: middleware:middleware:middleware:middleware:middleware' \
https://sua-app.exemplo.com/rota-protegida
# Enviar uma requisição normal — também deve responder normalmente
curl -i https://sua-app.exemplo.com/rota-protegida

Ambas as requisições devem retornar a mesma resposta. Se o header de exploit estava anteriormente concedendo acesso não autorizado a rotas protegidas, isso não deve mais ocorrer após a regra estar ativa.


Atualizando o Next.js (correção definitiva)

A regra de remoção do header é uma medida temporária. Aplique a correção permanente atualizando o Next.js para uma versão com patch o mais rápido possível:

Versão atualAlvo de atualização
15.x>= 15.2.3
14.x>= 14.2.25
13.x>= 13.5.9
12.x>= 12.3.5
11.xAtualize para 12.x ou superior

Após atualizar e validar sua aplicação, você pode desabilitar ou remover a regra do Rules Engine.


Comparação com outras implementações

Outras plataformas implementam a mesma lógica de mitigação. A abordagem da Azion é equivalente em efeito:

PlataformaImplementação
Azion ApplicationsRules Engine Filter Request Header remove x-middleware-subrequest antes de encaminhar para a origem
ModSecuritySecRule REQUEST_HEADERS_NAMES "@rx (?i)^x-middleware-subrequest" com ação block
Coraza (Traefik)SecRule &REQUEST_HEADERS:x-middleware-subrequest "@gt 0" com deny,status:403
Nginxproxy_set_header x-middleware-subrequest "" (remove o header)
ApacheRequestHeader unset x-middleware-subrequest (remove o header)

Todas as abordagens seguem a recomendação oficial do Next.js: impedir que o header x-middleware-subrequest chegue à aplicação.


Referências