Zimbra Collaboration Suite: CVE-2026-73570 Unauthenticated SNMP Command Injection / RCE

Unauthenticated OS command injection in the Zimbra SNMP notification path. Actively exploited in the wild with JSP web shell deployment, PAM/sudo privilege escalation, and authentication-secret harvesting. Attribution: UNKNOWN.
Threat
CVE-2026-73570 (CWE-78)
Severity
EXPLOITED ITW
Type
Unauthenticated RCE · Edge/On-Prem Service
Access
Network, no auth, no user interaction
CVSS 3.1
8.9 HIGH (AV:N/AC:H/PR:N/UI:N/S:C/C:H/I:H/A:L)
Version
v0.1 · 2026-10-01
Author
HuntPack
Confidence
High (vuln/timeline) · Medium (atomic IOCs, single primary source)
01

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.

02

Source Review & Web Hunter Notes

TierSourceKey FindingCarry Forward
1 · Vendor/PrimaryMicrosoft Security Blog, Sept 30 2026Full attack chain, Defender XDR KQL hunts, MITRE mapping, complete network/hash IOC appendixYes
1 · Vendor/PrimaryZimbra Tech Center release notes & Zimbra Blog, Jul 20 2026Official fix content for 10.1.20; confirms initial disclosure was Jun 26 2026, permanent fix Jul 20 2026Yes
1 · Vendor/PrimaryNVD CVE-2026-73570 recordAuthoritative CVSS vector, CWE-78, affected version range, CISA KEV add/due datesYes
1 · National CSIRTCERT Polska advisory 145/2026, Aug 17 2026First public confirmation of active exploitation; specific /var/log/zimbra.log and webapps-directory hunting guidanceYes
2 · Security journalismThe Hacker News, Sep 30 2026Corroborating summary of Microsoft's findings, published same news cycleYes
2 · Security journalismSecurityWeek, Aug 20 2026CERT Polska pickup; explicit "threat actor ... remains unclear" framing; historical Zimbra targeting contextPartial (background only)
2 · Security journalismSecurityAffairs, Aug 21 2026Shadowserver exposure numbers; historical nation-state Zimbra targeting (Winter Vivern, APT29, APT28) offered as unrelated background, not attributionPartial (background only)
3 · Research noteCloud Security Alliance research note, Aug 26 2026Explicitly 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 noteGridinsoft, Aug 21 2026Practical response checklist; explicit "attribution unknown, claims about a named campaign ... would go beyond the available evidence" statementPartial
3 · Research noteFalcon Internet Blog, Aug 25 2026270+ compromised count; operator-facing version/package-check commandsPartial
3 · Research noteHive Security, Aug 25 2026Vulnerable / Exposed / Exploited / Compromised triage frameworkPartial
4 · Downstream aggregatorGBHackers, CyberPressRepeat 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=detect only, never action=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.
03

Hunt Brief & Attack Chain

Hunt hypotheses (ordered by fidelity)

  1. H1 (high): The swatchdog-to-snmptrap command 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.
  2. H2 (high): Web shell deployment leaves a process-level trail: webroot permission changes under the zimbra account followed by decode/write operations targeting Jetty or mailboxd webapps paths, then permission restoration.
  3. H3 (high): Attacker tooling is retrieved and executed via curl/wget piped directly to a shell, or downloaded then chmod+executed, as a child of the Zimbra Java process tree.
  4. H4 (high): Interactive reverse shells use a named pipe plus openssl s_client, or a background /bin/sh -i, spawned from Java/jspawnhelper ancestry.
  5. H5 (high): Fileless / memory-backed execution via memfd_create and /proc/self/fd/ appears in process ancestry tied to the injection path.
  6. H6 (high): Privilege escalation leaves a durable artifact trail: a symlink into /etc/pam.d/, a pam_exec hook, invocation of zmstat-fd outside normal monitoring cadence, and a new /etc/sudoers.d/ entry granting the zimbra account passwordless sudo.
  7. H7 (high): A systemd unit resembling Zimbra logging or another core OS service, but installed from /tmp or owned by the zimbra account, appears outside the normal package-management install path.
  8. H8 (medium-high): Cron persistence (@reboot, * * * * *) relaunches a staged binary from a world-writable or Zimbra-owned path.
  9. H9 (high): Credential harvesting runs zmlocalconfig -s followed by an authenticated ldapsearch targeting zimbraPreAuthKey, zimbraAuthTokenKey, or zimbraTwoFactorAuthSecret outside a scheduled administrative task.
  10. H10 (medium): Lateral movement uses Zimbra's own pre-existing SSH identity (/opt/zimbra/.ssh/zimbra_identity) with host-key checking disabled, paired with rsync transfers between mailbox nodes.
  11. H11 (medium): Pre-exploitation validation and ongoing recon chain curl/wget/ping/nslookup/id in rapid succession from the zimbra account, often to out-of-band collaborator domains.
  12. H12 (high): Collection stages a full mail-store archive (tar zcvf) under a disguised name in a public webroot or backup path, sometimes followed by azcopy invocation to cloud blob storage.

