If you run Zimbra Collaboration Suite (ZCS) exposed to the internet — and a large share of Zimbra deployments are, by design — you need to treat this as an active incident-response scenario, not a routine patch Tuesday item. Microsoft Security Research has confirmed that threat actors are exploiting CVE-2026-73570, an unauthenticated operating system command injection flaw (CVSS 8.9) in ZCS tied to its Simple Network Management Protocol (SNMP) handling, to deploy web shells and harvest authentication secrets from compromised servers.
This is not theoretical. Exploitation is in the wild, the attack requires no credentials and no user interaction, and the payoff for the adversary is exactly what makes Zimbra a perennial target: a centralized store of enterprise email, address books, and — critically — stored credentials that unlock lateral movement. Zimbra's long history of n-day and zero-day exploitation against internet-facing instances means attacker tooling and playbooks for this platform are mature. The time between patch release and mass scanning for Zimbra flaws has historically been measured in days, sometimes hours.
This post breaks down the attack chain, gives you production-ready detection content (Sigma, KQL, VQL), and walks through remediation and post-patch compromise assessment.
What Is at Stake
Zimbra sits at a uniquely sensitive intersection in most environments:
- Mailbox data: the full contents of every hosted mailbox — often including password reset emails, MFA delivery addresses, legal correspondence, and executive communications.
- Stored authentication secrets: Zimbra's configuration (notably
localconfig.xmlunder/opt/zimbra/conf/) contains LDAP bind passwords, and the platform maintains credential material that attackers can leverage against directory services and adjacent systems. - A trusted foothold: a compromised mail server is a launchpad for business email compromise (BEC), internal phishing from legitimate mailboxes, and quiet, long-term persistence.
The observed post-exploitation behavior — web shell deployment followed by credential harvesting — tells you the operators are building durable access, not smash-and-grab. Assume any unpatched, internet-exposed ZCS instance has been enumerated.
Technical Analysis
The Vulnerability
CVE-2026-73570 is an unauthenticated operating system command injection vulnerability in Zimbra Collaboration Suite, carrying a CVSS score of 8.9 (High). Per the reporting, the flaw is reachable through the server's SNMP-related functionality, allowing a remote attacker — with no authentication — to inject and execute arbitrary operating system commands on the underlying host.
From a defender's perspective, the important characteristics are:
- Pre-authentication: no valid account, session, or token is required. Any host that can reach the vulnerable component can attempt exploitation.
- Command execution context: injected commands execute in the context of the Zimbra service stack. On most ZCS deployments, attacker-controlled commands land as the
zimbrauser — which owns the mailstore, the Jetty web application directories, and the configuration files containing service credentials. That is more than enough to read every mailbox and persist. - Web-reachable attack surface: ZCS front ends (typically Jetty serving HTTPS on 443, plus admin consoles on 7071) are internet-facing by design in most deployments, so exposure is the default state.
Attack Chain as Observed
Based on the Microsoft Security Research findings, the intrusion pattern is:
- Exploitation — attacker sends a crafted request to the SNMP-handling component of an internet-exposed ZCS server, injecting OS commands.
- Web shell deployment — the injected command writes a JSP web shell into a Jetty web application directory (Zimbra serves its web client and services from Jetty under
/opt/zimbra/jetty*/webapps/). This converts a one-shot command injection into persistent, re-enterable remote access over HTTPS. - Credential and data harvesting — through the web shell, operators read Zimbra configuration files (LDAP bind credentials in
localconfig.xml), extract authentication secrets, and access mailbox data. - Consolidation — harvested credentials enable lateral movement, mailbox rules/BEC staging, and long-term collection.
Affected Products
- Product: Zimbra Collaboration Suite (ZCS), Network Edition and Open Source Edition
- Platforms: Linux (RHEL/CentOS/Rocky/Alma, Ubuntu LTS) — ZCS is a Linux-native platform
- Component: SNMP request handling within the ZCS service stack
- Exposure: any instance reachable from untrusted networks on its web/SNMP-adjacent service ports
Consult the official Zimbra security advisory for the precise affected version ranges and fixed builds: Zimbra Security Center and Zimbra Security Advisories.
Exploitation Status
- Confirmed active exploitation in the wild, documented by Microsoft Security Research
- Post-exploitation tooling observed: JSP web shells, credential harvesting from Zimbra configuration
- Patch status: patched by the vendor — fixed builds are available via the Zimbra advisory
- Action class: treat as an emergency change. If CISA adds CVE-2026-73570 to the Known Exploited Vulnerabilities catalog, federal deadlines will follow; don't wait for the KEV listing to act.
Detection & Response
The detections below target the two most reliable observable behaviors in this campaign: (1) the Zimbra/Jetty Java process or SNMP-related daemons spawning shells and command interpreters, and (2) JSP web shells landing in Jetty web application directories. These are high-fidelity signals — a healthy Zimbra server does not have java spawning bash -i or writing new .jsp files outside of a controlled upgrade window.
Sigma Rules
---
title: Zimbra Java Process Spawning Shell or Command Interpreter
id: 9c1e4a72-3b58-4f6d-ae21-7d8c2f1b9034
status: experimental
description: Detects the Zimbra Jetty Java process or Zimbra service user spawning shells, interpreters, or downloaders, consistent with post-exploitation of CVE-2026-73570 command injection.
references:
- https://thehackernews.com/2026/09/attackers-exploit-zimbra-flaw-to-deploy.html
- https://attack.mitre.org/techniques/T1059/
author: Security Arsenal
date: 2026/09/15
tags:
- attack.execution
- attack.t1059.004
logsource:
category: process_creation
product: linux
detection:
selection_parent:
ParentImage|contains:
- 'java'
- 'zmmailboxd'
- 'snmp'
selection_user:
User: 'zimbra'
selection_child:
Image|endswith:
- '/bash'
- '/sh'
- '/dash'
- '/zsh'
- '/python'
- '/python3'
- '/perl'
- '/curl'
- '/wget'
- '/base64'
- '/nc'
- '/ncat'
condition: (selection_parent or selection_user) and selection_child
falsepositives:
- Zimbra maintenance scripts executed by administrators during upgrades
- Legitimate zmcontrol operations (validate against change windows)
level: high
---
title: JSP Web Shell Written to Zimbra Jetty Webapps Directory
id: 4f7b2c91-6e8a-4d15-bc39-1a5e9f027d68
status: experimental
description: Detects creation or modification of JSP files in Zimbra Jetty web application directories, a hallmark of web shell deployment following ZCS exploitation such as CVE-2026-73570.
references:
- https://thehackernews.com/2026/09/attackers-exploit-zimbra-flaw-to-deploy.html
- https://attack.mitre.org/techniques/T1505/003/
author: Security Arsenal
date: 2026/09/15
tags:
- attack.persistence
- attack.t1505.003
logsource:
category: file_event
product: linux
detection:
selection_path:
TargetFilename|contains:
- '/opt/zimbra/jetty/webapps/'
- '/opt/zimbra/jetty-distribution'
selection_ext:
TargetFilename|endswith:
- '.jsp'
- '.jspx'
- '.war'
condition: selection_path and selection_ext
falsepositives:
- Zimbra patch or upgrade activity (correlate with maintenance windows and package manager logs)
level: critical
---
title: Zimbra Configuration and Credential Files Accessed by Unusual Process
id: 2d8e5b63-91f4-4c7a-ad46-8b3c6e5f1092
status: experimental
description: Detects non-Zimbra processes reading Zimbra localconfig or credential stores, consistent with authentication secret harvesting observed in CVE-2026-73570 intrusions.
references:
- https://thehackernews.com/2026/09/attackers-exploit-zimbra-flaw-to-deploy.html
- https://attack.mitre.org/techniques/T1552/
author: Security Arsenal
date: 2026/09/15
tags:
- attack.credential_access
- attack.t1552.001
logsource:
category: file_event
product: linux
detection:
selection_file:
TargetFilename|contains:
- '/opt/zimbra/conf/localconfig.xml'
- '/opt/zimbra/conf/keystore'
- '/opt/zimbra/data/ldap/config'
filter_known_services:
Image|endswith:
- '/zmlocalconfig'
- '/java'
- '/slapd'
condition: selection_file and not filter_known_services
falsepositives:
- Backup agents and configuration management tools (tune exclusions to your backup binary paths)
level: high
A note on tuning: rule three assumes file-access telemetry (auditd or Sysmon for Linux). Baseline your backup and config-management tooling first, then tighten the exclusion list. The first two rules should be low-noise in any environment that isn't mid-upgrade.
KQL — Microsoft Sentinel / Defender
These queries assume you're ingesting Linux syslog/auditd via the Sentinel Syslog or CommonSecurityLog connectors, or running Microsoft Defender for Endpoint on your Zimbra hosts (MDE supports Linux servers and this use case alone justifies it).
// Hunt 1: Shells and interpreters spawned under the zimbra user or by java (MDE on Linux)
DeviceProcessEvents
| where TimeGenerated > ago(14d)
| where InitiatingProcessAccountName =~ "zimbra"
or InitiatingProcessFileName has_any ("java", "zmmailboxd", "snmpd", "snmptrapd")
| where FileName in~ ("bash", "sh", "dash", "zsh", "python", "python3", "perl", "curl", "wget", "nc", "ncat", "base64")
| project TimeGenerated, DeviceName, InitiatingProcessFileName, InitiatingProcessCommandLine,
FileName, ProcessCommandLine, AccountName, ReportId
| sort by TimeGenerated desc;
// Hunt 2: Web shell file creation under Zimbra Jetty webapps (MDE file events)
DeviceFileEvents
| where TimeGenerated > ago(30d)
| where FolderPath has_any ("/opt/zimbra/jetty", "/opt/zimbra/jetty-distribution")
| where FileName endswith ".jsp" or FileName endswith ".war"
| where ActionType in ("FileCreated", "FileModified", "FileRenamed")
| project TimeGenerated, DeviceName, FolderPath, FileName, SHA256,
InitiatingProcessFileName, InitiatingProcessCommandLine, InitiatingProcessAccountName
| sort by TimeGenerated desc;
// Hunt 3: Syslog evidence of web shell execution or credential file access via auditd ingestion
Syslog
| where TimeGenerated > ago(14d)
| where Computer has "zimbra" or SyslogMessage has "/opt/zimbra"
| where SyslogMessage has_any (
"localconfig.xml",
"/jetty/webapps/",
"webapps/zimbra/",
".jsp"
)
| where SyslogMessage has_any ("execve", "open", "creat", "rename")
| project TimeGenerated, Computer, ProcessName, SyslogMessage
| sort by TimeGenerated desc
Hunt 3 is deliberately scoped to Zimbra paths plus syscall keywords from auditd telemetry — without that scoping it would drown you. If your Syslog feed doesn't carry auditd, stand up the Sentinel auditd collection or rely on Hunts 1 and 2.
Velociraptor VQL
For rapid triage across a fleet of Zimbra servers — or a single suspected victim — this artifact surfaces recently created or modified JSP files in the web application directories and correlates them with live processes running under the zimbra account.
-- Zimbra web shell triage: recent JSP artifacts + suspicious zimbra-owned processes
-- Deploy as a hunt across ZCS hosts; adjust the mtime window to your patch timeline
LET jsp_artifacts = SELECT FullPath, Size, Mtime, Ctime
FROM glob(globs=['/opt/zimbra/jetty*/webapps/**/*.jsp', '/opt/zimbra/jetty*/webapps/**/*.war'])
WHERE Mtime > (now() - 2592000) -- last 30 days
ORDER BY Mtime DESC
LET suspicious_procs = SELECT Pid, Name, CommandLine, Exe, Username, CreateTime
FROM pslist()
WHERE Username =~ 'zimbra'
AND (CommandLine =~ 'bash|/bin/sh|python|perl|curl |wget |nc |ncat |base64')
SELECT * FROM jsp_artifacts
UNION ALL
SELECT * FROM suspicious_procs
On a suspected victim, follow up by collecting any flagged JSP file in full (Velociraptor's upload() function), hashing it, and diffing its contents against the same file on a known-good, identically-patched Zimbra host. Legitimate Zimbra JSPs are consistent across same-version installs — anything unique to one server is suspect until proven otherwise.
Remediation and Verification Script
Run this on each Zimbra host after applying the vendor patch to verify the build and hunt for pre-patch compromise. Patching does not evict an attacker — web shells planted before the patch survive it.
#!/bin/bash
# CVE-2026-73570 Zimbra post-patch verification and compromise assessment
# Run as root on each ZCS host. Read-only - no system changes.
echo "===== [1] Zimbra version check ====="
su - zimbra -c 'zmcontrol -v' 2>/dev/null || echo "[!] Could not query Zimbra version"
echo ""
echo "===== [2] Recently modified JSP/WAR files in Jetty webapps (last 60 days) ====="
find /opt/zimbra/jetty*/webapps/ -type f \( -name '*.jsp' -o -name '*.jspx' -o -name '*.war' \) -mtime -60 -printf '%T@ %TY-%Tm-%Td %TH:%TM %p\n' 2>/dev/null | sort -rn | head -50
echo ""
echo "===== [3] JSP files containing common web shell primitives ====="
grep -rlE 'Runtime\.getRuntime|ProcessBuilder|getInputStream|password=|cmd=|javax\.servlet.*exec' /opt/zimbra/jetty*/webapps/ --include='*.jsp' 2>/dev/null | head -25
echo ""
echo "===== [4] Shells spawned by zimbra user (from audit log, if present) ====="
if [ -f /var/log/audit/audit.log ]; then
ausearch -ui zimbra -x bash -ts recent 2>/dev/null | head -20
ausearch -ui zimbra -x sh -ts recent 2>/dev/null | head -20
else
echo "[!] auditd not found - install and enable it for future visibility"
fi
echo ""
echo "===== [5] zimbra user crontab and persistence locations ====="
crontab -u zimbra -l 2>/dev/null | grep -vE '^#' | grep -v '^$'
ls -la /etc/cron.d/ 2>/dev/null | grep -iv 'zimbra$'
find /opt/zimbra -name '*.jsp' -newer /opt/zimbra/.install_history -type f 2>/dev/null | head -20
echo ""
echo "===== [6] Listening sockets owned by zimbra (expect only standard ZCS ports) ====="
ss -tlnp 2>/dev/null | grep -i zimbra
echo ""
echo "===== [7] Outbound connections from java/zimbra processes ====="
ss -tnp 2>/dev/null | grep -E 'java|zimbra' | grep -v 'ESTAB.*:25 \|:443 \|:7071 \|:389 \|:636 \|:143 \|:993 \|:110 \|:995 \|:5222 \|:5223 ' | head -30
echo ""
echo "[*] Review complete. Any unexpected JSP files, shell executions, or outbound"
echo " connections warrant full IR scoping - assume credential theft occurred."
Treat any hit in sections 2–5 as a presumptive compromise and pivot to incident response: image the host, collect the mailbox access logs (/opt/zimbra/log/mailbox.log, nginx.access.log), and rotate every credential the server holds or touches.
Remediation
-
Patch immediately. Apply the fixed ZCS release documented in the official Zimbra Security Center advisory for CVE-2026-73570. Verify the installed build with
zmcontrol -vand confirm it matches or exceeds the fixed version in the advisory. Do not rely on package manager output alone — confirm the running services restarted post-patch. -
Assume breach on previously exposed instances. Any ZCS server that was internet-reachable and unpatched during the exploitation window must undergo compromise assessment (script above), not just patching. Web shells are the whole point of the attack — the vulnerability is the door, the shell is the attacker still standing in your hallway after you lock the door.
-
Rotate credentials — all of them. The campaign explicitly harvests authentication secrets. Rotate:
- The LDAP bind/admin passwords stored in
localconfig.xml(zmlocalconfig— regenerate via Zimbra's documented procedure) - All mailbox account passwords on the server, prioritizing admin and executive accounts
- Any service accounts, API keys, or secrets that transited or were stored in mailboxes
- Directory service credentials if Zimbra integrates with AD/LDAP
- The LDAP bind/admin passwords stored in
-
Constrain exposure. ZCS web and admin interfaces should be behind a VPN, ZTNA broker, or IP allowlist wherever the business permits. At minimum:
- Restrict the admin console (TCP 7071) to management networks — it should never be internet-facing
- If SNMP monitoring is in use, confirm SNMP services bind to internal interfaces only and are blocked at the perimeter (UDP/TCP 161/162)
- Place a WAF in front of ZCS with virtual patching rules for command-injection patterns until the patch is validated
-
Deploy endpoint telemetry. MDE for Linux, an EDR of your choice, or at minimum auditd with execution logging rules for the
zimbraUID. The detections above depend on it, and Zimbra servers without process telemetry are blind spots attackers have exploited for years. -
Monitor for follow-on activity. Watch for BEC indicators, suspicious mailbox rules, and authentication to internal resources using Zimbra-adjacent credentials in the weeks following patching. Credential theft monetizes slowly — the incident isn't over when the patch lands.
-
Track CISA KEV. Given confirmed active exploitation, watch the CISA Known Exploited Vulnerabilities catalog for CVE-2026-73570. A KEV listing brings hard federal remediation deadlines and is a strong forcing function for executive prioritization in the private sector.
Final Assessment
Zimbra remains one of the most consistently exploited enterprise platforms because it combines internet exposure, a rich post-exploitation target (credentials and email), and — too often — thin monitoring. CVE-2026-73570 fits the pattern exactly: pre-auth RCE, rapid weaponization, web shell persistence, and credential harvesting. The organizations that come out of this cleanly will be the ones that patched fast and did the unglamorous work of hunting for pre-patch shells and rotating every secret the server ever touched. Patch without compromise assessment is half a remediation — and the attackers are counting on you stopping halfway.
Related Resources
Security Arsenal Red Team Services AlertMonitor Platform Book a SOC Assessment pen-testing Intel Hub
Is your security operations ready?
Get a free SOC assessment or see how AlertMonitor cuts through alert noise with automated triage.