Shai-Hulud moved from npm to PyPI. 19 bioinformatics packages, 37 malicious releases, hundreds of thousands of downloads — and a payload that's explicitly hunting Claude/MCP configuration files alongside the standard credential sweep. Socket caught it June 8. The scientific Python ecosystem had a quiet few weeks before that.
The delivery mechanism is almost elegant in how boring it is. No pip error. No install warning. Just a .pth file sitting in the wheel. The next time Python starts — CI job, notebook kernel, test runner, pip list — so does the malware. The exposure window for any org running these packages in automated pipelines is effectively "since installation." Dynamo, Spateo, CoolBox, U-FISH, Napari-UFISH. Research tools. The kind that live on data science workstations and MLOps pipelines that historically get less scrutiny than production infra. Predictable in retrospect.
The credential scope is unusually wide even by supply chain standards: GitHub tokens, Actions secrets, npm/PyPI/RubyGems/JFrog publishing tokens, AWS/GCP/Azure/Kubernetes/Vault credentials, SSH keys, Docker creds, .env/.npmrc/.pypirc, shell histories. And then, specifically, Claude/MCP configuration files. That's the tell. Shai-Hulud isn't just after cloud credentials — it's after AI agent configurations that may carry API keys, tool access, and agentic workflow definitions. The attack surface expanded to match the toolchain. We are nothing if not consistent.
The exfiltration camouflage is where it gets deliberate. Traffic goes to
api.anthropic.com/v1/api — a legitimate-looking but invalid endpoint. Any org that allowlists Anthropic API traffic at the network layer without inspecting payloads just handed this campaign a free pass. The malware walks out wearing a lab coat.
Persistence lands via systemd services on Linux, LaunchAgents on macOS. The JavaScript payload (_index.js, obfuscated) runs under Bun, which the malware downloads from GitHub. Exfiltration goes two ways: auto-created GitHub repos via GitHub Actions, and HTTPS to that Anthropic-camouflaged endpoint. The evasion logic includes a Russian locale check and a StepSecurity Harden-Runner detection — this actor is thinking about the environments they're landing in.
The harder problem is the propagation vector. Shai-Hulud isn't typosquatting. It's compromising legitimate maintainer accounts and injecting malicious releases into packages you already trust and already have pinned. Typosquatting is detectable by name-matching. A trusted package releasing a malicious version is a different threat model entirely — and the one the ecosystem is less equipped to catch at install time.
Combined with the npm wave, the campaign is now at 453 artifacts across two ecosystems. This isn't a niche supply chain story anymore. It's an active, multi-ecosystem operation with an expanding playbook and an explicit interest in AI tooling.
MITRE: T1195.001 (supply chain compromise), T1059.007 (JavaScript interpreter via Bun), T1546.004 (.pth startup hook), T1543.001/002 (LaunchAgent systemd persistence), T1552.001 (credentials in files), T1567.001 (exfil to GitHub repos via Actions).
If your org runs any of the affected packages in development, research, or CI environments — rotate secrets now. GitHub tokens, cloud credentials, and anything stored in Claude Desktop or MCP config files. This is not a monitor-and-patch situation. The full affected package list is on Socket's tracker.