Attack chain

StepTelemetryHunt Angle
1. Pre-disclosure / ongoing recon: OOB validation callbacks (curl/wget/ping/nslookup/id) to collaborator infrastructure; HTTP requests carry a CVE-specific user agentProcess, DNSH11 · Q9
2. Initial access: crafted SMTP request reaches SNMP notification handler; swatchdog builds a snmptrap shell command from an attacker-controlled service-state valueProcess (Linux sensor)H1 · Q1
3. Cluster recon: zmprov enumerates mailbox/MTA nodes; attacker checks for an existing Zimbra SSH identityProcessH10 · Q8
4. Web shell deployment: webroot permissions changed, encoded payload fragments reconstructed and decoded into JSP files under Jetty/mailboxd, permissions restoredProcess (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 establishedProcess, NetworkH3, H4, H5 · Q3, Q4, Q5
6. Privilege escalation: PAM symlink + pam_exec + zmstat-fd grants the zimbra account passwordless root sudoProcess, FileH6 · Q6
7. Persistence: zimlog.service (or another masquerading unit) installed and enabled; cron entries added; SSH keys/local accounts modifiedProcess, File, systemdH7, H8 · Q7, Q10
8. Credential harvesting: zmlocalconfig -s plus authenticated ldapsearch against Zimbra's own secret attributesProcessH9 · Q9
9. Lateral movement: Zimbra SSH identity + rsync propagate tooling and web shells to peer cluster nodesProcess, NetworkH10 · Q8
10. Collection & exfiltration attempt: full mail-store archive staged under a disguised name; azcopy invoked against operator-supplied cloud storageProcess, NetworkH12 · Q10
04

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.

TypeValueConfidenceActionContextExpiry
ipv4117.107.25[.]243:7071mediumdetectDropper C2, served de.sh2027-04-01
ipv4192.255.193[.]111:9004mediumdetectCryptominer C2, served build_amd64 staged as .kworker_sys2027-04-01
ipv445.32.30[.]235:8081 / :8080mediumdetectEarliest confirmed reverse-shell C2; port 8080 also used for interactive session + mail-store staging2027-04-01
ipv4193.42.40[.]135:443mediumdetectOrganization-wide reverse-shell / recon wave2027-04-01
ipv43.209.137[.]175:443mediumdetectSecondary C2, rotated-infrastructure event2027-04-01
domaintranszimbra[.]linkpc[.]netmediumdetectDynamic-DNS dropper C2, served agent.sh / agent2.sh / zimdown22027-04-01
domainpsk1zim[.]abrdns[.]com (path /agentws)mediumdetectzimclient2 WebSocket (port 80) and raw TCP (8080) command channel2027-04-01
domaintls[.]psk1zim[.]abrdns[.]commediumdetectzimclient2 TLS command channel (port 443)2027-04-01
domainwslogzimbra[.]linkpc[.]net (path /wsstat)mediumdetectzimdown2 installer status reporting, separate from payload hosting2027-04-01
domainmexico-cashpay-test.s3.dualstack.mx-central-1.amazonaws.commediumdetectS3-hosted tarball dropper (path /pakistan/2026/aliyun_update.tar.gz); confirmed executed on one host2027-04-01
sha256dee5af1c0f76b45d28bafd6e60c07bb8e391d98addf81ef8f13d073acdb3c48amediumdetectde.sh dropper script2027-04-01
sha256aea991f694911e321b0ab97534f2ad0291c392c0a43dabff664c563618bd036dmediumdetectbuild_amd64 cryptominer2027-04-01
sha2566ab7de2509038edf580aef6229c1c3db17f4da8f2d7d940818faf617d1938244mediumdetectagent2.sh second-stage downloader2027-04-01
sha256bf28f38122bf20d5fac969cc414daa6a890cdea872d389ca93d2092b6b7773cfmediumdetectzimdown2 Go installer2027-04-01
sha256b594a42b8f1c6f090327bb9a3361c2d3515537fb7ac8da6b9061b9a3f330e159mediumdetectzimclient2 remote-access agent2027-04-01
sha25665a7576c389326b6cdf9c993d0be6e5d50fed9655d1cdf2a3a50f2c21c8ec435mediumdetect"Looptik" LPE hacktool (GitHub-hosted toolkit staged as .lpe_core)2027-04-01
sha25622ef852f6ebc39ee71235b90648b4b200b385c47d25c79545986493f8c70db69mediumdetectLoader staged as "systemd-resolved"; installs /usr/sbin/_chronyd2027-04-01
sha256518fe65dd349180191d9b258ab24876aaed6613cd657d0b626d1fc24e03a22b6mediumdetectDecoded in-memory stage 2; Base-chain command agent2027-04-01
other0x25bdA7Feb3553995AD68a9A8Ed8c731b73a71586lowpivotBase 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 snmptrap invocation 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 the zimbra account
  • A symlink placed at /etc/pam.d/sudo or a file under /etc/pam.d/ owned by zimbra
  • A sudoers fragment under /etc/sudoers.d/ (observed as 81_metric) granting zimbra NOPASSWD:ALL
  • Named pipe at /tmp/s feeding an interactive shell into openssl s_client
  • Masquerade filenames: .kworker_sys, .lpe_core, _chronyd, a mail archive saved with a .ico extension
05

Affected Surface & Telemetry Matrix

SurfaceRequired TelemetryPriorityGap Risk
Zimbra mail/MTA server (RHEL/Ubuntu Linux host) with zimbra-snmp installed and SNMP notifications enabledFalcon Linux sensor: process execution, network connect, DNSCriticalLow: 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 writeCriticalMedium: 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 / zimbraTwoFactorAuthSecretLDAP audit log; process telemetry for ldapsearch invocationsCriticalMedium: 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 clientHighMedium: most environments do not enable MySQL query logging by default
Cluster peer mailbox/MTA nodes reachable via the Zimbra SSH identityFalcon Linux sensor on every node, not only the initially compromised one; SSH/auth logsCriticalHigh: 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 payloadInformationalGap: 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
06

ATT&CK Mapping

TacticTechniqueObserved BehaviorQuery / Control
ReconnaissanceT1595.002 Active Scanning: Vulnerability ScanningCanary subdomains probed via ping/nslookup callbacks with no payload deliveredQ9
Initial AccessT1190 Exploit Public-Facing ApplicationCrafted SMTP request into SNMP notification processing, executing as the zimbra accountQ1
ExecutionT1059.004 Command and Scripting Interpreter: Unix Shellperl to dash/bash/sh; de.sh, agent2.sh piped into a shellQ1, Q3
ExecutionT1105 Ingress Tool Transfercurl, wget, python, /dev/tcp download fallbacksQ3
Privilege EscalationT1068 Exploitation for Privilege EscalationPAM symlink + pam_exec + zmstat-fd chain grants passwordless root sudo; separate GitHub LPE toolkit staged as .lpe_coreQ6
PersistenceT1053.003 Scheduled Task/Job: Cron@reboot and * * * * * entries relaunching staged binariesQ10
PersistenceT1543.002 Create or Modify System Process: Systemd Servicezimlog.service (or chronyd-helper.service / syslog_init.service) installed, enabled, and timestompedQ7
PersistenceT1505.003 Server Software Component: Web ShellMultiple JSP web shells across Zimbra application paths, propagated to peer nodesQ2
Defense EvasionT1036.005 Masquerading: Match Legitimate Name or Locationsystemd-resolved, _chronyd, .kworker_sys, mail archive saved as .icoQ2, Q7, Q10
Defense EvasionT1620 Reflective Code LoadingXOR-decoded ELF run from memfd_create via /proc/self/fdQ5
DiscoveryT1018 Remote System Discoveryzmprov cluster mapping of mailbox/MTA nodesQ8
DiscoveryT1083 File and Directory DiscoveryOperator directory listings; droppers probing writable, executable staging pathsQ3
Credential AccessT1552.001 Unsecured Credentials: Credentials In Fileszmlocalconfig -s exposes LDAP/MySQL/Postfix/Amavis/replication credentials from localconfig.xmlQ9
Credential AccessT1555 Credentials from Password StoresAuthenticated ldapsearch retrieves zimbraPreAuthKey, zimbraAuthTokenKey, zimbraTwoFactorAuthSecretQ9
Lateral MovementT1021.004 Remote Services: SSHZimbra's own SSH identity used in noninteractive mode with host-key verification disabledQ8
Lateral MovementT1570 Lateral Tool Transferrsync moves staged payload fragments and JSP web shells between cluster nodesQ8
Command and ControlT1071.001 Application Layer Protocol: Web ProtocolsWebSocket tasking with TLS and raw TCP fallbacksQ4
Command and ControlT1102.001 Web Service: Dead Drop ResolverEncrypted commands polled from a Base mainnet smart contract over public JSON-RPCSection 4 (pivot)
CollectionT1560.001 Archive Collected Data: Archive via Utilitytar zcvf of the full Zimbra mail store, run more than onceQ10
CollectionT1074.001 Data Staged: Local Data StagingArchive written into the public Zimbra web directory under a disguised name (e.g. five.ico)Q10
ExfiltrationT1567.002 Exfiltration to Cloud StorageAzCopy invoked with an operator-supplied SAS URL against Azure Blob StorageQ10
ImpactT1496 Resource HijackingMiner staged as .kworker_sys; rival miners killed and pools sinkholed via /etc/hostsQ3, Q5
07

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.

08

CrowdStrike LogScale CQL Hunt Queries

Pick your tenant's cloud first: every "Open in Falcon" button below uses this selection.
Q1 · Confirmed SNMP-to-shell command injection boundary
CONF HIGHFP LOWCOST LOW

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])
Q2 · Suspicious write into Zimbra webapps directories
CONF HIGHFP MEDIUMCOST MEDIUM

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])
Q3 · Tooling retrieval from the Zimbra Java process tree
CONF HIGHFP MEDIUMCOST LOW

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])
Q4 · Interactive reverse shell (named pipe + openssl s_client)
CONF HIGHFP LOWCOST LOW

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])
Q5 · Memory-backed / fileless execution (memfd_create)
CONF HIGHFP LOWCOST MEDIUM

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])
Q6 · PAM/sudoers privilege-escalation chain
CONF HIGHFP LOWCOST LOW

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])
Q7 · Masquerading systemd persistence (zimlog.service pattern)
CONF HIGHFP MEDIUMCOST LOW

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])
Q8 · Cluster recon and lateral movement via Zimbra's SSH identity
CONF MEDIUMFP MEDIUMCOST LOW

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])
Q9 · Zimbra authentication-secret harvesting
CONF HIGHFP MEDIUMCOST LOW

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])
Q10 · Mail-store collection and cloud exfiltration attempt
CONF HIGHFP MEDIUMCOST MEDIUM

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])
09

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 NameSource QueryPatternExclusionsDeployment Path
Zimbra SNMP Command Injection BoundaryQ1Process tree: perl (swatchdog context) → sh/bash/dash containing snmptrap + zm service tokensNone known; alert in detect mode first for one cycle to confirm no environment-specific swatchdog wrapper triggers itFalcon console → Custom IOAs → Linux → scope to the Zimbra host group → audit mode 7 days → enforce
Zimbra PAM/Sudoers Escalation ChainQ6zmmailboxdmgr / zmstat-fd process touching /etc/pam.d or /etc/sudoers.dNone knownSame console path; audit mode 7 days → enforce
Masquerading Systemd Unit by zimbra AccountQ7systemctl/mv/cp writing into /etc/systemd/system under the zimbra accountAdd your configuration-management service account(s) to the exclusion list before enablingSame 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.

