Torna agli aggiornamenti
UpdatedJul 31, 2026

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.

Condividi

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.

Logo CVE-2026-27654

🔥 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/COPY canonica che attiva l'underflow di size_t e fa crashare il worker vulnerabile.
  • Modalità write-file – carica contenuto arbitrario in qualsiasi posizione del filesystem (richiede un ambiente di laboratorio con alias scrivibile).
  • Consegna cron-shell – distribuisce un cron job di reverse shell in /etc/cron.d/, con richieste interattive per LHOST/LPORT e 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-prefix e altro.
  • Fallback robusto – se la libreria requests non è installata, lo script ripiega sul modulo standard http.client di 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

FlagDescrizioneEsempio
--target HOST:PORTIstanza nginx target (default: 127.0.0.1:8080).--target 10.0.0.5:80
--verbose, -vMostra le risposte HTTP complete (header e body).-v
--no-putSalta la PUT iniziale (presuppone che il file trigger esista già). Utile per test ripetuti.--no-put
--location-prefixPrefisso della location DAV (default: /uploads/). Deve corrispondere alla location alias nella configurazione di nginx.--location-prefix /dav/
--remote-nameNome 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-pathPercorso 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-lenLunghezza della stringa alias configurata (usata per la visualizzazione dell'aritmetica del crash, default 13).--alias-len 20
--escape-depthNumero di componenti di percorso ../ per uscire dalla root DAV (default 1).--escape-depth 3
--payload-fileFile locale da caricare come payload. Sostituisce il contenuto di test predefinito.--payload-file ./shell.php
--payload-textPayload di testo letterale per la modalità write-file.--payload-text \"<?php phpinfo(); ?>\"
--lhostHost di callback della reverse shell (per cron-shell). Se omesso, lo script lo chiede interattivamente.--lhost 192.168.1.50
--lportPorta di callback della reverse shell (per cron-shell).--lport 4444
--cron-commandComando da eseguire tramite cron (per cron-cmd). Se omesso, lo script lo chiede interattivamente.--cron-command "rm -rf /tmp/*"
--waitSecondi di attesa dopo la consegna del cron job prima che venga eseguito (default 65).--wait 120
--checkEsegue il controllo di vulnerabilità (crash test, non interattivo). Output VULNERABLE/NOT VULNERABLE ed esce con codice 0/1.--check
--proxy PROXY_URLURL 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/--lport per cron-shell) se non vengono forniti.

🧪 Modalità in dettaglio

Categorie