Open Source · · 1 day
watercrawl-mcp hid Glassworm payload
The Glassworm threat actor published malicious versions of @iflow-mcp/watercrawl-watercrawl-mcp with payloads hidden by invisible Unicode characters.
Part of Glassworm hid credential theft in Unicode campaign
On March 12, 2026, five consecutive versions of an npm package called @iflow-mcp/watercrawl-watercrawl-mcp (1.3.0 through 1.3.4) were pushed to the registry with hidden payloads, researchers at Aikido reported the following day. The unwieldy package name was the kind of thing a casual reviewer would skim past; the malicious code was, by design, the kind a careful reviewer could not see at all.
The payload was encoded into Unicode variation selectors, invisible code points that render as nothing in editors and diff views. A small runtime decoder reassembled the hidden bytes and passed them to eval(). The technique, infrastructure, and timing matched the GlassWorm samples Aikido was tracking the same week across GitHub repositories and a VS Code extension.
This record covers the npm artifact. The broader Glassworm wave is tracked at [[glassworm-march-2026]].
For defenders, the package versions were the cleanest handle. Any lockfile, package cache, or CI install that resolved to 1.3.0 through 1.3.4 needed review for hidden Unicode payloads and credential exposure, even if the visible JavaScript looked empty.
Appendix · Affected releases
- Software Heritage's npm loader retained original-artifact metadata for all five removed archives. In version order 1.3.0 through 1.3.4, their authoritative SHA-256 values are 10eb2fd6859984be12910fb585d4d936cf92ecc6b26d87dd15397010fd785d2f, 8414f5ca152dfab1e09ce4a864d52e8e1d48bdfd532ef8efb39efa3c1e423492, c845bc4c679d3fbf7aabbd64fa8e748b00514072113fb15884f02923c71673ce, 400bb8571300ebb98cec455f5ea390e90bf2f362cb5a4d1817bd805a9d1fcb94, and 24670ea3b939d512d77498e45d36177c0784136401a106495451feebcd151a48.
- Software Heritage also retains exact complete member trees for every release. Local npm-pack archives reproduce those trees but not the authoritative whole-archive digests, so all local samples remain explicitly named RECONSTRUCTED; the complete comparison is in the sample manifest.
Indicators
- commit333cb002614b59cf555cf80d845a7e9c2c69a099
- commite35a43af66479882509b4b50d838e5e16983fffb
References
- GlassWorm Returns: New Wave Strikes as We Expose Attacker Infrastructureaikido.dev
- GlassWorm Returns: Developer Toolchain Worm Expands to GitHub and npm - Cloud Security Alliancelabs.cloudsecurityalliance.org
- An Evolving GlassWorm Malware is Making the Rounds of Code Repositories - Security Boulevardsecurityboulevard.com
- GlassWorm Hits MCP in Fifth Wave with New Delivery Techniques - Koi Securitykoi.ai
- WaterCrawl source commit containing the invisible payloadgithub.com
- Software Heritage npm snapshot for @iflow-mcp/watercrawl-watercrawl-mcparchive.softwareheritage.org
- jsDelivr retained WaterCrawl 1.3.4 member manifestdata.jsdelivr.com
Source record: oss/attacks/watercrawl-mcp/meta.yaml