Where
-Infinity
0

CVE-2026-73570: Zimbra SNMP RCE abused to deploy coin-miner malware

CVE-2026-73570 is a Remote Code Execution issue in Zimbra Collaboration Suite (ZCS), related to SNMP notification/logwatch handling.

In short, an unauthenticated attacker can send a crafted SMTP request and get OS command execution as the zimbra user when the vulnerable SNMP/logwatch components are installed and enabled.

According to NVD, the issue affects Zimbra versions before 10.1.20 when SNMP is installed and SNMP notification is enabled. The Hacker News also reported active exploitation against Zimbra servers.

The observed attack chain is usually:

malicious SMTP request -> unsafe SNMP/logwatch handling -> command execution as zimbra -> malware dropped into /dev/shm -> cron persistence added -> miner or backdoor keeps respawning

What is CVE-2026-73570?

CVE-2026-73570 is an OS Command Injection vulnerability in Zimbra Collaboration Suite.

The issue is in the SNMP notification/logwatch flow, where attacker-controlled input is not handled safely before being passed into system-level processing.

The command runs as the zimbra user, not root. That is still serious because the zimbra user controls important Zimbra services, mailbox components, logs, cron jobs and runtime paths.

When is a Zimbra server at risk?

A server should be checked immediately if:

It is running Zimbra Collaboration Suite. It is not patched to a fixed version. zimbra-snmp or zimbra-net-snmp is installed. SNMP is enabled in Zimbra. zmlogswatch or zmswatch is running.

Quick checks:

su - zimbra -c 'zmcontrol -v' dpkg -l | grep -E 'zimbra-snmp|zimbra-net-snmp' su - zimbra -c 'zmprov gs $(zmhostname) zimbraServiceEnabled | grep snmp' su - zimbra -c 'zmlogswatchctl status' su - zimbra -c 'zmswatchctl status'

If you see zimbraServiceEnabled: snmp and zmlogswatch is running, treat the server as high priority for compromise checks.

Signs of compromise

In the cases observed, malware was often dropped into /dev/shm. This directory is a tmpfs location, writable and easy to miss during a quick investigation.

Check:

ls -la /dev/shm crontab -l -u zimbra ps aux | grep -E 'khp|rguard|javab|idle|ksmd' | grep -v grep

Common suspicious files:

/dev/shm/.khp /dev/shm/.khpts /dev/shm/.rguard /dev/shm/idle /dev/shm/javab /dev/shm/ksmd

A cron entry like this is a strong persistence indicator:

/dev/shm/.khp

Why does the malware keep coming back?

Deleting files from /dev/shm is usually not enough.

The malware can return because:

The malicious process is still running in memory. The zimbra crontab runs /dev/shm/.khp every minute. .rguard or idle may protect or redeploy the payload. SNMP/logwatch is still enabled, so the CVE can be exploited again.

The correct order is:

stop reinfection source -> preserve evidence -> kill malware processes -> remove malicious cron -> quarantine malware files -> verify clean state -> recover Zimbra services if needed -> patch/upgrade Zimbra

Cleanup procedure

Run the following commands as root. Review each command before running it on production.

Step 1: Stop the reinfection source

systemctl stop cron su - zimbra -c 'zmlogswatchctl stop' su - zimbra -c 'zmswatchctl stop' su - zimbra -c 'zmprov ms $(zmhostname) -zimbraServiceEnabled snmp'

Disabling SNMP/logwatch is the most important containment step. Do not re-enable these components before Zimbra is patched.

Step 2: Preserve malware evidence

mkdir -p /root/incident-zimbra cp -a /dev/shm/.khp \ /dev/shm/.khpts \ /dev/shm/.rguard \ /dev/shm/idle \ /dev/shm/javab \ /dev/shm/ksmd \ /root/incident-zimbra/ 2>/dev/null crontab -l -u zimbra > /root/incident-zimbra/zimbra-cron-before.txt 2>&1 ps auxf > /root/incident-zimbra/ps-before.txt ss -tunap > /root/incident-zimbra/ss-before.txt sha256sum /root/incident-zimbra/ > /root/incident-zimbra/sha256.txt 2>/dev/null

Step 3: Kill malware processes

