Zimbra Collaboration Suite: CVE-2026-73570 Unauthenticated SNMP Command Injection / RCE
Executive Summary
CVE-2026-73570 is an unauthenticated OS command injection (CWE-78) in the SNMP notification path of Zimbra Collaboration Suite (ZCS), CVSS 3.1 8.9 (AV:N/AC:H/PR:N/UI:N/S:C/C:H/I:H/A:L). On servers where the optional zimbra-snmp package is installed and SNMP notifications are enabled (the swatchdog service that processes them runs by default once the package is present), a single crafted SMTP request, an email, reaches the service-state-to-snmptrap code path and executes arbitrary operating-system commands as the zimbra service account. No authentication and no user interaction are required.
Microsoft Threat Intelligence confirmed active in-the-wild exploitation that began before public disclosure: two distinct out-of-band scanning tools probed the injection path between July 28 and August 7, 2026, after the July 20 fix shipped but before the August 13 public disclosure. CERT Polska's August 17 advisory was the first public confirmation of an active campaign, CISA added the CVE to its Known Exploited Vulnerabilities catalog on August 21 with an August 24 federal remediation deadline, and Shadowserver tracked compromises climbing from roughly 155 internet-facing instances on August 20 to 270 or more by August 22–25, against a population of more than 12,000 reachable ZCS servers and over 8,200 still running vulnerable versions.
Post-exploitation activity converges on a narrow set of durable patterns regardless of which operator capitalizes on access: JSP web shells redundantly deployed into Jetty and mailboxd webroots across cluster nodes, a privilege-escalation chain that abuses legitimate Zimbra service helpers (zmmailboxdmgr, zmstat-fd) together with a writable log path and pam_exec to grant the zimbra account passwordless root sudo, a disguised systemd unit named zimlog.service for boot persistence, and systematic harvesting of Zimbra's own authentication secrets, zimbraPreAuthKey, zimbraAuthTokenKey, and zimbraTwoFactorAuthSecret, rather than individual mailbox passwords. Microsoft observed more than one distinct post-exploitation toolset across different compromised environments, including a separate cryptomining operator, which is consistent with multiple actors opportunistically capitalizing on the same disclosed flaw rather than one coordinated campaign.
The highest-value defensive angle is behavioral rather than signature-based: hunt the swatchdog-to-shell execution boundary itself, the PAM/sudoers manipulation sequence, and the webroot-write-then-restore-permissions pattern. These survive infrastructure rotation and catch compromises that do not match any previously published hash or domain. Atomic indicators are available from one primary investigation (Microsoft) and are shipped here as detect-only hunting leads, not as blocking rules, pending independent corroboration.
Defender priority: patch every internet-facing Zimbra server to 10.1.20 or later now. If a server carrying zimbra-snmp with SNMP notifications enabled was reachable from the Internet at any point between July 20 (fix available) and your actual patch date, treat it as compromised until proven otherwise, not merely "now patched": rotate zimbraPreAuthKey and every Zimbra service-account credential, and hunt for the persistence mechanisms in Sections 7 to 9 before closing the ticket.
Source Review & Web Hunter Notes
| Tier | Source | Key Finding | Carry Forward |
|---|---|---|---|
| 1 · Vendor/Primary | Microsoft Security Blog, Sept 30 2026 | Full attack chain, Defender XDR KQL hunts, MITRE mapping, complete network/hash IOC appendix | Yes |
| 1 · Vendor/Primary | Zimbra Tech Center release notes & Zimbra Blog, Jul 20 2026 | Official fix content for 10.1.20; confirms initial disclosure was Jun 26 2026, permanent fix Jul 20 2026 | Yes |
| 1 · Vendor/Primary | NVD CVE-2026-73570 record | Authoritative CVSS vector, CWE-78, affected version range, CISA KEV add/due dates | Yes |
| 1 · National CSIRT | CERT Polska advisory 145/2026, Aug 17 2026 | First public confirmation of active exploitation; specific /var/log/zimbra.log and webapps-directory hunting guidance | Yes |
| 2 · Security journalism | The Hacker News, Sep 30 2026 | Corroborating summary of Microsoft's findings, published same news cycle | Yes |
| 2 · Security journalism | SecurityWeek, Aug 20 2026 | CERT Polska pickup; explicit "threat actor ... remains unclear" framing; historical Zimbra targeting context | Partial (background only) |
| 2 · Security journalism | SecurityAffairs, Aug 21 2026 | Shadowserver exposure numbers; historical nation-state Zimbra targeting (Winter Vivern, APT29, APT28) offered as unrelated background, not attribution | Partial (background only) |
| 3 · Research note | Cloud Security Alliance research note, Aug 26 2026 | Explicitly separates this campaign from the unrelated LAUNDRY BEAR / Void Blizzard (CVE-2025-66376) campaign; independent compromise-count timeline (155 → 274) | Yes: critical for avoiding misattribution |
| 3 · Research note | Gridinsoft, Aug 21 2026 | Practical response checklist; explicit "attribution unknown, claims about a named campaign ... would go beyond the available evidence" statement | Partial |
| 3 · Research note | Falcon Internet Blog, Aug 25 2026 | 270+ compromised count; operator-facing version/package-check commands | Partial |
| 3 · Research note | Hive Security, Aug 25 2026 | Vulnerable / Exposed / Exploited / Compromised triage framework | Partial |
| 4 · Downstream aggregator | GBHackers, CyberPress | Repeat Microsoft's IOC table verbatim (identical values, e.g. 117.107.25[.]243:7071) | No: not independent sourcing |
Decision log
- Every atomic indicator in this pack (IPs, domains, hashes) traces to exactly one original investigation, Microsoft's. Downstream outlets repeat the same values rather than independently corroborating them. Per pipeline policy, single-sourced indicators ship
action=detectonly, neveraction=prevent, regardless of how many outlets re-publish them. - Attribution is explicitly UNKNOWN for this campaign per NVD, Gridinsoft, SecurityWeek, The Hacker News, and the Cloud Security Alliance note. No actor or campaign name is coined anywhere in this pack.
- The Cloud Security Alliance note's url slug references a separate, unrelated nation-state incident. That note explicitly states: "No security vendor, government agency, or research organization has published attribution linking a specific threat actor or nation to the CVE-2026-73570 exploitation wave." The joint CISA/NSA/FBI advisory on Russian-linked LAUNDRY BEAR / Void Blizzard activity against Zimbra concerns a different vulnerability, CVE-2025-66376 (a zero-click stored XSS, patched November 2025). That campaign's indicators, tooling (a tool the advisory calls "Ulej"), and attribution are intentionally excluded from this pack to avoid conflating two unrelated Zimbra incidents.
- Historical Zimbra targeting by Winter Vivern, APT29, and APT28 (cited by SecurityAffairs and SecurityWeek) is background context on the platform's general threat profile only. No source attributes the current SNMP command-injection campaign to any of these actors.
Hunt Brief & Attack Chain
Hunt hypotheses (ordered by fidelity)
- H1 (high): The
swatchdog-to-snmptrapcommand injection boundary itself is visible as a shell process spawned from a Zimbra service-monitoring process ancestry, carrying SNMP MIB syntax plus shell metacharacters in its command line. - H2 (high): Web shell deployment leaves a process-level trail: webroot permission changes under the
zimbraaccount followed by decode/write operations targeting Jetty or mailboxd webapps paths, then permission restoration. - H3 (high): Attacker tooling is retrieved and executed via
curl/wgetpiped directly to a shell, or downloaded thenchmod+executed, as a child of the Zimbra Java process tree. - H4 (high): Interactive reverse shells use a named pipe plus
openssl s_client, or a background/bin/sh -i, spawned from Java/jspawnhelperancestry. - H5 (high): Fileless / memory-backed execution via
memfd_createand/proc/self/fd/appears in process ancestry tied to the injection path. - H6 (high): Privilege escalation leaves a durable artifact trail: a symlink into
/etc/pam.d/, apam_exechook, invocation ofzmstat-fdoutside normal monitoring cadence, and a new/etc/sudoers.d/entry granting thezimbraaccount passwordless sudo. - H7 (high): A systemd unit resembling Zimbra logging or another core OS service, but installed from
/tmpor owned by thezimbraaccount, appears outside the normal package-management install path. - H8 (medium-high): Cron persistence (
@reboot,* * * * *) relaunches a staged binary from a world-writable or Zimbra-owned path. - H9 (high): Credential harvesting runs
zmlocalconfig -sfollowed by an authenticatedldapsearchtargetingzimbraPreAuthKey,zimbraAuthTokenKey, orzimbraTwoFactorAuthSecretoutside a scheduled administrative task. - H10 (medium): Lateral movement uses Zimbra's own pre-existing SSH identity (
/opt/zimbra/.ssh/zimbra_identity) with host-key checking disabled, paired withrsynctransfers between mailbox nodes. - H11 (medium): Pre-exploitation validation and ongoing recon chain
curl/wget/ping/nslookup/idin rapid succession from thezimbraaccount, often to out-of-band collaborator domains. - H12 (high): Collection stages a full mail-store archive (
tar zcvf) under a disguised name in a public webroot or backup path, sometimes followed byazcopyinvocation to cloud blob storage.
Attack chain
| Step | Telemetry | Hunt Angle |
|---|---|---|
| 1. Pre-disclosure / ongoing recon: OOB validation callbacks (curl/wget/ping/nslookup/id) to collaborator infrastructure; HTTP requests carry a CVE-specific user agent | Process, DNS | H11 · Q9 |
2. Initial access: crafted SMTP request reaches SNMP notification handler; swatchdog builds a snmptrap shell command from an attacker-controlled service-state value | Process (Linux sensor) | H1 · Q1 |
3. Cluster recon: zmprov enumerates mailbox/MTA nodes; attacker checks for an existing Zimbra SSH identity | Process | H10 · Q8 |
| 4. Web shell deployment: webroot permissions changed, encoded payload fragments reconstructed and decoded into JSP files under Jetty/mailboxd, permissions restored | Process (command line) | H2 · Q2 |
| 5. Tooling retrieval and execution: curl/wget pulls second-stage scripts/binaries, piped to shell or chmod+executed; background processes and interactive reverse shells established | Process, Network | H3, H4, H5 · Q3, Q4, Q5 |
| 6. Privilege escalation: PAM symlink + pam_exec + zmstat-fd grants the zimbra account passwordless root sudo | Process, File | H6 · Q6 |
| 7. Persistence: zimlog.service (or another masquerading unit) installed and enabled; cron entries added; SSH keys/local accounts modified | Process, File, systemd | H7, H8 · Q7, Q10 |
| 8. Credential harvesting: zmlocalconfig -s plus authenticated ldapsearch against Zimbra's own secret attributes | Process | H9 · Q9 |
| 9. Lateral movement: Zimbra SSH identity + rsync propagate tooling and web shells to peer cluster nodes | Process, Network | H10 · Q8 |
| 10. Collection & exfiltration attempt: full mail-store archive staged under a disguised name; azcopy invoked against operator-supplied cloud storage | Process, Network | H12 · Q10 |
Consolidated IOC Table
Every indicator below traces to a single primary investigation (Microsoft Security Blog, Sept 30 2026); downstream outlets repeat the identical values rather than independently corroborating them. Confidence is therefore capped at medium and action is capped at detect (alert/hunt), never prevent, per pipeline policy requiring two independent sources before a block action ships. Expiry assumes typical C2 infrastructure volatility.
| Type | Value | Confidence | Action | Context | Expiry |
|---|---|---|---|---|---|
| ipv4 | 117.107.25[.]243:7071 | medium | detect | Dropper C2, served de.sh | 2027-04-01 |
| ipv4 | 192.255.193[.]111:9004 | medium | detect | Cryptominer C2, served build_amd64 staged as .kworker_sys | 2027-04-01 |
| ipv4 | 45.32.30[.]235:8081 / :8080 | medium | detect | Earliest confirmed reverse-shell C2; port 8080 also used for interactive session + mail-store staging | 2027-04-01 |
| ipv4 | 193.42.40[.]135:443 | medium | detect | Organization-wide reverse-shell / recon wave | 2027-04-01 |
| ipv4 | 3.209.137[.]175:443 | medium | detect | Secondary C2, rotated-infrastructure event | 2027-04-01 |
| domain | transzimbra[.]linkpc[.]net | medium | detect | Dynamic-DNS dropper C2, served agent.sh / agent2.sh / zimdown2 | 2027-04-01 |
| domain | psk1zim[.]abrdns[.]com (path /agentws) | medium | detect | zimclient2 WebSocket (port 80) and raw TCP (8080) command channel | 2027-04-01 |
| domain | tls[.]psk1zim[.]abrdns[.]com | medium | detect | zimclient2 TLS command channel (port 443) | 2027-04-01 |
| domain | wslogzimbra[.]linkpc[.]net (path /wsstat) | medium | detect | zimdown2 installer status reporting, separate from payload hosting | 2027-04-01 |
| domain | mexico-cashpay-test.s3.dualstack.mx-central-1.amazonaws.com | medium | detect | S3-hosted tarball dropper (path /pakistan/2026/aliyun_update.tar.gz); confirmed executed on one host | 2027-04-01 |
| sha256 | dee5af1c0f76b45d28bafd6e60c07bb8e391d98addf81ef8f13d073acdb3c48a | medium | detect | de.sh dropper script | 2027-04-01 |
| sha256 | aea991f694911e321b0ab97534f2ad0291c392c0a43dabff664c563618bd036d | medium | detect | build_amd64 cryptominer | 2027-04-01 |
| sha256 | 6ab7de2509038edf580aef6229c1c3db17f4da8f2d7d940818faf617d1938244 | medium | detect | agent2.sh second-stage downloader | 2027-04-01 |
| sha256 | bf28f38122bf20d5fac969cc414daa6a890cdea872d389ca93d2092b6b7773cf | medium | detect | zimdown2 Go installer | 2027-04-01 |
| sha256 | b594a42b8f1c6f090327bb9a3361c2d3515537fb7ac8da6b9061b9a3f330e159 | medium | detect | zimclient2 remote-access agent | 2027-04-01 |
| sha256 | 65a7576c389326b6cdf9c993d0be6e5d50fed9655d1cdf2a3a50f2c21c8ec435 | medium | detect | "Looptik" LPE hacktool (GitHub-hosted toolkit staged as .lpe_core) | 2027-04-01 |
| sha256 | 22ef852f6ebc39ee71235b90648b4b200b385c47d25c79545986493f8c70db69 | medium | detect | Loader staged as "systemd-resolved"; installs /usr/sbin/_chronyd | 2027-04-01 |
| sha256 | 518fe65dd349180191d9b258ab24876aaed6613cd657d0b626d1fc24e03a22b6 | medium | detect | Decoded in-memory stage 2; Base-chain command agent | 2027-04-01 |
| other | 0x25bdA7Feb3553995AD68a9A8Ed8c731b73a71586 | low | pivot | Base mainnet smart-contract address used as a dead-drop C2 resolver for the memfd-executed stage, polled over public JSON-RPC. Not a Falcon-importable IOC type; investigate via JSON-RPC body inspection, not host blocking. | 2027-01-01 |
Behavioral indicators (not atomic, confidence high: primary detection surface)
- Service-state string fed into a
snmptrapinvocation containing shell metacharacters (;,&,|, backticks,$(...)) - Systemd unit named
zimlog.service(or any unit masquerading as Zimbra/OS logging:chronyd-helper.service,syslog_init.service) owned by thezimbraaccount - A symlink placed at
/etc/pam.d/sudoor a file under/etc/pam.d/owned byzimbra - A sudoers fragment under
/etc/sudoers.d/(observed as81_metric) grantingzimbraNOPASSWD:ALL - Named pipe at
/tmp/sfeeding an interactive shell intoopenssl s_client - Masquerade filenames:
.kworker_sys,.lpe_core,_chronyd, a mail archive saved with a.icoextension
Affected Surface & Telemetry Matrix
| Surface | Required Telemetry | Priority | Gap Risk |
|---|---|---|---|
Zimbra mail/MTA server (RHEL/Ubuntu Linux host) with zimbra-snmp installed and SNMP notifications enabled | Falcon Linux sensor: process execution, network connect, DNS | Critical | Low: process telemetry is the primary signal and is well covered |
Jetty / mailboxd web application directories (/opt/zimbra/jetty/webapps/, /opt/zimbra/jetty_base/webapps/, /opt/zimbra/mailboxd/webapps/) | File-write telemetry; where unavailable, process command-line evidence of the write | Critical | Medium: Falcon's Linux file-write events are scoped to known executable/archive types (ELF, JAR, ZIP); a plain JSP text write does not reliably generate a typed FileWritten event. Compensate with process-level hunting on the decode/write command (Q2). |
LDAP service (cn=config,cn=zimbra) holding zimbraPreAuthKey / zimbraAuthTokenKey / zimbraTwoFactorAuthSecret | LDAP audit log; process telemetry for ldapsearch invocations | Critical | Medium: depends on LDAP audit logging being enabled; process-level ldapsearch command-line hunting is the fallback |
Local MySQL instance (mailbox, mailbox_metadata, mobile_devices, out_of_office, zimbra.*) | MySQL query/audit log; process telemetry for the exporting client | High | Medium: most environments do not enable MySQL query logging by default |
| Cluster peer mailbox/MTA nodes reachable via the Zimbra SSH identity | Falcon Linux sensor on every node, not only the initially compromised one; SSH/auth logs | Critical | High: coverage gaps on secondary nodes are the most common reason lateral movement is missed |
| SNMP trap transport itself (UDP) | Network/NDR visibility into the SNMP payload | Informational | Gap: Falcon does not inspect SNMP trap payload content at the network layer; detection depends entirely on host-level process visibility on the Zimbra server (Q1), not network sensors |
ATT&CK Mapping
| Tactic | Technique | Observed Behavior | Query / Control |
|---|---|---|---|
| Reconnaissance | T1595.002 Active Scanning: Vulnerability Scanning | Canary subdomains probed via ping/nslookup callbacks with no payload delivered | Q9 |
| Initial Access | T1190 Exploit Public-Facing Application | Crafted SMTP request into SNMP notification processing, executing as the zimbra account | Q1 |
| Execution | T1059.004 Command and Scripting Interpreter: Unix Shell | perl to dash/bash/sh; de.sh, agent2.sh piped into a shell | Q1, Q3 |
| Execution | T1105 Ingress Tool Transfer | curl, wget, python, /dev/tcp download fallbacks | Q3 |
| Privilege Escalation | T1068 Exploitation for Privilege Escalation | PAM symlink + pam_exec + zmstat-fd chain grants passwordless root sudo; separate GitHub LPE toolkit staged as .lpe_core | Q6 |
| Persistence | T1053.003 Scheduled Task/Job: Cron | @reboot and * * * * * entries relaunching staged binaries | Q10 |
| Persistence | T1543.002 Create or Modify System Process: Systemd Service | zimlog.service (or chronyd-helper.service / syslog_init.service) installed, enabled, and timestomped | Q7 |
| Persistence | T1505.003 Server Software Component: Web Shell | Multiple JSP web shells across Zimbra application paths, propagated to peer nodes | Q2 |
| Defense Evasion | T1036.005 Masquerading: Match Legitimate Name or Location | systemd-resolved, _chronyd, .kworker_sys, mail archive saved as .ico | Q2, Q7, Q10 |
| Defense Evasion | T1620 Reflective Code Loading | XOR-decoded ELF run from memfd_create via /proc/self/fd | Q5 |
| Discovery | T1018 Remote System Discovery | zmprov cluster mapping of mailbox/MTA nodes | Q8 |
| Discovery | T1083 File and Directory Discovery | Operator directory listings; droppers probing writable, executable staging paths | Q3 |
| Credential Access | T1552.001 Unsecured Credentials: Credentials In Files | zmlocalconfig -s exposes LDAP/MySQL/Postfix/Amavis/replication credentials from localconfig.xml | Q9 |
| Credential Access | T1555 Credentials from Password Stores | Authenticated ldapsearch retrieves zimbraPreAuthKey, zimbraAuthTokenKey, zimbraTwoFactorAuthSecret | Q9 |
| Lateral Movement | T1021.004 Remote Services: SSH | Zimbra's own SSH identity used in noninteractive mode with host-key verification disabled | Q8 |
| Lateral Movement | T1570 Lateral Tool Transfer | rsync moves staged payload fragments and JSP web shells between cluster nodes | Q8 |
| Command and Control | T1071.001 Application Layer Protocol: Web Protocols | WebSocket tasking with TLS and raw TCP fallbacks | Q4 |
| Command and Control | T1102.001 Web Service: Dead Drop Resolver | Encrypted commands polled from a Base mainnet smart contract over public JSON-RPC | Section 4 (pivot) |
| Collection | T1560.001 Archive Collected Data: Archive via Utility | tar zcvf of the full Zimbra mail store, run more than once | Q10 |
| Collection | T1074.001 Data Staged: Local Data Staging | Archive written into the public Zimbra web directory under a disguised name (e.g. five.ico) | Q10 |
| Exfiltration | T1567.002 Exfiltration to Cloud Storage | AzCopy invoked with an operator-supplied SAS URL against Azure Blob Storage | Q10 |
| Impact | T1496 Resource Hijacking | Miner staged as .kworker_sys; rival miners killed and pools sinkholed via /etc/hosts | Q3, Q5 |
Native Audit-Log Hunts
Non-CQL checks that work even without EDR coverage on a given node. Run these first on any Zimbra host that was ever reachable from the Internet with zimbra-snmp installed.
1. CERT Polska log signature (translated from advisory 145/2026)
grep -E "Service status change: .* changed from (stopped to running|running to stopped)" /var/log/zimbra.log
A legitimate service transition names the service; an injected payload appears in place of (or appended to) the service name. Treat any non-standard service-name token here as a confirmed exploitation attempt, not a false positive to tune away.
2. Web-shell / staged-file sweep (CERT Polska + Hive Security)
find /opt/zimbra/jetty/webapps /opt/zimbra/jetty_base/webapps /opt/zimbra/mailboxd/webapps /tmp -user zimbra -mtime -30 -ls
Record path, owner, timestamps, and hash of every result before deleting anything; do not clean up before evidence is preserved.
3. Version and exposure check (Falcon Internet Blog / Gridinsoft)
su - zimbra -c "zmcontrol -v" # expect 10.1.20 or later rpm -qa | grep zimbra-snmp # RHEL/CentOS dpkg -l | grep zimbra-snmp # Ubuntu/Debian su - zimbra -c "zmswatchctl status"
4. PAM / sudoers integrity check
ls -la /etc/pam.d/sudo stat /etc/pam.d/sudo grep -r "pam_exec" /etc/pam.d/ ls -la /etc/sudoers.d/ grep -ril "zimbra" /etc/sudoers.d/ 2>/dev/null
A sudo PAM file not owned by root, a pam_exec line you did not add, or any /etc/sudoers.d/ fragment naming the zimbra account is a confirmed privilege-escalation indicator.
5. Systemd unit audit
systemctl list-unit-files --type=service | grep -Ev "^(UNIT|$)"
for u in $(systemctl list-unit-files --type=service --no-legend | awk '{print $1}'); do
stat --format='%Y %U %n' "/etc/systemd/system/$u" 2>/dev/null
done | sort -n
Look for a unit file owned by zimbra, a unit whose modification time sits suspiciously close to unrelated core services (rsync.service, sshd.service, the timestomp pattern Microsoft observed), or any unit name that resembles Zimbra logging but was not installed by the Zimbra package manager.
6. LDAP secret-attribute access review
zmprov gaa | xargs -I{} echo {} # cluster inventory baseline
grep -i "zimbraPreAuthKey\|zimbraAuthTokenKey\|zimbraTwoFactorAuthSecret" /opt/zimbra/log/ldap_audit.log 2>/dev/null
If LDAP audit logging is not enabled, enable it going forward; its absence is itself a coverage gap to note in Section 5.
CrowdStrike LogScale CQL Hunt Queries
Looks for: The exact swatchdog-to-snmptrap-to-shell boundary Microsoft confirmed in every observed exploitation event. FP: none expected.
// HUNT: Confirmed SNMP-to-shell command injection boundary (CVE-2026-73570) // MITRE: T1190 // CONF: high FP: low COST: low | REQUIRES: Falcon Linux sensor on Zimbra host(s) // FALSE POSITIVES: none expected; snmptrap does not legitimately receive shell metacharacters #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/ | FileName=/^(sh|bash|dash)$/i | ParentBaseFileName=/^perl$/i | CommandLine=/snmptrap/i | CommandLine=/zmservicename|zmservicestatus/i | table([aid, ComputerName, UserName, FileName, CommandLine, ParentBaseFileName, ParentCommandLine, ProcessStartTime])
Looks for: Decode/write/permission operations targeting Jetty or mailboxd webapps paths with a .jsp target. FP: see TUNING in card.
// HUNT: Suspicious decode/write into Zimbra Jetty or mailboxd webapps directories (JSP web shell staging) // MITRE: T1505.003 // CONF: high FP: medium COST: medium | REQUIRES: Falcon Linux sensor; process command-line visibility // FALSE POSITIVES: Zimbra version upgrades and vendor-applied patches legitimately write files under webapps // TUNING: exclude CommandLine containing the Zimbra installer/upgrade paths (*/zmsetup* or */installer*) and your documented patch-maintenance window; baseline normal patch activity before enabling in production #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/ | FileName=/^(sh|bash|dash|base64|printf|tee|chmod|chown|perl|java)$/i | CommandLine="*webapps*" | CommandLine=/\.jsp/i | table([aid, ComputerName, UserName, FileName, CommandLine, ParentBaseFileName, ProcessStartTime])
Looks for: curl/wget spawned directly by java or jspawnhelper, the second-stage download step. FP: see TUNING in card.
// HUNT: Tooling retrieval via curl/wget spawned from the Zimbra Java process tree // MITRE: T1105 // CONF: high FP: medium COST: low | REQUIRES: Falcon Linux sensor // FALSE POSITIVES: rare legitimate Java-based health-check or license-validation routines that shell out to curl // TUNING: exclude known Zimbra health-check/license-validation process hashes or command lines for your environment; confirm the destination host is not an allow-listed internal update mirror #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/ | FileName=/^(curl|wget)$/i | ParentBaseFileName=/^(java|jspawnhelper)$/i | table([aid, ComputerName, UserName, FileName, CommandLine, ParentBaseFileName, ParentProcessId, ProcessStartTime])
Looks for: A named pipe feeding an interactive shell into an encrypted openssl session, spawned from Java ancestry. FP: none expected.
// HUNT: Interactive reverse shell via named pipe + openssl s_client, spawned from Java/jspawnhelper ancestry // MITRE: T1059.004, T1071.001 // CONF: high FP: low COST: low | REQUIRES: Falcon Linux sensor // FALSE POSITIVES: none expected; Zimbra's Java/mailboxd process tree does not legitimately create named pipes to feed an interactive shell #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/ | FileName=/^(sh|bash|dash|openssl)$/i | ParentBaseFileName=/^(java|jspawnhelper)$/i | CommandLine=/mkfifo|s_client|\s-i\b/i | table([aid, ComputerName, UserName, FileName, CommandLine, ParentBaseFileName, ProcessStartTime])
Looks for: Anonymous memfd-backed process execution or /proc/self/fd re-exec. FP: rare; verify ancestry.
// HUNT: Memory-backed / fileless execution via memfd_create and /proc/self/fd // MITRE: T1620 // CONF: high FP: low COST: medium | REQUIRES: Falcon Linux sensor // FALSE POSITIVES: a small number of legitimate container runtimes and self-updating agents use memfd_create; verify process ancestry #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/ | FileName=/^memfd:/i or CommandLine="*/proc/self/fd/*" | table([aid, ComputerName, UserName, FileName, ImageFileName, CommandLine, ParentBaseFileName, ProcessStartTime])
Looks for: zmmailboxdmgr/zmstat-fd touching PAM config or sudoers.d, the documented root-escalation path. FP: none expected.
// HUNT: PAM/sudoers privilege-escalation chain (zmmailboxdmgr / zmstat-fd / pam_exec abuse) // MITRE: T1068 // CONF: high FP: low COST: low | REQUIRES: Falcon Linux sensor // FALSE POSITIVES: none expected under normal operation; Zimbra does not legitimately modify PAM config or sudoers.d via zmmailboxdmgr/zmstat-fd #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/ | FileName=/^(ln|cp|mv|zmstat-fd|zmmailboxdmgr)$/i | CommandLine="*pam.d*" or CommandLine="*sudoers.d*" or CommandLine=/pam_exec/i | table([aid, ComputerName, UserName, FileName, CommandLine, ParentBaseFileName, ProcessStartTime])
Looks for: A systemd unit written under /etc/systemd/system/ attributed to the zimbra account. FP: see TUNING in card.
// HUNT: Masquerading systemd unit installed/enabled by the zimbra account (zimlog.service pattern) // MITRE: T1543.002, T1036.005 // CONF: high FP: medium COST: low | REQUIRES: Falcon Linux sensor // FALSE POSITIVES: configuration-management tools (Ansible/Puppet/Chef) running under service accounts can legitimately write unit files // TUNING: exclude your known configuration-management automation accounts and their documented unit-file deployment paths; alert only on unit writes attributed to the zimbra account outside a change window #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/ | FileName=/^(systemctl|mv|cp)$/i | CommandLine="*/etc/systemd/system/*" | UserName=/^zimbra$/i | table([aid, ComputerName, UserName, FileName, CommandLine, ParentBaseFileName, ProcessStartTime])
Looks for: zmprov cluster enumeration, or ssh/rsync using Zimbra's own identity with host-key checking disabled. FP: see TUNING in card.
// HUNT: Cluster recon and lateral movement via the existing Zimbra SSH identity and rsync // MITRE: T1018, T1021.004, T1570 // CONF: medium FP: medium COST: low | REQUIRES: Falcon Linux sensor on every cluster node // FALSE POSITIVES: legitimate backup and cluster-sync jobs routinely use zmprov gaa and the Zimbra SSH identity // TUNING: exclude your documented backup/sync job command lines and scheduled maintenance windows; alert only on invocations outside those windows or combined with another hunt hit in this pack #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/ | FileName=/^(ssh|rsync|zmprov)$/i | CommandLine="*zimbra_identity*" or CommandLine=/StrictHostKeyChecking/i or CommandLine=/zmprov\s+gaa/i | table([aid, ComputerName, UserName, FileName, CommandLine, ParentBaseFileName, ProcessStartTime])
Looks for: zmlocalconfig -s or ldapsearch targeting zimbraPreAuthKey / zimbraAuthTokenKey / zimbraTwoFactorAuthSecret. FP: see TUNING in card.
// HUNT: Zimbra service-credential and authentication-secret harvesting (zmlocalconfig -s / ldapsearch) // MITRE: T1552.001, T1555 // CONF: high FP: medium COST: low | REQUIRES: Falcon Linux sensor // FALSE POSITIVES: backup, provisioning, and monitoring automation legitimately call zmlocalconfig -s on a schedule // TUNING: exclude the specific service accounts and scripts your backup/provisioning automation uses to call zmlocalconfig -s; alert on ad hoc interactive invocations or ldapsearch from an unexpected parent process #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/ | FileName=/^(zmlocalconfig|ldapsearch)$/i | CommandLine=/zmlocalconfig\s+-s/i or CommandLine=/zimbraPreAuthKey|zimbraAuthTokenKey|zimbraTwoFactorAuthSecret/i | table([aid, ComputerName, UserName, FileName, CommandLine, ParentBaseFileName, ProcessStartTime])
Looks for: tar staging of the mail store paired with AzCopy or Azure Blob Storage activity. FP: see TUNING in card.
// HUNT: Mail-store collection staging and cloud-storage exfiltration attempt (tar + AzCopy) // MITRE: T1560.001, T1074.001, T1567.002 // CONF: high FP: medium COST: medium | REQUIRES: Falcon Linux sensor // FALSE POSITIVES: nightly backup jobs legitimately run tar against the mail store // TUNING: exclude your documented nightly backup job's command line or hash; alert only when tar activity is paired with azcopy or blob.core.windows.net, or when the archive lands in a public webroot instead of the backup path #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/ | FileName=/^(tar|azcopy|curl|wget)$/i | CommandLine=/\.tar\.gz/i or CommandLine="*downloadazcopy*" or CommandLine="*blob.core.windows.net*" | table([aid, ComputerName, UserName, FileName, CommandLine, ParentBaseFileName, ProcessStartTime])
CrowdStrike Custom IOA Recommendations
Three queries are unambiguous and low-noise enough to promote from investigate-only hunts to Custom IOAs. Deploy each in audit/detect-only mode against the Zimbra host group for at least one full business cycle before switching to a prevent action.
| IOA Name | Source Query | Pattern | Exclusions | Deployment Path |
|---|---|---|---|---|
| Zimbra SNMP Command Injection Boundary | Q1 | Process tree: perl (swatchdog context) → sh/bash/dash containing snmptrap + zm service tokens | None known; alert in detect mode first for one cycle to confirm no environment-specific swatchdog wrapper triggers it | Falcon console → Custom IOAs → Linux → scope to the Zimbra host group → audit mode 7 days → enforce |
| Zimbra PAM/Sudoers Escalation Chain | Q6 | zmmailboxdmgr / zmstat-fd process touching /etc/pam.d or /etc/sudoers.d | None known | Same console path; audit mode 7 days → enforce |
| Masquerading Systemd Unit by zimbra Account | Q7 | systemctl/mv/cp writing into /etc/systemd/system under the zimbra account | Add your configuration-management service account(s) to the exclusion list before enabling | Same console path; audit mode 14 days (to span a patch cycle) → enforce |
The remaining seven queries (Q2–Q5, Q8–Q10) stay as investigate-only hunt queries: each carries a documented medium-or-higher FP source (webapps patch activity, backup automation, health-check scripts) that is better handled with a human reviewing hits than an automatic prevent action.
Machine-Readable IOC Appendix
All CSV rows below are action=detect only. They trace to a single primary investigation (Microsoft); do not promote to prevent without independent corroboration.
type,value,action,severity,expiration,description,tags ipv4,117.107.25.243,detect,high,2027-04-01,Zimbra CVE-2026-73570 dropper C2 serving de.sh,cve-2026-73570 ipv4,192.255.193.111,detect,medium,2027-04-01,Zimbra CVE-2026-73570 cryptominer C2 serving build_amd64,cve-2026-73570 ipv4,45.32.30.235,detect,high,2027-04-01,Zimbra CVE-2026-73570 reverse-shell C2 (ports 8080/8081),cve-2026-73570 ipv4,193.42.40.135,detect,high,2027-04-01,Zimbra CVE-2026-73570 org-wide reverse-shell/recon wave C2,cve-2026-73570 ipv4,3.209.137.175,detect,medium,2027-04-01,Zimbra CVE-2026-73570 secondary/rotated C2,cve-2026-73570 domain,transzimbra.linkpc.net,detect,high,2027-04-01,Zimbra CVE-2026-73570 dropper C2 (agent.sh/agent2.sh/zimdown2),cve-2026-73570 domain,psk1zim.abrdns.com,detect,high,2027-04-01,Zimbra CVE-2026-73570 zimclient2 WebSocket/TCP channel,cve-2026-73570 domain,tls.psk1zim.abrdns.com,detect,high,2027-04-01,Zimbra CVE-2026-73570 zimclient2 TLS channel,cve-2026-73570 domain,wslogzimbra.linkpc.net,detect,medium,2027-04-01,Zimbra CVE-2026-73570 zimdown2 installer status reporting,cve-2026-73570 domain,mexico-cashpay-test.s3.dualstack.mx-central-1.amazonaws.com,detect,medium,2027-04-01,Zimbra CVE-2026-73570 S3-hosted tarball dropper host,cve-2026-73570 sha256,dee5af1c0f76b45d28bafd6e60c07bb8e391d98addf81ef8f13d073acdb3c48a,detect,high,2027-04-01,Zimbra CVE-2026-73570 de.sh dropper script,cve-2026-73570 sha256,aea991f694911e321b0ab97534f2ad0291c392c0a43dabff664c563618bd036d,detect,medium,2027-04-01,Zimbra CVE-2026-73570 build_amd64 cryptominer,cve-2026-73570 sha256,6ab7de2509038edf580aef6229c1c3db17f4da8f2d7d940818faf617d1938244,detect,high,2027-04-01,Zimbra CVE-2026-73570 agent2.sh second-stage downloader,cve-2026-73570 sha256,bf28f38122bf20d5fac969cc414daa6a890cdea872d389ca93d2092b6b7773cf,detect,high,2027-04-01,Zimbra CVE-2026-73570 zimdown2 Go installer,cve-2026-73570 sha256,b594a42b8f1c6f090327bb9a3361c2d3515537fb7ac8da6b9061b9a3f330e159,detect,high,2027-04-01,Zimbra CVE-2026-73570 zimclient2 remote-access agent,cve-2026-73570 sha256,65a7576c389326b6cdf9c993d0be6e5d50fed9655d1cdf2a3a50f2c21c8ec435,detect,medium,2027-04-01,Zimbra CVE-2026-73570 Looptik LPE hacktool,cve-2026-73570 sha256,22ef852f6ebc39ee71235b90648b4b200b385c47d25c79545986493f8c70db69,detect,medium,2027-04-01,Zimbra CVE-2026-73570 loader staged as systemd-resolved,cve-2026-73570 sha256,518fe65dd349180191d9b258ab24876aaed6613cd657d0b626d1fc24e03a22b6,detect,high,2027-04-01,Zimbra CVE-2026-73570 decoded in-memory stage 2 (Base-chain command agent),cve-2026-73570
# Behavioral signatures (not atomic; these are the durable detections -- see Section 8 for full CQL) snmptrap invocation immediately followed by shell metacharacters (; & | ` $()) in a service-state value systemd unit named zimlog.service, chronyd-helper.service, or syslog_init.service owned by the zimbra account symlink placed at /etc/pam.d/sudo, or any /etc/pam.d/ file owned by zimbra /etc/sudoers.d/ fragment granting zimbra NOPASSWD:ALL (observed filename: 81_metric) named pipe /tmp/s feeding an interactive shell into openssl s_client masquerade filenames: .kworker_sys, .lpe_core, _chronyd, a mail-store archive saved with a .ico extension webroot permission change (chmod/chown) under the zimbra account immediately followed by a .jsp write, then permission restoration
# Named malware / tooling observed (Microsoft Defender family names; not independently confirmed by a second vendor) Chopper -- JSP web shell family GodzillaWebShell -- JSP web shell family CoinMiner -- generic cryptominer detection (build_amd64 payload) Looptik -- LPE hacktool (GitHub-hosted toolkit staged as .lpe_core) SuspGoLang -- generic Go-binary heuristic (covers zimdown2 / zimclient2 / zimbra-exfil family) Dirtelti -- generic backdoor heuristic zimdown2 -- Go installer; verifies the next stage via SHA-256 before execution zimclient2 -- full remote-access agent: interactive shell, bidirectional file transfer, SOCKS5 proxy (WebSocket/TLS/raw TCP) zimbra-exfil / client-dump -- Go implant reading /opt/zimbra/conf/localconfig.xml and exporting mailbox/LDAP secrets
# Patch / exposure audit one-liners su - zimbra -c "zmcontrol -v" # must report 10.1.20 or later rpm -qa | grep zimbra-snmp # RHEL/CentOS: is the optional package present? dpkg -l | grep zimbra-snmp # Ubuntu/Debian equivalent su - zimbra -c "zmswatchctl status" # is the SNMP watchdog running? # Temporary mitigation if patching must wait (CERT Polska): su - zimbra -c "zmswatchctl stop" # then set zimbraServiceEnabled snmp to FALSE via zmprov in LDAP
Detection Validation Gates
| Gate | Requirement | Status in this pack |
|---|---|---|
| Telemetry ready | Falcon Linux sensor installed and healthy on every Zimbra mailbox/MTA node, not only the edge-facing one | Verify per-tenant: cluster-wide coverage is the most common gap (Section 5) |
| Benign baseline | Run Q2, Q3, Q7, Q8, Q9, Q10 in investigate mode for at least one full patch/backup cycle before enabling any automated action | Required before go-live |
| Positive tests | Confirm Q1 and Q6 fire against a controlled lab reproduction of the swatchdog/PAM chain, or against Microsoft's published Defender XDR query logic translated 1:1 | Logic verified against Microsoft's own KQL |
| Promotion criteria | Zero FP hits across the full baseline window before moving Q1/Q6/Q7 from audit to enforce as Custom IOAs | Pending tenant-specific validation |
Hardening: Tiered & Deployable
- Patch to ZCS 10.1.20 or later on every node. MITRE M1051 (Update Software). Verify:
su - zimbra -c "zmcontrol -v"reports 10.1.20+ on every node. Source: Zimbra official release notes (Section 18, ref 12/13). - If patching must wait: uninstall the
zimbra-snmppackage or disable SNMP notifications and stopswatchdog. MITRE M1042 (Disable or Remove Feature or Program). Verify:rpm -qa | grep zimbra-snmp/dpkg -l | grep zimbra-snmpreturns nothing, orzmswatchctl statusshows stopped. Source: CERT Polska advisory (ref 4). - Restrict SNMP/SMTP exposure and the admin console (TCP 7071) to trusted management networks only. MITRE M1030 (Network Segmentation); CIS Control 12. Verify: external port scan of the Zimbra host shows 7071 closed to the Internet.
- Rotate Zimbra authentication secrets on every node that was ever reachable with the vulnerable configuration:
zimbraPreAuthKey, LDAP/MySQL/Postfix/Amavis/replication service credentials. ⚠ best-practice, no formal CIS/benchmark entry for Zimbra-specific secret rotation; cite NIST SP 800-63B credential-rotation guidance. Verify: comparezmlocalconfig -soutput timestamps against the rotation date.
- Deploy EDR (Falcon or equivalent) to every Zimbra node, including MTA-only nodes, and run the Custom IOAs from Section 9 in audit mode before enforce. ⚠ best-practice, no formal CIS entry; aligned with CIS Control 8 (Audit Log Management) and 13 (Network Monitoring). Verify: sensor health check reports all nodes online.
- Add auditd watches on
/etc/pam.d/,/etc/sudoers.d/,/etc/systemd/system/, and the Jetty/mailboxd webapps directories. MITRE M1022 (Restrict File and Directory Permissions); CIS Control 3. Verify:auditctl -lshows the watches active. - Confine the zimbra service account with namespace, seccomp, or AppArmor controls to reduce blast radius of any future command-injection-class vulnerability. MITRE M1026 (Privileged Account Management). This is Microsoft's own stated recommendation. Verify:
aa-status(AppArmor) or equivalent shows an active profile for Zimbra processes.
- Establish an accelerated patch SLA for self-hosted collaboration platforms, treating them as a persistently high-risk asset class (Cloud Security Alliance recommendation, given the recurrence of independently exploited Zimbra CVEs within months of each other).
- Filter outbound traffic from Zimbra hosts to an allow-list of required destinations (package mirrors, license servers) to curb C2/exfiltration callbacks. MITRE M1037 (Filter Network Traffic).
- Evaluate migration or consolidation of SNMP-based monitoring away from a model that shells out to
snmptrapwith unsanitized service-state strings, in coordination with Zimbra support.
Deployable Playbooks
Playbook A: Emergency patch and exposure reduction
Step 1: Confirm current version and exposure su - zimbra -c "zmcontrol -v" rpm -qa | grep zimbra-snmp # or: dpkg -l | grep zimbra-snmp Prerequisites: root or sudo access to the Zimbra host; read-only, safe to run anytime. Reboot required: No. Rollback: None required (read-only check). Step 2: Patch to ZCS 10.1.20 or later following Zimbra's documented upgrade procedure for your OS. Prerequisites: Maintenance window; current full backup of /opt/zimbra and the LDAP/MySQL data directories; Zimbra support contract active if on a legacy branch requiring a supported upgrade path. Reboot required: Yes, Zimbra services restart as part of the upgrade; a host reboot is not required but is commonly scheduled alongside it. Rollback: Restore from the pre-upgrade backup and reinstall the prior ZCS package version per Zimbra's documented downgrade process. Downgrading does NOT remove any persistence an attacker planted while the host was vulnerable -- run Playbook B and C regardless of upgrade/rollback outcome. Step 3: If patching must wait, disable the vulnerable path immediately. su - zimbra -c "zmswatchctl stop" zmprov mcf zimbraServiceEnabled snmp # then remove 'snmp' from the enabled service list via zmprov ms <server> -zimbraServiceEnabled snmp Prerequisites: zimbra account shell access; confirm no internal tooling depends on SNMP traps from this host before disabling. Reboot required: No; service restart only (zmcontrol restart recommended to apply cleanly). Rollback: Re-enable with zmprov ms <server> +zimbraServiceEnabled snmp and zmswatchctl start, once patched to 10.1.20+. Step 4: Restrict network exposure. # On the host firewall or upstream security group, block inbound TCP 7071 (admin console) # and UDP/TCP SNMP-related ports from all sources except a defined management CIDR. Prerequisites: Identify and document the management CIDR before applying; confirm no legitimate remote admin workflow is broken. Reboot required: No. Rollback: Remove the added firewall/security-group rule to restore prior connectivity.
Playbook B: PAM/sudoers integrity lockdown and auditd watches
Step 1: Verify current PAM/sudoers integrity. stat /etc/pam.d/sudo ls -la /etc/sudoers.d/ grep -r "pam_exec" /etc/pam.d/ Prerequisites: root access; read-only. Reboot required: No. Rollback: None required (read-only check). Step 2: If a symlink or unexpected pam_exec hook is found, restore /etc/pam.d/sudo from a known-good package copy and remove the rogue /etc/sudoers.d/ fragment. rpm -V zimbra-core # or the relevant package providing the PAM config, to compare against pristine rm /etc/sudoers.d/<rogue-fragment> Prerequisites: Confirm the fragment is attacker-created, not a legitimate local policy, before removing; take a copy for evidence first. Reboot required: No. Rollback: If removal breaks an unrelated legitimate sudo policy, restore the fragment from the evidence copy and re-investigate. Step 3: Add auditd watches for future tampering. auditctl -w /etc/pam.d/ -p wa -k zimbra_pam_watch auditctl -w /etc/sudoers.d/ -p wa -k zimbra_sudoers_watch auditctl -w /etc/systemd/system/ -p wa -k zimbra_systemd_watch Prerequisites: auditd installed and running; confirm watch count does not exceed kernel audit rule limits. Reboot required: No; rules persist across reboot only if also added to /etc/audit/rules.d/. Rollback: auditctl -W /etc/pam.d/ -p wa -k zimbra_pam_watch (and equivalents) to remove the watch.
Playbook C: Credential rotation runbook
Step 1: Capture current secrets for comparison/evidence (do this BEFORE rotating). su - zimbra -c "zmlocalconfig -s" > /root/zimbra_localconfig_pre_rotation.evidence Prerequisites: Secure storage for the evidence file; restrict access immediately (chmod 600, root-owned). Reboot required: No. Rollback: Not applicable (evidence capture only). Step 2: Rotate zimbraPreAuthKey and zimbraAuthTokenKey. zmprov generateDomainPreAuthKey <domain> # Review Zimbra documentation for the authtoken-key rotation procedure for your version; # this invalidates all active user sessions domain-wide. Prerequisites: Maintenance window; notify users that they will be signed out of active webmail sessions. Reboot required: Yes, mailboxd restart required to pick up new key material. Rollback: Restore the pre-rotation localconfig.xml from backup if rotation causes an outage; re-attempt rotation once the root cause is identified. Note: rolling back the key material re-exposes any attacker who captured the old key, so only roll back operationally, then re-rotate promptly. Step 3: Rotate LDAP/MySQL/Postfix/Amavis/replication service credentials. # Follow Zimbra's documented zmlocalconfig credential-rotation procedure per service. Prerequisites: Full service restart planned; backup of localconfig.xml before changes. Reboot required: Yes, affected services restart. Rollback: Restore localconfig.xml and the corresponding service account passwords from the pre-rotation backup.
Containment Runbook
| Phase | Actions | Owner | Evidence to Preserve |
|---|---|---|---|
| Isolate | Network-isolate the affected Zimbra node (retain management access); do not power off. Disable the zimbra-snmp package / stop swatchdog on every other node sharing the same configuration while triage proceeds. | IR lead + Infra on-call | Live memory/process snapshot before isolation if feasible; current /var/log/zimbra.log, auth logs, and systemd unit list |
| Eradicate | Remove confirmed JSP web shells across every node (check peer nodes too, not just the entry point). Restore /etc/pam.d/sudo and remove the rogue /etc/sudoers.d/ entry. Disable and remove the masquerading systemd unit. Remove cron persistence entries and any added local accounts or SSH authorized_keys. | IR lead | Copy of every removed artifact (path, owner, timestamps, hash) before deletion |
| Recover | Patch to 10.1.20+. Rotate all Zimbra authentication secrets and service-account credentials (Playbook C). Rebuild from known-good media if root compromise cannot be fully scoped. Restore only verified-clean mail data. | Infra + IR lead | Post-rotation verification output; confirmation of clean zmcontrol -v and auditd watch status |
| Post-incident | Review LDAP/MySQL access logs for the exposure window for evidence of mailbox or secret-attribute access. Notify affected users if session tokens or mailbox contents were confirmed accessed. Update the patch-SLA process per Section 12 strategic tier. | IR lead + Legal/Privacy as applicable | Final incident timeline and scope statement |
Detection Coverage Map
| Technique | Behavior | CQL | IOA | Coverage |
|---|---|---|---|---|
| T1190 Exploit Public-Facing Application | SNMP command injection boundary | Q1 | Zimbra SNMP Command Injection Boundary | Good |
| T1505.003 Server Software Component: Web Shell | JSP web shell staging in webapps directories | Q2 | N/A | Partial: process-level proxy for a file-write event Falcon does not natively type for JSP |
| T1105 Ingress Tool Transfer | curl/wget from Java process tree | Q3 | N/A | Good |
| T1059.004 / T1071.001 | Named-pipe reverse shell over openssl s_client | Q4 | N/A | Good |
| T1620 Reflective Code Loading | memfd_create / fileless execution | Q5 | N/A | Good |
| T1068 Exploitation for Privilege Escalation | PAM/sudoers escalation chain | Q6 | Zimbra PAM/Sudoers Escalation Chain | Good |
| T1543.002 / T1036.005 | Masquerading systemd persistence | Q7 | Masquerading Systemd Unit by zimbra Account | Good |
| T1018 / T1021.004 / T1570 | Cluster recon and lateral movement via Zimbra SSH identity | Q8 | N/A | Partial: requires sensor coverage on every peer node, not just the entry host |
| T1552.001 / T1555 | Authentication-secret harvesting | Q9 | N/A | Good |
| T1560.001 / T1074.001 / T1567.002 | Mail-store collection and cloud exfiltration | Q10 | N/A | Good |
| T1595.002 Active Scanning | Out-of-band validation callbacks to collaborator infrastructure | N/A | N/A | Gap: requires DNS/proxy telemetry this pack does not cover; add a DNS-query hunt for known OOB collaborator domains (oast.fun, oast.online, dnslog.pp.ua, requestrepo.com, bypass.eu.org) if that telemetry source is available |
| T1102.001 Web Service: Dead Drop Resolver | Base-chain smart-contract C2 polling | N/A | N/A | Gap: not observable via endpoint process/network telemetry alone; requires JSON-RPC body inspection at a network proxy, out of scope for this pack |
| SNMP trap transport itself (UDP) | N/A: network-layer payload | N/A | N/A | Gap: not inspected by Falcon at the network layer; fully covered indirectly via Q1's process-level detection of the resulting shell execution |
Validation gate status is tracked in Section 11. Telemetry-coverage gaps (cluster-wide sensor deployment, DNS visibility for OOB callbacks) are the two items most likely to leave a real compromise undetected in this pack as currently scoped.
Hunt Summary Ticket
TITLE: Zimbra Collaboration Suite CVE-2026-73570 -- Unauthenticated SNMP Command Injection / RCE Hunt SEVERITY: Critical (CVSS 3.1 8.9, unauthenticated, no user interaction, actively exploited) SCOPE: All Zimbra Collaboration Suite servers (mailbox and MTA nodes) running a version before 10.1.20 with the optional zimbra-snmp package installed and SNMP notifications enabled HYPOTHESIS: An unauthenticated attacker executed OS commands as the zimbra service account via the SNMP notification path, then deployed JSP web shells, escalated to root via a PAM/sudoers abuse chain, installed a masquerading systemd service for persistence, and harvested Zimbra's own authentication secrets QUERIES: Q1-Q10 (Section 8); IOAs recommended for Q1, Q6, Q7 (Section 9) DO FIRST: 1. Confirm ZCS version and zimbra-snmp package presence on every node (Section 7, check 3) 2. Run Q1 and Q6 across the full retention window available (exploitation may predate your EDR deployment) 3. Check /var/log/zimbra.log for the CERT Polska service-status-change signature (Section 7, check 1) FINDINGS: [populate per engagement] GAPS: SNMP UDP trap payload not inspected at the network layer; OOB-callback DNS telemetry not covered; JSP file-write events are process-proxy, not a native Falcon file-write type (Section 5, Section 15) ACTIONS: Patch to 10.1.20+; rotate zimbraPreAuthKey and all Zimbra service credentials on any node that was ever exposed; deploy Q1/Q6/Q7 as audit-mode Custom IOAs OWNER: [assign per engagement] VERSION: v0.1, 2026-10-01
Changelog
References
| Tier | Source | Used For | Access Date |
|---|---|---|---|
| 1 | Microsoft Security Blog, "Unauthenticated command injection on internet-facing mail servers: tracking CVE-2026-73570" | Full attack chain, KQL hunt logic, MITRE mapping, complete IOC appendix | 2026-10-01 |
| 1 | Zimbra Tech Center, Release Notes 10.1.20 | Official fix content, confirms scope of the 10.1.20 patch | 2026-10-01 |
| 1 | Zimbra Blog, "Patch Release Update: Zimbra 10.1.20" | Confirms initial disclosure June 26 2026, permanent fix July 20 2026 | 2026-10-01 |
| 1 | NVD, CVE-2026-73570 | CVSS vector, CWE-78, affected version range, CISA KEV dates | 2026-10-01 |
| 1 | CERT Polska, advisory 145/2026 | First public confirmation of active exploitation; log/file hunting guidance | 2026-10-01 |
| 2 | The Hacker News | Corroborating summary of Microsoft's findings | 2026-10-01 |
| 2 | SecurityWeek | CERT Polska pickup; attribution-unknown framing | 2026-10-01 |
| 2 | SecurityAffairs | Shadowserver exposure numbers; historical-targeting background | 2026-10-01 |
| 3 | Cloud Security Alliance research note | Confirms no attribution for this campaign; separates it from the unrelated LAUNDRY BEAR/Void Blizzard incident | 2026-10-01 |
| 3 | Gridinsoft | Response checklist; explicit attribution-unknown statement | 2026-10-01 |
| 3 | Falcon Internet Blog | Compromise count; operator version/package-check commands | 2026-10-01 |
| 3 | Hive Security | Vulnerable/Exposed/Exploited/Compromised triage framework | 2026-10-01 |
| 4 | GBHackers, CyberPress (downstream aggregators) | Corroborate Microsoft's IOC values verbatim; not counted as independent sourcing | 2026-10-01 |