Mitigue a CVE-2025-29927 no Next.js
Remova o header x-middleware-subrequest com uma regra do Rules Engine em Azion Applications, para que uma requisição forjada não pule o middleware do Next.js.
Você pode bloquear as requisições que exploram a CVE-2025-29927 pelo Azion Console, com uma regra no Rules Engine for Applications que remove o header do qual o exploit depende.
A CVE-2025-29927 é uma vulnerabilidade no Next.js, com score CVSS 9.1, que permite a uma requisição pular a execução do middleware. O middleware do Next.js costuma carregar autenticação, autorização e rate limiting, então uma requisição que o pula alcança rotas protegidas sem nenhuma credencial. O registro do advisory é GHSA-f82v-jwr5-mffw e no aviso de segurança do Next.js.
O Next.js usa um header interno, x-middleware-subrequest, para contar as chamadas recursivas de middleware e impedir um loop infinito. Um cliente externo nunca foi feito para enviá-lo. Quando uma requisição chega com esse header em um valor específico, o Next.js lê a requisição como uma subrequisição interna e não executa nenhum middleware.
O Next.js 14.x e 15.x aceitam este valor:
O Next.js 11.1.4 até 12.1.x aceita, em vez disso, um path de middleware:
A requisição não precisa de credenciais nem de privilégios especiais, e funciona a partir de qualquer rede. Um exploit bem-sucedido pode:
- Alcançar rotas protegidas e painéis administrativos
- Pular as verificações de autenticação e autorização
- Expor dados sensíveis e APIs internas
- Contornar o rate limiting e outras medidas de proteção
- Envenenar o cache, o que leva a negação de serviço
Pré-requisitos
- Uma conta Azion. Consulte Como criar uma conta na Azion.
- Uma application em Applications cuja origem é o seu deployment do Next.js.
- Acesso ao Azion Console. Para entrar, consulte Como acessar o Azion Console.
Detecte uma aplicação vulnerável
Um deployment é vulnerável quando a versão do Next.js que ele executa cai dentro de um destes intervalos:
| 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 | Nenhum patch disponível |
Nem sempre é possível ler a versão de fora do deployment. Quatro sinais em uma resposta HTTP apontam para uma aplicação Next.js que executa middleware:
- O header de resposta
x-powered-by: Next.js, que um deployment pode desligar, então a ausência dele não prova nada - Um header de resposta
x-middleware-rewriteoux-nextjs-cache - Uma referência a
/_next/static/no corpo de uma resposta - Uma resposta ao header do exploit diferente da resposta a uma requisição comum
Para sondar um alvo, ou uma lista deles, com o template Nuclei para a CVE-2025-29927:
Uma correspondência positiva significa que a aplicação executa Next.js com headers de middleware. Ela não nomeia a versão, então leia a versão do Next.js no seu ambiente de deployment antes de decidir.
Crie a regra de mitigação
O advisory do Next.js recomenda bloquear qualquer requisição externa que carregue o header x-middleware-subrequest antes que ela alcance a aplicação. Uma regra com o behavior Filter Request Header remove esse header de toda requisição recebida, de modo que o Next.js nunca o lê e o middleware executa como foi escrito. Uma regra cobre todas as rotas da application, não exige nenhuma alteração no código da aplicação, e é criada e removida independentemente do seu ciclo de releases.
Para criar a regra:
Acesse o Azion Console > Applications e selecione a application que serve o seu deployment do Next.js.
Digite um nome para a regra. Por exemplo: Strip x-middleware-subrequest - CVE-2025-29927.
Digite uma descrição. Por exemplo: Strips the x-middleware-subrequest header from all incoming requests to mitigate CVE-2025-29927 in Next.js.
Na seção Criteria, selecione a variável ${uri}, o operador de comparação starts with e / como argumento. Isso corresponde a toda requisição à application.
Na seção Behaviors, selecione Filter Request Header.
No campo do nome do header, digite x-middleware-subrequest.
A regra aparece na aba Rules Engine da application. Ela leva alguns minutos para alcançar a infraestrutura distribuída da Azion, então uma requisição enviada logo em seguida ainda pode levar o header até a origem.
Valide a mitigação
Envie a mesma requisição duas vezes, uma com o header do exploit e outra sem ele:
As duas chamadas retornam a mesma resposta, porque o header foi removido antes de qualquer uma das requisições alcançar a origem. Uma rota protegida que o header do exploit abria antes da regra continua fechada depois dela. Para revisar as requisições que alcançaram a application, consulte Real-Time Events.
Atualize o Next.js para uma versão com patch
A regra remove o header, e o código vulnerável continua no deployment até você substituí-lo. Atualize para a release com patch da sua versão major:
| Versão atual | Alvo da 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 posterior |
Assim que a release com patch estiver em produção e a aplicação se comportar como esperado, desligue ou exclua a regra.