10

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.

Falcon IOC Management CSVbulk import, detect only
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 Signaturesprimary detection surface
# 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 / Toolingreference, not independently confirmed
# 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 / Config Auditoperator one-liners
# 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
11

Detection Validation Gates

GateRequirementStatus in this pack
Telemetry readyFalcon Linux sensor installed and healthy on every Zimbra mailbox/MTA node, not only the edge-facing oneVerify per-tenant: cluster-wide coverage is the most common gap (Section 5)
Benign baselineRun Q2, Q3, Q7, Q8, Q9, Q10 in investigate mode for at least one full patch/backup cycle before enabling any automated actionRequired before go-live
Positive testsConfirm 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:1Logic verified against Microsoft's own KQL
Promotion criteriaZero FP hits across the full baseline window before moving Q1/Q6/Q7 from audit to enforce as Custom IOAsPending tenant-specific validation
12

Hardening: Tiered & Deployable

Immediate (this week)
  • 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-snmp package or disable SNMP notifications and stop swatchdog. MITRE M1042 (Disable or Remove Feature or Program). Verify: rpm -qa | grep zimbra-snmp / dpkg -l | grep zimbra-snmp returns nothing, or zmswatchctl status shows 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: compare zmlocalconfig -s output timestamps against the rotation date.
Near term (1–4 weeks)
  • 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 -l shows 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.
