针对 CVE-2026-0300 的只读审计工具——这是 PAN-OS User-ID 认证门户(旧称“Captive Portal”)中存在于 PA 系列和 VM 系列防火墙上的未认证缓冲区溢出漏洞。
本仓库随 Tailwind Resource Group 安全公告 TRG-SA-2026-003 一同发布,提供以下内容:
audit_portal.py — 第 1 层:单防火墙审计audit_fleet.py — 第 2 层:由 Panorama 驱动的机群扫描(并发)panos_audit.py — 两个 CLI 共用的共享库这些脚本是只读的。它们仅向 PAN-OS XML API 发出 show 类查询,绝不修改任何配置。API 密钥通过 X-PAN-KEY HTTP 头发送,而非作为 URL 查询参数,因此不会出现在 PAN 管理平面访问日志、TLS 检查代理日志或审计进程的参数中。
CVE 记录使用了现代功能名称“User-ID 认证门户”。而 PAN-OS XML 模式、CLI 配置项和文档 URL 路径仍沿用旧的 captive-portal 词汇。运维人员使用 show config running | match authentication-portal 审计机群时会静默漏掉所有配置,因为该字符串永远不会作为配置元素出现。本工具无论配置创建于何时,都会搜索符合模式规范的元素名称。
关于这一命名陷阱的完整 Tailwind 分析见 TRG-SA-2026-003《Captive Portal 的遗留足迹》。
pip install--insecure 仅用于一次性上线审计export PAN_API_KEY="<key>"
./audit_portal.py --hostname fw1.example.com
示例表格输出:
vsys: vsys1
configured: True
enabled: True
redirect_host: auth-portal.internal.example.com
mode: redirect
bound: ethernet1/3(internal-trust), ethernet1/4(guest)
tls_verified: True
risk: EXPOSED_LIKELY
其他输出格式:--output json 或 --output csv。
其他参数:--vsys <name> 用于单 vsys 审计,--timeout/--retries 用于上游响应缓慢的场景,--debug 用于在 stderr 输出详细的错误信息。
export PAN_API_KEY="<panorama-key>"
./audit_fleet.py --hostname panorama.example.com --workers 16 --output csv > fleet-audit.csv
CSV 中的每一行对应一个设备-vsys,包含门户状态、重定向主机、模式、接口绑定和风险分级。脚本使用 Panorama 的 target=<serial> API 参数,因此不会直接连接受管防火墙——只需一次到 Panorama 的连接即可扫描整个机群。
值得关注的参数:
--workers N — 并发审计线程数(默认 8,最大 32)。1000 台设备的机群可在几分钟内完成扫描,而串行扫描则需要一个多小时。--timeout、--retries — 每次 API 调用的设置。瞬态 URLError 和 HTTP 5xx 会以有界退避策略重试。--exclude-disconnected — 默认情况下,断连设备会以 risk=DISCONNECTED 包含在结果中,以便在补丁窗口期内保持可见。使用此参数可将其排除。--min-expected-devices N — 若 Panorama 返回的设备数少于 N,则在 stderr 输出警告。可用于在已知机群规模下检测响应截断。--serial-filter '0007*' — 按序列号进行通配符过滤,以审计子集。--debug — 在 stderr 输出每个设备的详细错误信息(包含上游 reason 字符串;默认关闭,以避免将主机名泄露到面向客户的 CSV 中)。输出中的 risk 列取以下值之一:
EXPOSED_LIKELY 是一个提示,而非最终判定——区域名称是运维人员的约定,而非强制规则。该脚本无法替代安全策略审查;它的作用是将机群输出按优先级排序,让注意力首先落在最需要关注的地方。
能:
<captive-portal> 配置块(模式元素名称始终为 captive-portal,无论 UI 命名或 PAN-OS 版本如何)。EXPOSED_LIKELY 行在机群输出中优先显示。X-PAN-KEY 头发送 API 密钥,使其不进入 URL 访问日志和进程参数。不能:
PAN-OS API 密钥继承生成该密钥的用户的角色和权限。
重要注意事项:PAN-OS 中没有只读的 XML API 授权。
XML API 选项卡上的管理员角色权限按类别为二元启用/禁用——配置、操作请求、提交、导出、导入、报告、日志、User-ID Agent。为 XML API 启用配置将同时允许
show和set/edit/delete/move/rename/clone操作。启用操作请求将允许任意<request>操作,包括<request><restart>。Web UI 和 REST API 选项卡提供只读选项;XML API 选项卡则没有。通过启用这些 XML API 类别创建的“审计用户”在设备上拥有完整的 XML API 写入权限。请将生成的密钥视为特权凭据:将其有效期限定在审计窗口内,存储在密钥管理器中,并在工作完成后禁用该用户。
PAN 官方参考:获取您的 API 密钥(PAN-OS XML API)。
在防火墙(或使用 audit_fleet.py 时的 Panorama)上:
创建管理员角色。 导航至 Device > Admin Roles(或 Panorama > Admin Roles)。点击 Add。
audit-config-and-op。创建审计用户。 导航至 Device > Administrators(或 Panorama > Administrators)。点击 Add。
audit-cve-2026-0300。audit-config-and-op。使用新用户的凭据生成 API 密钥。 PAN-OS 在 WebUI 中没有“生成 API 密钥”按钮——keygen 端点是受支持的路径。使用 POST 请求体,以免凭据被记录到 URL 访问日志中:
read -rs AUDIT_PW; echo
export PAN_API_KEY="$(curl -ksX POST "https://fw1.example.com/api/" \
--data-urlencode "type=keygen" \
--data-urlencode "user=audit-cve-2026-0300" \
--data-urlencode "password=$AUDIT_PW" \
| grep -oE '<key>[^<]+' | cut -c6-)"
unset AUDIT_PW
read -rs 读取密码时不会在终端回显,也不会写入 shell 历史。脚本从环境中读取生成的 PAN_API_KEY,并通过 HTTP 头发送——密码和密钥都不会出现在 URL 访问日志或脚本运行时的 输出中。
read -rs 可覆盖密码。对于 PAN_API_KEY 中的密钥,建议通过上述代码片段交互式设置,而非从文件粘贴。如果必须从文件加载,请在该会话中使用 set +o history。--insecure 参数会完全禁用 TLS 主机名校验和证书验证。路径上的任何攻击者都可以对审计响应进行中间人攻击,并对已被攻陷的设备报告 portal_enabled=False。audit_fleet.py 脚本在进行机群扫描时要求同时使用 --accept-mitm-risk 和 --insecure,因为被污染响应的爆炸半径覆盖整个机群。0 — 所有被审计的 vsys 上均未启用门户2 — 未找到 vsys(瞬态或不受支持的配置)3 — 至少一个 vsys 上启用了门户(需要审查)4 — API 调用失败(认证、TLS、网络)“门户已启用”时返回非零退出码是有意为之——这使您可以将脚本接入需要明确信号的 CI / 机群扫描流水线。
根据 Apache License 2.0 版本许可。完整条款见 LICENSE。
允许商业使用;需注明出处(衍生作品中保留版权声明和许可证文件)。
版权所有 © 2026 Tailwind Resource Group。
| 标签 | 含义 |
|---|
INFO_NOT_CONFIGURED | 设备上没有 <captive-portal> 配置块。不在 CVE-2026-0300 影响范围内。 |
INFO_DISABLED | 门户已配置但 enabled=no。易受攻击的代码路径未激活。 |
REVIEW_POLICY_NO_BINDINGS | 门户已启用,但配置中未找到接口绑定。请通过 WebUI 验证。 |
EXPOSED_LIKELY | 门户已启用并绑定到名称暗示不受信任暴露的区域(untrust、dmz、guest、external、internet、wan、public)。应优先调查。 |
REVIEW_POLICY | 门户已启用并绑定到内部命名的区域。需检查安全策略以确认可达性。 |
X-PAN-KEYps auxww审计工作完成后禁用该用户。 导航至 Device > Administrators,找到 audit-cve-2026-0300,点击 Delete(或禁用该用户)。提交。这将使该用户生成的所有密钥失效。