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

import DocButton from '~/components/webkit/DocButton.vue';
import Tag from '~/components/webkit/Tag.vue'
import Tabs from '~/components/tabs/Tabs'
import Code from '~/components/Code/Code.astro'

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.

:::caution[Ação prioritária]
A correção definitiva é atualizar o Next.js para uma versão com o patch aplicado. Use esta mitigação como medida temporária enquanto você planeja e executa a atualização.
:::

---

## 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 |

:::note
Aplicações Next.js hospedadas na Vercel são automaticamente protegidas contra esta vulnerabilidade.
:::

---

## 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:
```http
x-middleware-subrequest: middleware:middleware:middleware:middleware:middleware
```

Para Next.js 11.1.4 até 12.1.x:
```http
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](https://github.com/6mile/nextjs-CVE-2025-29927) para escanear suas aplicações:

```bash
# 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
```

:::note
Um resultado positivo do template Nuclei indica que a aplicação usa Next.js com headers de middleware, mas não confirma a versão exata. Verifique a versão do Next.js diretamente no seu ambiente de implantação.
:::

---

## 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

- Uma [conta Azion](https://console.azion.com)
- Uma [Application](/pt-br/documentacao/produtos/build/edge-application/) configurada com seu domínio Next.js como origem

---

## Criando a regra de mitigação

1. Acesse o [Azion Console](https://console.azion.com) > **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:

```bash
# 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.

:::tip
Use o [Real-Time Events](/pt-br/documentacao/produtos/observe/real-time-events/) para inspecionar os headers das requisições e confirmar que o header `x-middleware-subrequest` não está mais chegando à sua origem.
:::

---

## 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)](https://github.com/advisories/GHSA-f82v-jwr5-mffw)
- [Next.js Security Advisory](https://nextjs.org/blog/cve-2025-29927)
- [Rules Engine para Applications](/pt-br/documentacao/produtos/build/edge-application/rules-engine/)
- [Documentação de Applications da Azion](/pt-br/documentacao/produtos/build/edge-application/)