FlawOpen

flawopen.com/Teardowns/cve-2026-73570-zimbra-snmp-command-injection

● CVE-2026-73570 · CVSS 8.9[5], [10] · 高危
安全研究 · FlawOpen

CVE-2026-73570:Zimbra 的 SNMP 通知链如何导致命令注入

CVE-2026-73570 是 Zimbra 可选 SNMP 通知路径中的未认证命令注入漏洞。特制邮件可能影响一个状态值,该值随后被插入 shell 命令;Zimbra 在 10.1.20 中修复了调用方式。Microsoft 后来报告称,在公开披露前有扫描工具探测过这条易受攻击的路径。[1], [2], [5]

CVSS 向量CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:C/C:H/I:H/A:L[5], [10]
💡 通俗易懂的原理解析 (ELI5)

邮件分拣员把信封上的标签抄到工作单上。旧流程把整张工作单交给命令解释器,解释器可能把标签中的字符误当成额外指令。修复后,通知程序接收一组彼此分开的参数,标签始终只是数据。[8], [9], [3]

核心概念与专有名词

swatchdog
此 Zimbra 路径使用的日志监控进程,用于匹配服务状态消息并触发通知。[1]
SNMP Trap
受管系统发生事件时发送给 SNMP 监控接收端的通知。[1]
Shell 插值
构造由 shell 解析的文本命令;不可信值中的字符可能改变命令含义。[8], [7]
列表形式的 system
Perl 的多参数 system 形式直接启动程序并逐项传递参数,不让 shell 解析一整条命令字符串。[9], [3]

框架映射

根本原因剖析 (Root Cause)

受影响代码位于 rpmconf/Conf/swatchrc 的 dosnmp 函数。swatch 规则从状态行中捕获服务名称,并通过 donotify 以 SERVICE 传递;dosnmp 随后把该值插入包含 $snmptrap 的反引号命令。反引号会调用 shell,因此来自日志的值可能被解析为命令语法。文档列出的前提必须同时成立:Zimbra Collaboration Suite 版本低于 10.1.20、安装了可选 zimbra-snmp 软件包且启用了 SNMP 通知。Microsoft 报告称,特制 SMTP 输入可到达此通知路径。该公司观察到扫描工具在 2026 年 7 月 28 日至 8 月 7 日探测易受攻击的注入点;这发生在 7 月 20 日补丁发布后、8 月 13 日公开披露前。Zimbra 修复将 shell 字符串替换为列表形式的 system(...),把可执行文件和参数分别传入,执行路径中不再经过 shell。本文仅分析 SNMP 通知代码,并不表示所有 Zimbra 安装或 SMTP 邮件都存在漏洞。[1], [2], [3], [5], [7]

CVE-2026-73570 受影响条件与修复矩阵

部署条件文档所述路径是否适用?防御措施
Zimbra Collaboration Suite 低于 10.1.20;已安装可选的 zimbra-snmp 软件包;已启用 SNMP 通知。文档所述通知路径需要同时满足这三个条件。Microsoft 报告称,特制 SMTP 输入可能影响服务状态值,随后由 dosnmp 处理。升级到 10.1.20 或更高版本。检查暴露期间的相关日志和进程遥测;将指标视为调查线索,而非已遭入侵的证据。
未安装 zimbra-snmp 软件包,或已禁用 SNMP 通知。此配置下,文档所述 dosnmp 通知路径未启用。这不能证明服务器不存在其他漏洞。修复服务器前保持该功能关闭或不安装该软件包。盘点所有 mailbox 节点并逐一确认设置。
Zimbra Collaboration Suite 10.1.20 或更高版本,且已安装供应商修复的软件包。文档所述 shell 命令构造问题已在 10.1.20 修复。仅凭版本号无法确认所有节点或本地修改情况。逐个节点核实安装版本和软件包;如果先前时期满足全部三个暴露条件,按常规事件响应流程进行调查。

攻击执行流程分解

步骤 1

前置条件成立

版本低于 10.1.20、安装 zimbra-snmp 且启用了 SNMP 通知。[1]

步骤 2

邮件影响服务监控值

Microsoft 报告称 SMTP 请求可能影响日志中的状态值。本文省略利用字符串和网络指令。[1]

步骤 3

swatchdog 转交该值

规则捕获服务字段,并在通知启用时通过 donotify 将其传到 dosnmp。[1]

步骤 4

Shell 把数据当作命令解析

修复前,Perl 反引号把含有捕获值的字符串交给 shell,并以 Zimbra 服务账户运行。[1]

步骤 5

10.1.20 从链路中移除 shell

修复以独立参数调用 snmptrap。完成升级并检查暴露实例;修复不能排除历史活动。[1]

源代码对比:漏洞与安全实现

有漏洞的反引号会把插值后的整条字符串交给 shell。上游补丁使用多参数 system,分别传递程序和参数,因此 SERVICE 中的元字符不会成为 shell 指令。该片段聚焦于实际改动,不是可运行的 exploit,也不是完整文件副本。[3], [4], [8], [9]

源码摘录: rpmconf/Conf/swatchrc: dosnmp

存在漏洞的实现
# 受影响 dosnmp 的精简片段;未展示利用输入。
sub dosnmp {
    my %args = (@_);
    `$snmptrap $snmpsvctrap $snmpsvcname s $args{SERVICE} $snmpsvcstatus i $statuses{$args{STATUS}}`;
}
加固后的安全修复
# Zimbra 10.1.20 修复:直接启动程序并分别传入参数。
sub dosnmp {
    my %args = (@_);
    system(
        "/opt/zimbra/common/bin/snmptrap",
        "-v", "2c", "-c", "zimbra", $traphost, "",
        $snmpsvctrap, $snmpsvcname, "s", $args{SERVICE},
        $snmpsvcstatus, "i", $statuses{$args{STATUS}}
    );
}

工程与系统安全加固清单

参考来源