Strategic (1–3 months)
  • 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 snmptrap with unsanitized service-state strings, in coordination with Zimbra support.
13

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.
14

Containment Runbook

PhaseActionsOwnerEvidence to Preserve
IsolateNetwork-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-callLive memory/process snapshot before isolation if feasible; current /var/log/zimbra.log, auth logs, and systemd unit list
EradicateRemove 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 leadCopy of every removed artifact (path, owner, timestamps, hash) before deletion
RecoverPatch 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 leadPost-rotation verification output; confirmation of clean zmcontrol -v and auditd watch status
Post-incidentReview 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 applicableFinal incident timeline and scope statement
15

Detection Coverage Map

TechniqueBehaviorCQLIOACoverage
T1190 Exploit Public-Facing ApplicationSNMP command injection boundaryQ1Zimbra SNMP Command Injection BoundaryGood
T1505.003 Server Software Component: Web ShellJSP web shell staging in webapps directoriesQ2N/APartial: process-level proxy for a file-write event Falcon does not natively type for JSP
T1105 Ingress Tool Transfercurl/wget from Java process treeQ3N/AGood
T1059.004 / T1071.001Named-pipe reverse shell over openssl s_clientQ4N/AGood
T1620 Reflective Code Loadingmemfd_create / fileless executionQ5N/AGood
T1068 Exploitation for Privilege EscalationPAM/sudoers escalation chainQ6Zimbra PAM/Sudoers Escalation ChainGood
T1543.002 / T1036.005Masquerading systemd persistenceQ7Masquerading Systemd Unit by zimbra AccountGood
T1018 / T1021.004 / T1570Cluster recon and lateral movement via Zimbra SSH identityQ8N/APartial: requires sensor coverage on every peer node, not just the entry host
T1552.001 / T1555Authentication-secret harvestingQ9N/AGood
T1560.001 / T1074.001 / T1567.002Mail-store collection and cloud exfiltrationQ10N/AGood
T1595.002 Active ScanningOut-of-band validation callbacks to collaborator infrastructureN/AN/AGap: 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 ResolverBase-chain smart-contract C2 pollingN/AN/AGap: 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 payloadN/AN/AGap: 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.

