Uma vulenrabilidade crítica, identificada como CVE-2025-29927, foi descoberta no framwork Next.js. A falha permite que atacantes contornem o middleware (camada intermediária) de segurança, acessando rotas e APIs que deveriam ser protegidas, resultando em potencial bypass de autorização e outros riscos. Este artigo explora a causa raiz, as versões afetadas, as correções disponíveis e soluções temporárias.
Análise Técnica da Vulnerabilidade
Mecanismo de Exploração
O Next.js utiliza internamente um cabeçalho HTTP, x-middleware-subrequest, para identificar chamadas internas de sub-requisição e prevenir a recursividade infinita no middleware. A vulnerabilidade surge pois versões afetadas não validam adequadamente a procedência deste cabeçalho. Um atacante pode injetar manualmente este cabeçalho em uma requisição externa, fazendo com que o Next.js a interprete como uma sub-requisição interna legítima, ignorando assim toda a lógica de segurança e autenticação definida no middleware.
Cenários de Impacto
O impacto principal é o bypass de autorização. Se uma aplicação confia no middleware para verificar sessões de usuário ou permissões de acesso, um atacante não autenticado pode acessar recursos restritos. Além disso, cabeçalhos de segurança injetados pelo middleware (como Content-Security-Policy) podem ser ignorados. Redirecionamentos ou reescritas de caminhos (path rewriting) baseados no middleware também podem ser comprometidos.
Escopo de Afetação
Versões Vulneráveis
A falha afeta múltiplas linhas de versão do Next.js:
- Next.js 14.x: Anteriores à versão 14.2.25.
- Next.js 15.x: Anteriores à versão 15.2.3.
- Next.js 13.x: Anteriores à versão 13.5.9.
- Next.js 12.x: Anteriores à versão 12.3.5.
Ambientes Afetados
O problema é específico para aplicações auto-hospedadas (self-hosted) que utilizam o modo de produção (next start) e dependem de middleware. Deployments em formato standalone também estão vulneráveis.
Ambientes Não Afteados
Ambientes hospedados na Vercel geralmente aplicam tratamentos adicionais a este cabeçalho, mitigando a falha. Deployments puramente estáticos (next export) ou plataformas como Netlify não executam o middleware e, portanto, não são afetados. Regras de firewall em camadas externas (ex.: WAFs) também podem bloquear requisições contendo este cabeçalho.
Código de Exemplo Vulnerável
Considere um middleware que redireciona usuários não autenticados:
// middleware.ts (Versão VULNERÁVEL)
import { NextResponse, type NextRequest } from 'next/server';
export function verificarAutenticacao(req: NextRequest) {
const cookieSessao = req.cookies.get('token_sessao');
const ehRotaAdmin = req.nextUrl.pathname.startsWith('/painel');
if (!cookieSessao && ehRotaAdmin) {
return NextResponse.redirect(new URL('/login', req.url));
}
return NextResponse.next();
}
export const config = {
matcher: ['/painel/:path*'],
};
Uma requisição para /painel/dashboard com o cabeçalho x-middleware-subrequest: middleware:middleware:middleware contornaria a função verificarAutenticacao, permitindo acesso direto ao conteúdo protegido.
Soluções e Mitigações
1. Atualização do Framework (Recomendado)
A correção oficial impõe validações rigorosas no cabeçalho problemático. A solução mais segura é atualizar para as versões corrigidas: 15.2.3, 14.2.25, 13.5.9 ou 12.3.5, respectivamente para cada versão principal.
2. Mitigação Temporária em Camadas de Proxy
Enquanto a atualização não é possível, é possível remover ou neutralizar o cabeçalho em um proxy reverso (ex.: Nginx) antes que ele alcance a aplicação Next.js:
# No bloco de configuração do servidor/proxy no Nginx
proxy_set_header x-middleware-subrequest "";
# OU para bloquear completamente requisições externas com este cabeçalho
if ($http_x_middleware_subrequest) {
return 403;
}
Este método garante que apenas requisições genuinamente internas (originadas do próprio servidor Next.js) possuam o cabeçalho.
3. Defesa em Profundidade no Código
Implemente verificações de autorização também dentro das rotas de API e das próprias páginas, não dependendo exclusivamente do middleware como camada única de proteção. Isso reduz o impacto de um bypass eventual.
Cronologia do Evento
- Fevereiro 2025: A vulnerabilidade é reportada à equipe de segurança do Next.js.
- Março 2025: As versões corrigidas (14.2.25, 15.2.3) são lançadas e o CVE-2025-29927 é divulgado publicamente.
- Março 2025 (posterior): Patches retroativos (13.5.9, 12.3.5) são disponibilizados para versões mais antigas.
Este incidente reforça a importância de manter os frameworks atualizados e de não centralizar toda a lógica de segurança crítica em uma única camada. Realizar auditorias de segurança regulares e monitorar boletins oficiais de CVE são práticas essenciais para proteger aplicações web modernas.