A booby-trapped email that reads itself and empties your inbox before you finish your coffee
CVE-2025-66376 is a stored XSS in Zimbra Collaboration Suite's Classic Web UI caused by insufficient sanitization of CSS @import directives inside HTML email bodies. Attackers wrap a Base64 payload inside an SVG onload handler and fragment the surrounding markup with fake @import directives, split tags, and HTML comments so Zimbra's sanitizer misses it — but the victim's browser reassembles it into live JavaScript that runs the moment the message renders. Affected builds are ZCS 10.0.x < 10.0.18 and ZCS 10.1.x < 10.1.13; fixes shipped in November 2025.
Zimbra rated this HIGH (7.2) with a Scope:Changed, Confidentiality:Low, Integrity:Low vector — a textbook stored-XSS math result. That math is wrong for this bug. It is *zero-click*, executes in the victim's authenticated webmail origin, and has been used by Russia's Laundry Bear / Void Blizzard / TA488 to exfiltrate 90 days of mail, hijack sessions, and steal 2FA codes from government targets. CISA added it to KEV and issued a joint advisory (AA26-204A). Real-world impact is full mailbox compromise without user interaction — that is CRITICAL, not HIGH.
5 steps from start to impact.
Craft the poisoned HTML email
onload attribute holding a Base64-encoded JavaScript payload. The payload is obscured with split HTML tags, comments, and dummy CSS @import directives so it does not match Zimbra's sanitizer heuristics. Tooling is trivial — a text editor and any SMTP relay.- Any SMTP path to the target's Zimbra MX
- Knowledge of a valid recipient address
- None material — email is a public-facing service by design
Deliver to Zimbra mailbox
- Recipient uses Zimbra Classic UI (default for most on-prem deployments)
- Users on the Modern UI may be less exposed depending on rendering path — but most enterprise ZCS installs default to Classic
<svg[^>]*onload in stored .eml are cheap and effective.Sanitizer bypass on render
@import directives and split tags, Zimbra's server-side sanitizer does not flag it. The browser's HTML parser is more permissive and reconstructs the SVG+onload into valid, executing JavaScript.- Vulnerable ZCS build (<10.0.18 / <10.1.13)
- Strict CSP on the Zimbra webmail origin would stop inline script — but stock ZCS does not ship a locked-down CSP
@import + SVG combinations in outbound HTML render responses are possible but unusual.Session hijack and mailbox exfiltration
- Victim has an active webmail session or logs in later while the message is rendered
- Egress DLP monitoring Zimbra API traffic can catch bulk exports — rarely deployed
CreateFilterRule and SearchRequest/GetMsgRequest bursts; hunt for anomalous forwarding rules and API-driven bulk reads from user sessions.Pivot to further identity compromise
- Victim uses email-based recovery or OTP delivery for other services
- Phishing-resistant MFA (FIDO2 / hardware keys) breaks this pivot
The supporting signals.
| In-the-wild status | Active exploitation by Russian APT Laundry Bear / Void Blizzard / TA488 against NATO, Ukraine, and US government mail servers. Exploited as a zero-day before the November 2025 patch. |
|---|---|
| KEV status | Listed on CISA KEV. Joint CSA AA26-204A issued 2026-07-22 with FVEY partners. Federal patch deadline enforced. |
| EPSS | 0.12009 (~top 3–5% percentile). Understated given confirmed KEV + APT use — EPSS lags behind operator intel. |
| CVSS vector interpretation | AV:N/AC:L/PR:N/UI:N/S:C/C:L/I:L/A:N — network, no privileges, no user interaction (zero-click), scope-changed. C/I:Low is the vendor being generous; real impact is full mailbox read + persistence. |
| Affected versions | ZCS 10.0.0 – 10.0.17 and 10.1.0 – 10.1.12. ZCS 9.x and 8.x lines are separately EoL — check independently. |
| Fixed versions | ZCS 10.0.18 and ZCS 10.1.13, released November 2025. |
| Proof of concept | Payload details (SVG onload + fragmented @import bypass, Base64 JS) are documented in the CISA advisory and eSecurityPlanet writeup — reproduction is trivial from public IOCs. |
| Exposure data | Shodan/Censys typically show 30,000–50,000 internet-facing Zimbra webmail hosts. Zimbra is disproportionately deployed by government, education, and telecoms outside the US — exactly TA488's target profile. |
| Disclosed / patched | Patched November 2025; CVE published 2026-01-05; KEV addition and joint advisory July 2026 after espionage campaign disclosed. |
| Reporting | Attribution and IOCs published jointly by CISA, NSA, FBI, NCSC-UK, NCSC-NL, ACSC, CCCS, and French ANSSI. |
noisgate verdict.
Verdict is CRITICAL because the single most decisive factor is active KEV-listed exploitation by a nation-state APT against the exact deployment role — internet-facing enterprise webmail — with zero user interaction. The vendor's HIGH/7.2 is a mechanical CVSS output for stored XSS; it does not model zero-click execution in an identity-adjacent mailbox that already holds 2FA codes and password resets for the rest of the estate.
Why this verdict
- Zero-click, no privileges: the CVSS vector itself reports
PR:N/UI:N— the attacker only needs an SMTP path to the recipient. No friction filter removes anyone from the reachable population. - Active nation-state exploitation: Laundry Bear / TA488 is currently burning this against NATO and Ukrainian government mail. KEV + FVEY joint advisory removes any 'theoretical' discount.
- Role multiplier — enterprise webmail is an identity-adjacent, high-value role: the compromised origin can read all mail including MFA OTPs, password-reset links, and executive correspondence, and can set persistent forwarding filters. Chain outcome per victim = full mailbox takeover; per organization = SSO / SaaS pivot via harvested resets. Zimbra installs are canonically in this role → floor is CRITICAL.
- Vendor C:L / I:L is misleading: stored XSS scoring conventions underweight the fact that the vulnerable origin *is* the crown-jewel data store. There is no scope-changed pivot needed to reach the sensitive data — it is already in the same origin.
Why not higher?
No higher bucket exists above CRITICAL in this schema. Reassessed 9.3 rather than 10.0 because impact is scoped to the individual mailbox origin per exploit (attacker must land a message per target account for full effect) and does not directly yield RCE on the Zimbra host itself.
Why not lower?
Downgrading to HIGH would require ignoring the KEV listing, the zero-click vector, and the ongoing FVEY-attributed campaign. The bug requires no authentication, no interaction, and hits a component whose whole purpose is to hold the organization's most sensitive written communication — every friction argument for a downgrade fails.
What to do — in priority order.
- Patch to ZCS 10.0.18 or 10.1.13 now — This is the only durable fix. Given CRITICAL + active exploitation, the KEV-override applies: mitigate/patch within hours, not the standard 3-day noisgate mitigation SLA. Schedule the maintenance window today.
- Switch users off Classic UI to Modern UI as an interim — The reported exploitation path targets Classic UI rendering. Setting
zimbraPrefClientType=advanced(Modern) organization-wide reduces exposure while patching rolls out. Not a substitute for the patch. - Strip SVG and CSS @import at the mail gateway — Add Proofpoint/Mimecast/Rspamd rules to drop or neutralize inbound HTML containing
<svgwith event handlers and@importin style blocks from external senders. Deploy within 24 hours as belt-and-braces. - Hunt for TA488 IOCs and unauthorized mail filters — Pull the CISA AA26-204A IOC list. Run
zmprov gafacross all accounts to enumerate mail filters and forwarding rules; alert on any external-forward or silent-copy rule created since November 2025. Complete within 72 hours. - Force session invalidation and password rotation post-patch — If any host ran a vulnerable build after November 2025, assume mailbox compromise. Rotate credentials, revoke OAuth tokens, invalidate active sessions (
zmprov -l flushCache), and rotate any secrets/2FA seeds that transited email.
- Web Application Firewall in front of Zimbra — the payload arrives via SMTP, not HTTP, so the WAF never sees it until the browser fetches the rendered message, which is same-origin.
- MFA on Zimbra logins — the exploit runs *inside* an already-authenticated session; MFA is bypassed by design.
- Endpoint EDR on user workstations — the malicious JS runs in the browser origin and calls Zimbra APIs; there is no binary drop and no anomalous process to hook.
- Blocking the CSS
@importkeyword alone at the gateway — TA488 uses *fake*@importas a sanitizer confusion primitive; the real payload is in SVG onload. Filtering only@importmisses the actual execution vector.
Crowdsourced verification payload.
Run this on each Zimbra mailbox server as the zimbra user (e.g. sudo -u zimbra bash check-cve-2025-66376.sh). It reads zmcontrol -v to get the installed ZCS version and compares against the fixed builds. No network calls; no elevated privileges beyond the zimbra service account.
#!/usr/bin/env bash
# noisgate verification for CVE-2025-66376 (Zimbra Collaboration XSS)
# Run as the 'zimbra' service account on each ZCS mailbox host.
# Exit codes: 0 = PATCHED, 1 = VULNERABLE, 2 = UNKNOWN
set -u
ZMCONTROL="$(command -v zmcontrol || echo /opt/zimbra/bin/zmcontrol)"
if [ ! -x "$ZMCONTROL" ]; then
echo "UNKNOWN: zmcontrol not found — is this a Zimbra host?"
exit 2
fi
RAW="$($ZMCONTROL -v 2>/dev/null)"
# Example: 'Release 10.1.9_GA_4870.RHEL9_64_20250715120000 RHEL9_64 FOSS edition, Patch 10.1.9_P1.'
VER="$(echo "$RAW" | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' | head -n1)"
if [ -z "$VER" ]; then
echo "UNKNOWN: could not parse ZCS version from: $RAW"
exit 2
fi
IFS='.' read -r MAJ MIN PAT <<< "$VER"
echo "Detected ZCS version: $VER"
# Fixed: 10.0.18 (10.0.x branch) and 10.1.13 (10.1.x branch)
if [ "$MAJ" -eq 10 ] && [ "$MIN" -eq 0 ]; then
if [ "$PAT" -ge 18 ]; then
echo "PATCHED: 10.0.$PAT >= 10.0.18"; exit 0
else
echo "VULNERABLE: 10.0.$PAT < 10.0.18 (CVE-2025-66376)"; exit 1
fi
elif [ "$MAJ" -eq 10 ] && [ "$MIN" -eq 1 ]; then
if [ "$PAT" -ge 13 ]; then
echo "PATCHED: 10.1.$PAT >= 10.1.13"; exit 0
else
echo "VULNERABLE: 10.1.$PAT < 10.1.13 (CVE-2025-66376)"; exit 1
fi
elif [ "$MAJ" -lt 10 ]; then
echo "VULNERABLE: ZCS $VER is EoL and does not receive this fix — treat as vulnerable and plan upgrade"; exit 1
else
echo "UNKNOWN: unrecognized branch $MAJ.$MIN — verify against Zimbra Security Center"; exit 2
fi
If you remember one thing.
Sources
- CISA Joint Advisory AA26-204A
- US DoD Cybersecurity Advisory PDF
- BleepingComputer — CISA orders feds to patch Zimbra XSS
- BleepingComputer — Russian hackers exploit Zimbra zero-click flaw
- The Hacker News — Laundry Bear Zimbra 0-day
- eSecurityPlanet — TA488 technical writeup
- Zimbra Security Center
- SecurityAffairs — Laundry Bear campaign
What defenders are saying.
Crowdsourced verification outputs.
Results submitted by users who ran the verification payload against their environment.