pkill -9 -u zimbra -f 'khp|rguard|javab|idle|ksmd'

Step 4: Remove malicious cron

crontab -l -u zimbra | grep -v '/dev/shm/.khp' | crontab -u zimbra -

Step 5: Quarantine malware files

mkdir -p /root/quarantine-zimbra mv /dev/shm/.khp \ /dev/shm/.khpts \ /dev/shm/.rguard \ /dev/shm/idle \ /dev/shm/javab \ /dev/shm/ksmd \ /root/quarantine-zimbra/ 2>/dev/null

Step 6: Start cron again

systemctl start cron systemctl is-active cron

Only start cron. Do not start zmlogswatch, zmswatch or SNMP before patching Zimbra.

Verify after cleanup

ls -la /dev/shm crontab -l -u zimbra | grep /dev/shm ps aux | grep -E 'khp|rguard|javab|idle|ksmd' | grep -v grep su - zimbra -c 'zmprov gs $(zmhostname) zimbraServiceEnabled | grep snmp || echo SNMPDISABLED'

Expected result:

/dev/shm is clean no cron entry calling /dev/shm/.khp no suspicious javab/rguard/idle/khp/ksmd process SNMP is disabled

If Zimbra MySQL or mailbox fails

After malware activity or an unexpected reboot, Zimbra may show:

mailbox Stopped mysql.server is not running service webapp Stopped zimbra webapp Stopped zimbraAdmin webapp Stopped zimlet webapp Stopped

Check MySQL and services:

su - zimbra -c 'zmcontrol status' su - zimbra -c 'mysql.server status' ss -ltnp | grep 7306 tail -n 200 /opt/zimbra/log/mysqlerror.log

If MySQL is stuck in crash recovery or has a stale socket, back up relevant files first.

Backup before MySQL recovery

mkdir -p /root/zimbra-mysql-backup cp -a /opt/zimbra/log/mysqlerror.log /root/zimbra-mysql-backup/ 2>/dev/null cp -a /opt/zimbra/db/data/tc.log /root/zimbra-mysql-backup/ 2>/dev/null cp -a /opt/zimbra/data/tmp/mysql/mysql.sock /root/zimbra-mysql-backup/ 2>/dev/null cp -a /opt/zimbra/db/data/ibdata1 /root/zimbra-mysql-backup/ 2>/dev/null cp -a /opt/zimbra/db/data/iblogfile /root/zimbra-mysql-backup/ 2>/dev/null

Light MySQL recovery

su - zimbra -c 'zmmailboxdctl stop' mv /opt/zimbra/data/tmp/mysql/mysql.sock /root/zimbra-mysql-backup/mysql.sock.bak 2>/dev/null mv /opt/zimbra/db/data/tc.log /root/zimbra-mysql-backup/tc.log.bak 2>/dev/null su - zimbra -c 'mysql.server start' sleep 20 su - zimbra -c 'mysql.server status' su - zimbra -c 'zmmailboxdctl start' sleep 40 su - zimbra -c 'zmcontrol status'

Expected result:

mysql is running mailbox Running service webapp Running zimbra webapp Running zimbraAdmin webapp Running zimlet webapp Running

This is not a universal fix. Always check /opt/zimbra/log/mysqlerror.log first.

Does this delete mail data?

The malware cleanup steps do not touch mailbox data directly.

Zimbra mail data is usually stored in:

/opt/zimbra/store/

Zimbra database data is usually stored in:

/opt/zimbra/db/data/

The MySQL recovery steps touch tc.log and mysql.sock, so back up first.

Check for JSP webshells

After handling /dev/shm, cron and processes, also check for suspicious JSP files created by the zimbra user in recent days.

Important paths include:

/opt/zimbra/jetty/webapps/ /opt/zimbra/jettybase/webapps/ /tmp/

Unexpected JSP/JSPX files, executable scripts, archives or recently modified web application files may indicate payload staging or webshell deployment.

Check JSP/JSPX files:

find /opt/zimbra/jetty/webapps -type f \( -name ".jsp" -o -name ".jspx" \) -printf '%TY-%Tm-%Td %TH:%TM:%TS %p\n' | sort

If suspicious JSP backdoors are found, preserve evidence first, then quarantine them from both paths:

/opt/zimbra/jetty/webapps/zimbra/ /opt/zimbra/jettybase/webapps/zimbra/

Evidence backup and quarantine:

TS=$(date +%Y%m%d%H%M%S) INC=/root/incident-zmmail-jsp-webshell-$TS QUA=/root/quarantine-zmmail-jsp-webshell-$TS mkdir -p "$INC" "$QUA" # Save list and hashes find /opt/zimbra/jetty/webapps/zimbra /opt/zimbra/jettybase/webapps/zimbra \ -xdev -type f \( -iname '.jsp' -o -iname '.jspx' \) -mtime -30 \ -print > "$INC/suspicious-jsp-list.txt" xargs -a "$INC/suspicious-jsp-list.txt" sha256sum > "$INC/suspicious-jsp-sha256.txt" # Backup samples while read f; do mkdir -p "$INC/files$(dirname "$f")" cp -a "$f" "$INC/files$f" done < "$INC/suspicious-jsp-list.txt" # Quarantine from webroot while read f; do mkdir -p "$QUA$(dirname "$f")" mv "$f" "$QUA$f" done < "$INC/suspicious-jsp-list.txt" # Verify find /opt/zimbra/jetty/webapps/zimbra /opt/zimbra/jettybase/webapps/zimbra \ -xdev -type f \( -iname '.jsp' -o -iname '.jspx' \) -mtime -30 -print

Risks:

If a file is a legitimate custom JSP, removing it may affect a custom webmail function. Random file names and content using exec, base64, AES or command execution are strong webshell indicators. This does not affect mailbox data. A restart is not always required immediately, but webmail should be verified after quarantine.

Important note: zmlogswatch/zmswatch may start again

After disabling SNMP/logwatch to mitigate CVE-2026-73570, zmlogswatch and zmswatch may start again after daily logrotate or after zmcontrol restart.

This happens because Zimbra logrotate configs often contain postrotate commands that restart zmlogswatchctl and zmswatchctl. Also, logger may still be listed in zimbraServiceEnabled.

So after temporary mitigation, check these services periodically, especially after midnight or after restarting Zimbra.

If you need a stronger temporary block before patching, back up the logrotate configs, comment the restart lines, and consider removing logger from zimbraServiceEnabled.

This can prevent logwatch from starting again and reopening the attack vector, but the Admin Console may lose part of its monitoring/statistics.

Disable zmlogswatch/zmswatch so they do not auto-start

Warning: disabling logger, zmlogswatch and zmswatch may make the Zimbra Admin Console show logger/monitoring as red, or remove some graphs/statistics.

During the unpatched phase, this is an acceptable temporary trade-off to prevent logwatch from restarting automatically.

After upgrading to a fixed version, restore the configuration from backup and re-enable logger if needed.

Back up Zimbra logrotate configs

cp -a /etc/logrotate.d/zimbra /etc/logrotate.d/zimbra.bak.$(date +%F-%H%M%S) cp -a /opt/zimbra/conf/zmlogrotate /opt/zimbra/conf/zmlogrotate.bak.$(date +%F-%H%M%S)

Open these two files:

/etc/logrotate.d/zimbra /opt/zimbra/conf/zmlogrotate

Find these lines, often around line 85 and 99:

su - zimbra -c "/opt/zimbra/bin/zmlogswatchctl restart" > /dev/null 2>&1 || true su - zimbra -c "/opt/zimbra/bin/zmswatchctl restart" > /dev/null 2>&1 || true

Comment them:

# su - zimbra -c "/opt/zimbra/bin/zmlogswatchctl restart" > /dev/null 2>&1 || true # su - zimbra -c "/opt/zimbra/bin/zmswatchctl restart" > /dev/null 2>&1 || true

Remove logger from enabled services:

su - zimbra -c 'zmprov ms $(zmhostname) -zimbraServiceEnabled logger'

Stop current logwatch/swatch processes:

su - zimbra -c 'zmlogswatchctl stop' su - zimbra -c 'zmswatchctl stop' su - zimbra -c 'zmlocalconfig -e snmpnotify=no'

Verify:

su - zimbra -c 'zmlogswatchctl status' su - zimbra -c 'zmswatchctl status' su - zimbra -c 'zmlocalconfig snmpnotify' su - zimbra -c 'zmprov gs $(zmhostname) zimbraServiceEnabled | egrep "logger|snmp" || echo "LOGGERSNMPDISABLED"'

Expected result:

zmlogswatch is not running. zmswatch is not running. snmpnotify = no LOGGERSNMPDISABLED

Re-enable monitoring/logger after patching

Only do this after Zimbra is patched or upgraded.

su - zimbra -c 'zmprov ms $(zmhostname) +zimbraServiceEnabled logger' su - zimbra -c 'zmlogswatchctl start' su - zimbra -c 'zmswatchctl start'

If you commented the logrotate files, open them again:

/etc/logrotate.d/zimbra /opt/zimbra/conf/zmlogrotate

Uncomment these lines:

su - zimbra -c "/opt/zimbra/bin/zmlogswatchctl restart" > /dev/null 2>&1 || true su - zimbra -c "/opt/zimbra/bin/zmswatchctl restart" > /dev/null 2>&1 || true

Re-enable SNMP only after patching

su - zimbra -c 'zmprov ms $(zmhostname) +zimbraServiceEnabled snmp' su - zimbra -c 'zmlocalconfig -e snmpnotify=yes' su - zimbra -c 'zmswatchctl start'

Verify after re-enabling:

su - zimbra -c 'zmcontrol status' su - zimbra -c 'zmlogswatchctl status' su - zimbra -c 'zmswatchctl status' su - zimbra -c 'zmlocalconfig snmpnotify' su - zimbra -c 'zmprov gs $(zmhostname) zimbraServiceEnabled | egrep "logger|snmp"'

Post-cleanup tasks

After the server is running again:

Keep SNMP/logwatch disabled until patched. Monitor /dev/shm for 30-60 minutes. Monitor the zimbra crontab. Monitor CPU/load and outbound connections. Check the mail queue. Patch or upgrade Zimbra to a fixed release. Only re-enable SNMP/logwatch after patching and verification.

Check queue:

/opt/zimbra/common/sbin/postqueue -p | tail -n 40

Summary workflow

1. Check /dev/shm, processes and crontab. 2. Stop cron, zmlogswatch and zmswatch. 3. Disable SNMP in Zimbra. 4. Preserve evidence. 5. Kill malware processes. 6. Remove malicious cron. 7. Quarantine malware files. 8. Start cron again. 9. Verify that malware does not respawn. 10. Recover MySQL/mailbox if needed. 11. Check JSP webshells in Zimbra webapps paths. 12. Monitor queue and services. 13. Prevent zmlogswatch/zmswatch from auto-starting before patching. 14. Patch or upgrade Zimbra. 15. Re-enable logger/SNMP only after patching and verification.

References

NVD: CVE-2026-73570 The Hacker News: attackers exploit Zimbra SNMP flaw Zimbra Security Center Zimbra Security Advisories

Conclusion

CVE-2026-73570 is serious because it can allow remote command execution as the zimbra user through SNMP notification/logwatch handling.

In observed incidents, attackers dropped malware into /dev/shm, added cron persistence, and ran a miner or backdoor.

The key point is this: do not only delete the malware file. Stop the reinfection path first.

A practical response order is:

stop cron + SNMP/logwatch -> preserve evidence -> kill malware -> remove malicious cron -> quarantine payloads -> check JSP webshells -> verify clean state -> recover Zimbra if needed -> block logwatch auto-restart before patching -> patch/upgrade Zimbra

Most important: do not re-enable SNMP/logwatch before Zimbra is patched, because that may allow the malware to return.

First published (updated )
Social
reddit

Contact

SecAlerts Pty Ltd.
132 Wickham Terrace
Fortitude Valley,
QLD 4006, Australia
info@secalerts.co
By using SecAlerts services, you agree to our services end-user license agreement. This website is safeguarded by reCAPTCHA and governed by the Google Privacy Policy and Terms of Service. All names, logos, and brands of products are owned by their respective owners, and any usage of these names, logos, and brands for identification purposes only does not imply endorsement. If you possess any content that requires removal, please get in touch with us.
© 2026 SecAlerts Pty Ltd.
ABN: 70 645 966 203, ACN: 645 966 203