Campaign · Open Source · · 15 days

Glassworm hid credential theft in Unicode

The March 2026 Glassworm wave used invisible PUA Unicode, Solana dead drops, staged loaders, and compromised official repositories to hide credential theft inside JavaScript packages, VS Code extensions, and GitHub source trees.

Draws together 6 incidents across 6 packages

Glassworm made source text itself part of the delivery system. In March 2026, the operators hid JavaScript inside invisible Unicode characters, so a reviewer could open the file, see a harmless-looking string, and miss the executable payload entirely. The loader reversed that trick at runtime, decoded the hidden bytes, and handed them to JavaScript for execution.

The first March cluster was mostly a source-repository problem. Aikido found more than 150 GitHub repositories carrying Glassworm-like commits, including the more visible pedronauck/reworm repository. That gave the campaign a quiet staging surface: poisoned code could sit in public trees, pass casual review, and later reach developers who cloned, forked, or vendored the affected projects. The second cluster moved through official distribution channels, where Aikido connected npm packages such as react-native-country-select, react-native-international-phone-number, @aifabrix/miso-client, and @iflow-mcp/watercrawl-watercrawl-mcp, plus the quartz.quartz-markdown-editor VS Code extension. Some artifacts were registry releases with versions and download paths; others were repository commits, and the individual attack records keep those trust boundaries separate.

The payload family focused on developer credentials and execution context. Reports describe staged loaders, Solana-based dead drops, environment-aware execution, and theft from the places a developer workstation or CI runner naturally exposes: tokens, cloud credentials, package-registry secrets, and local configuration files.

The campaign matters because the concealment method attacked the review process itself. Package maintainers could compare a diff and still miss the working code. Security teams had to search for invisible characters, not just suspicious strings, and then map each hit back to the distribution surface that could have put it on a machine.

Notes

  • Aikido reported react-native-country-select and react-native-international-phone-number had 29,763 combined weekly downloads and 134,887 combined monthly downloads on March 16, 2026; these download counts are context, not confirmed infection counts.
  • Aikido reported 151 GitHub repositories with Glassworm-like Unicode payloads in the March 2026 wave; this campaign groups that broader source-repository scope without creating one record per small repository.
  • Notable repositories named by Aikido include pedronauck/reworm, doczjs/docz-plugin-css, wasmer-examples/hono-wasmer-starter, anomalyco/opencode-bench, uknfire/theGreatFilter, and sillyva/rpg-schedule.

Incidents in this campaign

  1. reworm repo hid Glassworm payload
  2. miso-client hid Glassworm payload
  3. Quartz extension hid Glassworm payload
  4. watercrawl-mcp hid Glassworm payload
  5. react-native-country-select npm account takeover
  6. react-native-international-phone-number npm account takeover

Appendix · Affected packages

reworm 2026-03-03 to 2026-03-09
@aifabrix 2026-03-12 to 2026-03-13
4.7.2
quartz.quartz-markdown-editor 2026-03-12 to 2026-03-13
0.3.0
@iflow-mcp 2026-03-12 to 2026-03-13
1.3.01.3.11.3.2 +2 more
react-native-country-select 2026-03-16 to 2026-03-18
0.3.910.4.10.4.2
react-native-international-phone-number 2026-03-16 to 2026-03-18
0.11.80.12.10.12.2 +1 more

Samples and hashes sit on each incident page, linked above

References

  1. Glassworm Strikes Popular React Native Phone Number Packagesaikido.dev
  2. GlassWorm Returns: New Wave Strikes as We Expose Attacker Infrastructureaikido.dev

Source record: oss/campaigns/glassworm-march-2026/meta.yaml