Open Source · · 6 days
miso-client hid Glassworm payload
Glassworm published @aifabrix/miso-client 4.7.2 with invisible Unicode JavaScript. The code looked empty in review but decoded to malware at runtime.
Part of Glassworm hid credential theft in Unicode campaign
On March 12, 2026, an npm package called @aifabrix/miso-client shipped a new version, 4.7.2, that to anyone scanning the diff looked unchanged. The visible JavaScript was clean. The payload, researchers at Aikido reported the following day, was hidden inside Unicode variation selectors, code points that render as nothing in every editor and code-review interface in common use.
At runtime a small decoder pulled those invisible characters back into executable bytes and passed the result to eval(). Aikido named miso-client as one of two npm artifacts caught in the March wave of Glassworm, the same family that hid identical loaders inside more than 150 GitHub repositories and a VS Code extension around the same time. Earlier Glassworm samples staged second-stage code through Solana-based dead drops and harvested tokens, cloud credentials, and other developer secrets.
This record covers the npm artifact, since that is the path through which miso-client could enter an unrelated dependency graph during a normal install. The wider campaign scope is tracked at [[glassworm-march-2026]].
The response problem was different from a normal suspicious-string hunt. Teams had to search package contents and source trees for invisible code points, then map any hits back to the install path that could have executed the decoder on a developer machine or CI runner.
Appendix · Affected releases
- The exact malicious source is retained in Git commit 9e80710d9af9b360bb1697ae7a5de8d89db4814f. Building that commit with the repository's Node 20, pnpm 9, and frozen-lockfile workflow reproduces all 446 published member paths, sizes, and SHA-256 values in jsDelivr's retained 4.7.2 manifest. The original npm gzip bytes and authoritative whole-archive checksum remain unavailable, so the local complete-tree sample is explicitly reconstructed.
- Commit 50c55c83fbddfb28003298660e79a27311e85c52 removed the four-line invisible loader from src/express/error-types.ts on 2026-03-13.
Indicators
- commit9e80710d9af9b360bb1697ae7a5de8d89db4814f
- commit50c55c83fbddfb28003298660e79a27311e85c52
References
- Glassworm Returns: Invisible Unicode Malware Found in 150+ GitHub Repositoriesaikido.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
- aifabrix-miso-client 4.7.2 source commit containing the invisible payloadgithub.com
- aifabrix-miso-client commit removing the invisible payloadgithub.com
- jsDelivr retained @aifabrix/miso-client 4.7.2 member manifestdata.jsdelivr.com
Source record: oss/attacks/miso-client/meta.yaml