4

Ecosystems

5mo+

Campaign Duration

50

C2 Transactions

The Story

Between March 3 and March 9, 2026, an attacker compromised developer accounts on GitHub and force-pushed malicious code into at least 151 repositories, including projects from Wasmer, Reworm, and anomalyco (the organization behind OpenCode and SST). The injections targeted Python projects spanning Django apps, ML research code, Streamlit dashboards, and PyPI packages, appending obfuscated payloads to files like setup.py, main.py, and app.py.

The technique that makes GlassWorm different from every other supply chain attack is its steganographic payload delivery. The attacker encodes malicious code inside invisible Unicode Private Use Area characters in the ranges U+FE00 through U+FE0F and U+E0100 through U+E01EF. Every major code editor, terminal, syntax highlighter, diff tool, and linting engine renders these characters as nothing. A backtick string that appears completely empty in your IDE can contain a full malicious payload. No standard code review process will catch it.

Once decoded via JavaScript's eval(), the payload queries a Solana blockchain wallet for command-and-control instructions. The C2 URL is embedded in the memo field of blockchain transactions associated with wallet address BjVeAjPrSKFiingBn4vZvghsGj9KCE8AJVtbc9S8o8SC. StepSecurity traced 50 transactions on this address dating back to November 27, 2025, with the attacker regularly rotating payload URLs, sometimes multiple times per day. The blockchain serves as an immutable, censorship-resistant C2 channel that traditional network-based takedowns cannot touch.

The campaign extends well beyond GitHub. Socket Research identified 72 malicious Open VSX extensions published between January 31 and March 13, 2026. These extensions mimic legitimate developer tools, including linters, code runners, and AI coding assistant integrations. A third-generation technique abuses the extensionPack and extensionDependencies manifest fields to turn initially benign extensions into transitive delivery vehicles, silently pulling in payload-bearing dependencies after passing marketplace review.

On the npm side, packages including @aifabrix/miso-client and @iflow-mcp/watercrawl-watercrawl-mcp were compromised on March 12. Two React Native packages were also briefly hijacked to push malicious versions directly to the registry without corresponding GitHub releases.

Aikido Security assessed that the campaign likely uses LLM-generated cover commits to disguise the malicious injections. The surrounding changes, documentation tweaks, version bumps, small refactors, and bug fixes, are stylistically consistent with each target project. Crafting 151+ bespoke code changes across different codebases manually is not feasible at this scale. Koi Security independently corroborated this assessment.

The Git injection technique itself is novel. The attacker rebases the latest legitimate commits on the default branch with malicious code, then force-pushes the changes while preserving the original commit message, author, and author date. This leaves no pull request trail, no visible diff in GitHub's UI, and no commit history anomaly unless you compare committer timestamps against author timestamps.

The Adversary Perspective

From a red team standpoint, GlassWorm is a masterclass in layered evasion. Every design choice is optimized to exploit a specific trust assumption in the developer workflow.

The invisible Unicode payload defeats visual code review. No human reviewer can see it. No syntax highlighter marks it. No linter flags it. The only detection path is binary-level analysis of the file contents, something almost no one does on a routine git pull.

The force-push with preserved metadata defeats Git-based change detection. Most supply chain security tooling looks for suspicious commits, new contributors, or pull requests from unknown accounts. GlassWorm skips all of that by overwriting history under the original author's identity.

The Solana blockchain C2 defeats network-based takedowns. You cannot take down a blockchain transaction. The attacker can update the payload URL by posting a new transaction memo, and every infected endpoint will pick up the change within five seconds. Traditional approaches like domain seizures and IP blacklists are irrelevant against this infrastructure.

The transitive dependency abuse in VSCode extensions defeats marketplace review. An extension that passes review cleanly can later silently inherit a malicious dependency without any code change to itself. The trust model of extension marketplaces was not designed for this attack pattern.