16

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
17

Changelog

v0.12026-10-01Initial release. Built from Microsoft Security Blog's Sept 30 2026 research (primary IOC/TTP source), CERT Polska advisory 145/2026, NVD CVE record, Zimbra's own 10.1.20 release notes, and seven corroborating secondary sources. 10 behavioral CQL hunt queries, 3 Custom IOA candidates, 18 atomic IOCs shipped as detect-only (single-sourced), full hardening/playbook/containment coverage. Attribution recorded as unknown; explicitly decoupled from the unrelated LAUNDRY BEAR / Void Blizzard CVE-2025-66376 campaign.
18

References

TierSourceUsed ForAccess Date
1Microsoft Security Blog, "Unauthenticated command injection on internet-facing mail servers: tracking CVE-2026-73570"Full attack chain, KQL hunt logic, MITRE mapping, complete IOC appendix2026-10-01
1Zimbra Tech Center, Release Notes 10.1.20Official fix content, confirms scope of the 10.1.20 patch2026-10-01
1Zimbra Blog, "Patch Release Update: Zimbra 10.1.20"Confirms initial disclosure June 26 2026, permanent fix July 20 20262026-10-01
1NVD, CVE-2026-73570CVSS vector, CWE-78, affected version range, CISA KEV dates2026-10-01
1CERT Polska, advisory 145/2026First public confirmation of active exploitation; log/file hunting guidance2026-10-01
2The Hacker NewsCorroborating summary of Microsoft's findings2026-10-01
2SecurityWeekCERT Polska pickup; attribution-unknown framing2026-10-01
2SecurityAffairsShadowserver exposure numbers; historical-targeting background2026-10-01
3Cloud Security Alliance research noteConfirms no attribution for this campaign; separates it from the unrelated LAUNDRY BEAR/Void Blizzard incident2026-10-01
3GridinsoftResponse checklist; explicit attribution-unknown statement2026-10-01
3Falcon Internet BlogCompromise count; operator version/package-check commands2026-10-01
3Hive SecurityVulnerable/Exposed/Exploited/Compromised triage framework2026-10-01
4GBHackers, CyberPress (downstream aggregators)Corroborate Microsoft's IOC values verbatim; not counted as independent sourcing2026-10-01