
Prova de conceito de exploit para CVE-2025-29927, uma bypass de autorização de middleware do Next.js. Inclui um laboratório alvo vulnerável e um script em Python para verificar a bypass enviando cabeçalhos x-middleware-subrequest elaborados.
Um pequeno projeto no GitHub para validar o CVE-2025-29927 (Bypass de Autorização no Middleware do Next.js) em um ambiente de laboratório de autorização local (VMware: máquina alvo Ubuntu + máquina atacante Kali).
⚠️ Aviso Legal: Este projeto destina-se exclusivamente a fins educacionais, CTF e ambientes de laboratório que você possui ou para os quais possui autorização explícita. É estritamente proibido usá-lo em qualquer sistema não autorizado. As consequências do uso indevido deste projeto são de responsabilidade do usuário.
| Item | Conteúdo |
|---|---|
| CVE | CVE-2025-29927 |
| Data de Divulgação | 25/03/2025 (Aviso de Segurança Oficial do Next.js) |
| Componente Afetado | Vercel Next.js (Framework Full-Stack Node.js) |
| Tipo de Vulnerabilidade | Bypass de Autorização / Autorização Incorreta (CWE-863) |
| Versões Afetadas | < 12.3.5, < 13.5.9, < 14.2.25, < 15.2.3 |
| Versões Corrigidas | 12.3.5 / 13.5.9 / 14.2.25 / 15.2.3 ou superiores |
| Nível de Gravidade | Crítica / Alta (pontuação específica conforme página do NVD) |
Após a divulgação da vulnerabilidade, muitos painéis administrativos, callbacks de pagamento e APIs internas em ambientes de produção foram contornados. O Metasploit e o ProjectDiscovery Nuclei incluíram módulos de detecção, tornando-se uma das vulnerabilidades de "bypass de autorização em nível de framework" mais representativas de 2025.
O Next.js permite que a "lógica de autenticação" seja escrita no middleware, por exemplo:
export function middleware(request) {
if (!isLogin(request)) return NextResponse.redirect("/login"); // Não autenticado → bloqueia
return NextResponse.next();
}
O problema é que o Next.js internamente depende de um cabeçalho de requisição que o cliente pode forjar para determinar se "esta requisição já passou pelo middleware":
x-middleware-subrequest: middleware
Nas versões afetadas, se uma requisição externa carregar este cabeçalho interno, o Next.js assume erroneamente que o middleware já foi executado, fazendo com que todo o middleware de autenticação seja ignorado. O atacante não precisa de nenhuma conta; basta acessar rotas protegidas como /admin com este cabeçalho para obter um 200 direto — e como a página em si geralmente confia no middleware e não faz uma segunda verificação, o controle de autorização é anulado (erro de limite de confiança).
💡 O valor mais comum usado em explorações públicas é a forma repetida e concatenada do caminho do middleware, por exemplo
middleware:middleware:middleware:middleware:middleware; um únicomiddlewarepode não funcionar em algumas versões/estruturas de diretórios (testado na versão 14.2.24 deste laboratório). Este PoC testa várias opções de valores em sequência; se qualquer uma funcionar, o bypass é bem-sucedido.
CVE-2025-29927-PoC/
├── README.md # Este documento (explicação da vulnerabilidade + tutorial do laboratório VMware)
├── LICENSE # MIT
├── .gitignore
├── exploit.py # ★ PoC de validação em Python3 apenas com biblioteca padrão (executado no Kali/qualquer máquina)
├── target/ # ★ Laboratório de vulnerabilidade auto-construído (copie para a máquina alvo Ubuntu)
│ ├── package.json # Bloqueia [email protected] (versão afetada)
│ ├── middleware.js # Simula o "middleware de autenticação" de produção real
│ ├── pages/
│ │ ├── index.js # Página inicial
│ │ ├── login.js # Página de login (demonstra o redirecionamento para cá)
│ │ └── admin.js # ★ Painel administrativo protegido, lê flag.txt no servidor
│ ├── flag.txt # Flag do laboratório: FLAG{...}
│ ├── setup.sh # Instala Node 20 + npm install + build com um clique na máquina alvo
│ └── start.sh # Escuta em 0.0.0.0:3000 em modo de produção
└── tests/
└── mock_target.py # Máquina alvo simulada sem Node (apenas para autoteste de desenvolvimento)
┌───────────────────────────────────────────────────────────┐
│ VMware Workstation Pro 17 (Host: Windows) │
│ Rede: NAT (VMnet8 padrão), duas VMs no mesmo segmento, ping mútuo │
│ │
│ ┌──────────────────┐ ┌─────────────────────┐ │
│ │ Alvo Ubuntu 24.04 │ │ Atacante Kali Linux │ │
│ │ │ http │ │ │
│ │ Node 20 + Next │◄───────│ python3 exploit.py │ │
│ │ 14.2.24 :3000 │ GET │ │ │
│ └──────────────────┘ └─────────────────────┘ │
│ IP: <TARGET_IP> IP: <ATTACKER_IP> │
└───────────────────────────────────────────────────────────┘
| Finalidade | Imagem/Software | Versão Recomendada |
|---|---|---|
| Software de Virtualização | VMware Workstation Pro 17 (gratuito para uso pessoal) | 17.x |
| Imagem da Máquina Alvo | ISO do Ubuntu Server LTS | 24.04.x |
| Máquina Atacante | Kali Linux (imagem VMware oficial pré-configurada ou instalação via ISO) | 2025.x |
| (Opcional) | Host com 8 GB+ de RAM, 50 GB+ de disco | — |
Todos os passos abaixo são executados na máquina alvo Ubuntu.
# Opção A: Faça push do projeto para seu GitHub e clone (recomendado; use este se for enviar para o GitHub depois)
git clone https://github.com/<seu-usuario>/CVE-2025-29927-PoC.git
cd CVE-2025-29927-PoC
# Opção B: Copie do host via scp
# scp -r CVE-2025-29927-PoC ubuntu@<TARGET_IP>:~/
cd CVE-2025-29927-PoC/target
sudo bash setup.sh # Instala Node 20(LTS) + npm install + next build
O que o setup.sh faz internamente: atualiza o apt → instala ferramentas curl/CA/build → instala o Node.js 20 LTS via NodeSource → npm install (baixa dependências como [email protected]) → npm run build.