Figure 01

  1. STEP 01

    Developer Account Compromise

    Stolen GitHub tokens or credentials used to access developer accounts. Open VSX publisher tokens compromised or inferred. No MFA bypass required if tokens are leaked from CI/CD or env files.
  2. STEP 02 // CRITICAL

    Invisible Payload Injection

    Malicious code encoded in invisible Unicode PUA characters (U+FE00-U+FE0F, U+E0100-U+E01EF). Appended to Python files, JS packages, or VSCode extensions. Zero visual footprint in any editor or diff tool.
  3. STEP 03 // CRITICAL

    History-Preserving Force Push

    Git history rewritten via rebase + force-push. Original commit message, author, and date preserved. No pull request created. No visible diff in GitHub's UI. LLM-generated cover commits add realistic documentation tweaks and refactors.
  4. STEP 04

    Blockchain C2 Activation

    Decoded payload queries Solana wallet BjVeAj...o8SC every 5 seconds. C2 URL embedded in transaction memo fields. 50 transactions since Nov 2025. Payload URLs rotated multiple times per day.
  5. STEP 05 // CRITICAL

    Credential & Crypto Theft

    Second-stage JavaScript stealer downloads via Node.js runtime. Targets: SSH keys, cloud credentials, API tokens, cryptocurrency wallets, environment variables, CI/CD secrets. Skips execution if system locale is Russian.
  6. STEP 06

    Transitive Extension Abuse

    72 Open VSX extensions use extensionPack/extensionDependencies to pull in GlassWorm-linked payloads as transitive dependencies. Previously clean extensions become carriers without any code change to themselves.

Detection Indicators

  • Solana C2 Wallet: BjVeAjPrSKFiingBn4vZvghsGj9KCE8AJVtbc9S8o8SC
  • Marker Variable: lzcdrtfxyqiplpd (present in compromised Python files)
  • Persistence File: ~/init.json
  • Unexpected Node.js: ~/node-v22* directories
  • Suspicious Files: i.js in recently cloned projects
  • Git Anomaly: Committer date significantly newer than author date
  • Unicode Ranges: U+FE00-U+FE0F, U+E0100-U+E01EF in source files
  • Locale Check: Malware skips execution on Russian-locale systems
  • Ecosystems Affected: GitHub, npm, Open VSX, VS Code Marketplace, PyPI

Defensive Takeaways

  1. 1

    Scan Codebases for Invisible Unicode Characters Immediately

    Search your repositories for characters in the PUA Unicode ranges U+FE00 through U+FE0F and U+E0100 through U+E01EF. These should never appear in legitimate source code. Run grep -rP '[\x{FE00}-\x{FE0F}\x{E0100}-\x{E01EF}]' across all cloned repositories and dependencies. If you find matches, treat the repository as compromised and investigate the commit history for the injection point.

  2. 2

    Check for GlassWorm-Specific IOCs on Developer Machines

    Search for the marker variable lzcdrtfxyqiplpd across your codebase. Check for the persistence file ~/init.json. Look for unexpected Node.js installations in home directories (e.g., ~/node-v22*). Check for suspicious i.js files in recently cloned projects. Any match is a confirmed indicator of GlassWorm compromise.

  3. 3

    Audit Git Commit Timestamps for Author vs. Committer Discrepancies

    GlassWorm preserves original author dates while force-pushing under a new committer timestamp. Run git log --format="%H %ai %ci" and look for commits where the committer date is significantly newer than the author date. This pattern is a strong indicator of history-rewriting injection. Implement pre-receive hooks or CI checks that flag force-pushes to default branches, especially those that rewrite existing commit history.

  4. 4

    Block or Monitor Solana RPC Traffic from Developer Workstations

    GlassWorm's C2 queries Solana blockchain endpoints every five seconds. Most developer machines have no legitimate reason to communicate with Solana RPC nodes (mainnet-beta.solana.com and similar endpoints). Block or alert on this traffic at the network level. If blockchain-based C2 becomes a broader pattern, consider maintaining a blocklist of known cryptocurrency RPC endpoints for non-crypto development environments.

  5. 5

    Review and Lock Down VSCode/Open VSX Extension Policies

    72 malicious extensions used transitive dependency abuse to deliver payloads through the extension manifest. If your organization allows developers to install extensions freely from Open VSX or the VS Code Marketplace, implement an allowlist of approved extensions managed by your security team. Disable auto-updates for extensions or require manual approval. The transitive dependency attack means that a previously safe extension can become a GlassWorm carrier through a dependency change alone, with no update to the extension itself.