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.js | Intervalo vulnerável | Versão com patch |
|---|---|---|
| 15.x | >= 15.0.0, < 15.2.3 | 15.2.3 |
| 14.x | >= 14.0.0, < 14.2.25 | 14.2.25 |
| 13.x | >= 13.0.0, < 13.5.9 | 13.5.9 |
| 12.x | >= 12.0.0, < 12.3.5 | 12.3.5 |
| 11.x | Todas as versões | Sem 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:middlewarePara Next.js 11.1.4 até 12.1.x:
x-middleware-subrequest: pages/_middlewarex-middleware-subrequest: pages/dashboard/_middlewareO 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:
- O header de resposta
x-powered-by: Next.js(pode ser desabilitado, então a ausência não garante segurança) - Headers como
x-middleware-rewriteoux-nextjs-cache - Referências a
/_next/static/no corpo das respostas - 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:
# Escanear um único alvonuclei -u https://sua-app.exemplo.com -t ./CVE-2025-29927-6mile.yaml -fr
# Escanear uma lista de alvosnuclei -l websites.list -t ./CVE-2025-29927-6mile.yaml -fr -silentEstraté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
- Uma conta Azion
- Uma Application configurada com seu domínio Next.js como origem
Criando a regra de mitigação
-
Acesse o Azion Console > Applications.
-
Selecione a application que serve sua carga de trabalho Next.js.
-
Clique na aba Rules Engine.
-
Clique em + Rule.
-
Dê um nome descritivo à regra, como
Remover x-middleware-subrequest - CVE-2025-29927. -
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. -
Certifique-se de que Request Phase está selecionado.
-
Na seção Criteria, configure:
- Variável:
${uri} - Operador:
starts with - Argumento:
/
Isso corresponde a todas as requisições recebidas pela application.
- Variável:
-
Na seção Behaviors, selecione Filter Request Header.
-
No campo do nome do header, insira:
x-middleware-subrequest -
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:
# 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 normalmentecurl -i https://sua-app.exemplo.com/rota-protegidaAmbas 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 atual | Alvo de atualização |
|---|---|
| 15.x | >= 15.2.3 |
| 14.x | >= 14.2.25 |
| 13.x | >= 13.5.9 |
| 12.x | >= 12.3.5 |
| 11.x | Atualize 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:
| Plataforma | Implementação |
|---|---|
| Azion Applications | Rules Engine Filter Request Header remove x-middleware-subrequest antes de encaminhar para a origem |
| ModSecurity | SecRule 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 |
| Nginx | proxy_set_header x-middleware-subrequest "" (remove o header) |
| Apache | RequestHeader 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
- CVE-2025-29927 — GitHub Advisory Database (GHSA-f82v-jwr5-mffw)
- Next.js Security Advisory
- Rules Engine para Applications
- Documentação de Applications da Azion