Supply Chain Attacks 2026: npm, PyPI, VS Code, AI Agents — 0 CVEs

The Acceleration: How Supply Chain Attacks Went Industrial Across npm, PyPI, VS Code, and AI Agent Tooling

Executive Summary

Supply chain attacks in 2026 do not look like growth. The Phoenix Security Malware Package Intelligence (MPI) corpus covers 59 supply chain attack campaigns from June 2024 through June 2026 and indexes 657 individual malicious package-versions as concrete, scanner-ready IOCs. When you plot that corpus month by month, the curve looks like ignition.

The full year 2025 produced 14 campaigns and 111 indexed packages. The first half of 2026 alone produced 37 campaigns and 497 indexed packages — 2.6 times the campaign count and 4.5 times the package volume of the entire preceding year. May 2026 was the single busiest month on record: 14 campaigns and 346 indexed packages in 31 days, more than the four months before it combined. That spike has a specific cause. One self-propagating worm event in May generated 226 of those 346 indexed packages, and the worm is still the defining technical innovation of this period: a mechanism that converts a single compromised maintainer token into hundreds of poisoned packages without human input between hops.

Phoenix Research – Campaign analysis

The external ecosystem data tells the same story from a wider angle. Phoenix Security tracked a 188 percent year-over-year jump in malicious open source packages in Q2 2025, followed by a 140 percent quarter-over-quarter increase in Q3 2025, with 454,600 new malicious packages across the year and a cumulative total that crossed 1.23 million. ReversingLabs found that npm malware more than doubled in 2025 and now represents nearly 90 percent of all open source malware the firm detects. Meanwhile, PyPI and NuGet malware declined 43 and 60 percent, respectively, after those registries shipped mandatory 2FA and trusted publishing — confirming that attackers do not grind through friction, they route around it.

Two new attack surfaces entered active production during this period. The VS Code Marketplace went from near-zero malicious activity to 7 documented campaigns in 18 months, with ReversingLabs recording detections that nearly quadrupled from 27 in 2024 to 105 in the first 10 months of 2025. AI agent tooling — MCP server injection, .cursorrules poisoning, CLAUDE.md hidden instructions, AI coding assistant SessionStart hooks — moved from theoretical concern to confirmed delivery mechanism across at least 14 of 59 tracked campaigns (note some of those data might be due to limited visibility pre-2025, nonetheless the acceleration is clear)

Across all 59 campaigns, CVE count: zero during active exploitation. Every single one.

TL;DR for Engineering Teams

Label Content
What it is An industrialized, accelerating wave of supply chain attacks across npm, PyPI, VS Code, and AI agent tooling. Phoenix MPI tracks 59 campaigns / 657 malicious package IOCs, Jun 2024–Jun 2026. External data: 188% YoY jump (Sonatype Q2 2025), 140% QoQ rise in Q3. npm carries ~90% of all detected open-source malware.
Where it bites Developer workstations and CI/CD runners. Detonation at npm install, workspace open, CI run, or AI agent session start. May 2026 alone: 14 campaigns, 346 indexed packages.
Why it matters Self-propagating worms convert one stolen token into hundreds of poisoned packages. AI agent config files are now persistence mechanisms. The VS Code surface went from 0 to 7 campaigns in 18 months. 0 CVEs assigned across the entire 59-campaign corpus.
Patch status Not applicable — no CVEs mean no patch path. The attack surface is a trust assumption, not a code defect.
Immediate action Audit lockfiles against current IOC sets. Rotate all credentials from any affected install. Check .vscode/tasks.json, ~/.claude/settings.json, .cursorrules, CLAUDE.md, and .github/workflows/ for injected entries. Pin GitHub Actions to commit SHAs. Run grep -rn “binding.gyp” and grep -rn “Miasma: The Spreading Blight” across your repositories.

Threat Overview

Field Value
Threat class Software supply chain compromise
Phoenix MPI corpus 59 campaigns, 657 indexed malicious package IOCs, Jun 2024–Jun 2026
Primary ecosystems npm (79.3% of IOCs), PyPI (9.0%), VS Code/OpenVSX (6.2%), Golang, RubyGems, Cargo, NuGet, Packagist
Lead threat actors TeamPCP (UNC6780) — 19 campaigns; Shai-Hulud lineage — 14 campaigns; DPRK clusters (Lazarus, Contagious Interview, Sapphire Sleet) — 9 campaigns; IronWorm — 1 (Jun 2026)
CVEs assigned Zero, across all 59 campaigns during active exploitation
Active exploitation Confirmed, ongoing
Detection gap CVE-feed scanners blind to 100% of documented campaigns

The Acceleration Curve

Year over year

Year Campaigns Indexed Malicious Packages
2024 6 30
2025 14 111
2026 H1 (Jan–Jun) 37 497

2026 is barely half over and has already produced more than 2.6 times the campaign volume and 4.5 times the package volume of the entire preceding year. Projected linearly, 2026 is on track for approximately 74 campaigns and around 1,000 indexed packages — a roughly 5-fold year-on-year step after 2025 had already nearly doubled 2024.

Inside 2026 — the curve steepens month over month

Month (2026) New Campaigns New Packages Cumulative Packages
Jan 2 4 4
Feb 3 26 30
Mar 6 21 51
Apr 8 26 77
May 14 346 423
Jun (to 7th) 4 74 497

May 2026 is the single busiest month on record across the entire two-year corpus. Fourteen distinct campaigns, 346 indexed packages, more than the prior four months of 2026 combined. The May spike is the signature of automation: Mini Shai-Hulud Wave 2 alone contributed 226 of those 346 indexed packages, against a reported real-world total of 170+ distinct packages. A single worm event now eclipses a quarter of manual campaigns in volume.

Ecosystem Breakdown

Where the malicious packages live

Ecosystem Indexed Packages Campaigns Share of IOCs
npm 521 37 79.3%
PyPI 59 19 9.0%
VS Code / OpenVSX (vsx) 41 7 6.2%
Golang 9 1 1.4%
RubyGems 7 1 1.1%
Cargo 6 1 0.9%
NuGet 5 1 0.8%
Packagist 4 1 0.6%
Docker 3 1 0.5%

npm is the dominant target by a wide margin: nearly 4 in 5 indexed malicious packages, present in 63 percent of all campaigns. PyPI is the steady second front, appearing in 19 campaigns with lower individual IOC volume because Python attacks tend toward lower-volume, higher-precision payloads: RATs, banking trojans, crypto-stealers rather than mass typosquat sprays.

The PyPI and NuGet malware declines in external vendor data (down 43% and 60% per ReversingLabs) are the most important nuance in the entire dataset. They confirm that registry-level security controls work, and that attackers respond to friction by relocating rather than persisting. npm’s slower adoption of equivalent controls explains why it now absorbs the majority of displaced volume.

VS Code extensions: zero to seven campaigns in 18 months

The VS Code Marketplace barely registered as an attack surface before late 2024. It now spans seven distinct campaigns:

Campaign Period Notable Detail
VSCode Crypto/Zoom Impersonation Extensions Oct–Dec 2024 First significant impersonation wave
GlassWorm Wave 1 — Invisible Unicode Oct 2025 First self-propagating extension worm; invisible-Unicode payloads; Solana blockchain C2
MaliciousCorgi — AI ChatGPT Spyware Jan 2026 1.5M-install spyware; full file contents exfiltrated to aihao123[.]cn
OX Security VSCode Extension CVEs Feb 2026 128M combined install exposure across four extensions
GlassWorm Wave 3 — 73 OpenVSX Clones + Zig Dropper Apr 2026 73 cloned extensions; compiled Zig dropper; cross-IDE infection
TeamPCP CI/CD Siege Mar 2026 Extension inside CI/CD attack chain; OpenVSX + npm + GitHub Actions simultaneous
TeamPCP Wave 4 — GitHub Internal Breach May 2026 GitHub confirmed ~3,800 internal repositories exfiltrated via poisoned VS Code extension on employee endpoint

The developer editor has become an attack surface carrying full developer privileges, persistent across projects, and extending into every AI coding tool fork. ReversingLabs confirmed the detection rate nearly quadrupled: 27 malicious extensions detected in 2024, rising to 105 in the first 10 months of 2025. The GitHub breach via a poisoned extension is the operational proof point that this surface now reaches the highest-value targets in the software supply chain.

AI agent tooling and MCP: the newest frontier

The leading edge of the corpus targets the tooling that sits around the developer rather than a traditional package registry:

Campaign Period Vector
SANDWORM_MODE Feb 2026 MCP (Model Context Protocol) server injection
TrapDoor May 2026 Zero-width Unicode poisoning of .cursorrules and CLAUDE.md
Miasma Wave 2 Jun 2026 AI IDE backdoor injection into Claude Code, Cursor AI, Google Gemini configs
GlassWorm (invisible Unicode) Oct 2025– OpenVSX extension → AI-agent context; technique that jumped from VSX to the skills vector
Mini Shai-Hulud (SAP CAP wave) Apr 2026 Claude Code SessionStart hook + VS Code tasks.json folderOpen persistence

TrapDoor introduced the most novel technique in the full corpus: injecting hidden instructions into AI coding assistant configuration files using zero-width Unicode characters, so the developer’s own assistant becomes the exfiltration mechanism — running what appears to be a "security scan" that actually harvests secrets. The campaign opened pull requests to browser-use/browser-use, langchain-ai/langchain, and langflow-ai/langflow to distribute the poisoned configs. Miasma Wave 2 extended the technique, dropping backdoor configs into project directories for Claude Code, Cursor AI, and Google Gemini simultaneously. The Mini Shai-Hulud SAP CAP persistence mechanism is the clearest example of what makes this surface distinct from a package install: the hooks survive package uninstall entirely, re-running credential harvest on every subsequent session.

Quantified scan data: AI-agent skills carry a markedly higher risk rate than IDE extensions. A focused deep-scan run on 2026-05-24 across 3,267 skills produced findings that are the clearest internal signal of the AI-shift thesis:

Surface Indexed Scanned Flagged unhealthy/risky Risk rate
VS Code / OpenVSX extensions ~34,300 11,909 820 6.9%
AI-agent skills ~43,900 42,480 6,606 15.6%

AI-agent skills carry a risk rate 2.3 times higher than IDE extensions. The deep-scan risk breakdown for the 3,267-skill focused run:

Risk Level Skills Share
Critical 854 26.1%
High 74 2.3%
Medium 74 2.3%
Low 46 1.4%
Safe 2,219 67.9%

More than 1 in 4 deep-scanned skills triggered a critical-risk finding. The most-triggered detection rules reveal a consistent pattern — shell command execution combined with network egress:

Detection Rule Hits What it catches
CS-009 3,603 Command/shell execution — skill invokes OS shell, subprocess, or eval
NS-002 2,075 Network egress — outbound connections to unconfigured external endpoints
RD-003 1,302 Remote data read — fetches remote instructions or payloads at runtime
NS-008 1,089 Suspicious network pattern — C2-consistent beacon or exfiltration pattern

High-star, widely-trusted skills appear in the critical set — a setup-deploy skill in a 97,000-star repository triggered critical findings. Popularity provides no safety signal.

The attack model across all five campaigns in this cluster: the AI coding assistant loads a project-level skill or MCP server containing hidden instructions. The assistant executes those instructions as part of normal operation, exfiltrating secrets without the developer ever running a suspicious binary. The AI is not compromised — it is used as designed, against the developer. External validation confirms this is a recognised attack class: Snyk’s ToxicSkills research documents malicious AI-agent skills, and Datadog’s open dataset now formally tracks “AI Skills” and “IDE extensions” as first-class malware ecosystems alongside npm and PyPI.

Threat Actor Breakdown

Actor / Cluster Campaigns in Corpus Model Signature
TeamPCP (UNC6780) 19 Automated, self-propagating CI/CD sieges; AI-tooling targeting; Checkmarx/Trivy/LiteLLM/Bitwarden cascade
Shai-Hulud lineage (incl. Mini variants) 14 Self-replicating worms Credential harvesting; OIDC token theft; GitHub dead-drop repos; Bun runtime evasion
DPRK (Lazarus, Contagious Interview, Sapphire Sleet, Tenacious Pungsan) 9 Social-engineering led Fake recruiting lures; OtterCookie / BeaverTail / HexEval RATs; expanding ecosystem reach
IronWorm 1 (Jun 2026) Compiled-binary worm Rust ELF binary; eBPF rootkit; Tor C2; OIDC self-propagation

Two distinct adversary archetypes define the period:

DPRK: human-in-the-loop, espionage and financial. The Contagious Interview playbook lures developers through fake job offers, then delivers OtterCookie and BeaverTail RATs through npm and PyPI packages. Lower package volume, higher targeting precision. Campaign 69 confirmed a first: DPRK supply chain activity expanding to Packagist/PHP, following the Laravel-Lang attack pattern. Credit OpenSourceMalware for first signal

TeamPCP plus Shai-Hulud lineage: machine-speed, self-propagating. These are worms. They steal a maintainer’s npm or GitHub token, republish trojanized versions, and use the stolen credentials to infect the next namespace automatically. This is what produces the May 2026 volume spike. The worm has been operational across at least six named waves, each introducing new delivery or evasion capability within 72 hours of the prior wave being detected and documented.

IronWorm (June 2026) is the engineering ceiling for this period. A move away from interpreted JavaScript postinstall scripts toward a compiled 976 KB Rust binary with a kernel-level eBPF rootkit, per-call-site string encryption, Tor C2, and OIDC-based self-propagation through 37 npm packages across 9 organizations. It signals that supply chain malware is professionalizing toward the capability level of nation-state implants. Credit Jfrog for the first signal.

Campaign Timeline: May–June 2026 (The Densest Six Weeks on Record)

Date Campaign Ecosystem Scale
May 17, 2026 actions-cool GitHub Action imposter commit GitHub Actions All version tags; AntV cascade trigger
May 18, 2026 Megalodon mass GitHub Actions backdoor GitHub 5,561 repos; 5,718 commits; 6 hours
May 18–19, 2026 AntV / Mini Shai-Hulud Wave npm ~16M weekly downloads
May 19–22, 2026 atool maintainer takeover (323 packages) npm 2,500+ attacker repos; 16M+ weekly DLs
May 20, 2026 art-template → Coruna iOS Safari exploit npm → iOS Safari 5M+ weekly downloads; watering-hole
May 22, 2026 Laravel-Lang Composer tag-redirect Packagist 233 versions; 700+ downstream repos; 15 min
May 22–26, 2026 TrapDoor cross-ecosystem npm + PyPI + Crates.io 34 packages; 384+ versions
May 29, 2026 Miasma Wave 1 (Red Hat @redhat-cloud-services) npm 32+ packages; GCP/Azure identity enumeration
Jun 2–3, 2026 Miasma Wave 2 Phantom Gyp npm 57 packages; 286 malicious versions; under 2 hours
Jun 2026 IronWorm (JFrog) npm 37 packages; 9 organizations; eBPF rootkit

Key Campaigns in Technical Detail

Shai-Hulud lineage: three waves, one propagation engine

The Shai-Hulud worm established the template for self-propagating npm supply chain compromise and every subsequent wave inherits from it.

Wave 1 (September 2025): Started with @ctrl/tinycolor at over 2 million weekly downloads.

ReversingLabs identified ngx-bootstrap@18.1.4 (approximately 300,000 weekly downloads) as the probable patient zero for the broader first wave, which compromised over 500 npm packages. The worm harvested npm tokens, GitHub tokens, and cookies, then automatically republished poisoned versions of every package a compromised maintainer could reach, capped at 100 packages per victim.

Node.js-based monolithic bundle.js payload via a postinstall lifecycle hook. The Qix compromise — which hit chalk@5.6.1 and debug@4.4.2 (combined approximately 2.6 billion weekly downloads) and the ansi cluster (ansi-styles, ansi-regex, strip-ansi, supports-color, wrap-ansi, color, color-convert, color-name) — occurred in this wave, representing the highest-reach single compromise event in the dataset.

Wave 2 (November 2025): Branded “Sha1-Hulud: The Second Coming.” Datadog tracked 1,092 unique backdoored package versions across at least 796 packages with a combined 130 million monthly downloads. Patient zero: @asyncapi/specs at 1.4 million weekly downloads, cascading through corporate namespaces including Zapier, Postman, PostHog, ENS Domains, Browserbase, and the AsyncAPI organization itself (36 distinct packages trojanized). The 2.0 wave switched from postinstall to preinstall and adopted the Bun runtime as a Node.js detection bypass.

Wiz tracked over 25,000 attacker-created exfiltration repositories across roughly 350 GitHub users at a peak rate of 1,000 new repositories every 30 minutes.

Mini Shai-Hulud (April–May 2026): Three distinct named sub-waves, all inheriting the worm branding and expanding the technical surface:

The worm’s design principle across all waves: each compromised maintainer’s token publishes poisoned versions of every other package that maintainer owns, creating a cascade from a single stolen credential.

TeamPCP (UNC6780): 19 campaigns, multi-ecosystem coordination

TeamPCP is the most active single actor in the corpus and the clearest example of supply chain compromise operating as a coordinated production pipeline across ecosystems simultaneously.

The five-day CI/CD siege in March 2026 (TEAMPCP_TRIVY_KICS_WAVE1) started from a single incompletely-rotated GitHub PAT from a prior breach and force-pushed 110+ version tags across Aqua Security’s trivy-action (75 of 76 version tags poisoned), setup-trivy, Checkmarx’s kics-github-action (35 tags), and ast-github-action — simultaneously poisoning two OpenVSX extensions, multiple container registries, and 66+ npm packages. The payload swept 50+ credential paths and exfiltrated via vendor-specific typosquat domains. CanisterWorm used an Internet Computer Protocol (ICP) blockchain canister as a C2 dead-drop — the first npm malware to do so — making conventional domain takedown impossible.

The Bitwarden CLI compromise (April 22, 2026) demonstrated the same pattern applied to a password manager: @bitwarden/cli@2026.4.0 poisoned for a 93-minute window via an injected GitHub Actions step in Bitwarden’s own CI pipeline. The payload (bw1.js) shares core infrastructure with the mcpAddon.js from the KICS wave. TeamPCP publicly claimed responsibility.

The MEGALODON_CI campaign on May 18 deployed 5,718 malicious GitHub Actions workflow commits across 5,561 repositories in six hours, using throwaway CI-bot accounts with forged identities and a September 2001 backdated timestamp. A dormant workflow_dispatch backdoor activates on any future pipeline run triggered via the GitHub API — creating a persistent sleeper army. CISA issued an advisory naming Megalodon alongside the Nx Console VS Code extension and Trivy.

The GitHub internal breach (May 20, 2026) is the campaign with the highest-value confirmed impact in the corpus: roughly 3,800 GitHub-internal repositories exfiltrated after a poisoned VS Code extension reached an employee endpoint, with StepSecurity confirming Sigstore attestation forgery used to make the extension appear legitimately signed. Persistence via .vscode/tasks.json folderOpen tasks and ~/.claude/settings.json SessionStart hooks — both survive extension removal.

TeamPCP’s defining operational characteristic is the TTP pivot speed. The group adopted the VS Code folderOpen auto-run primitive from Lazarus Group’s Contagious Interview campaign and integrated it into crimeware within approximately eight weeks of public documentation. The Miasma Wave 2 delivery pivot — from postinstall to binding.gyp shell expansion — occurred within 72 hours of the prior detection being publicized.

IronWorm: the capability ceiling

IronWorm represents a generational step in supply chain malware engineering. Distributed through 37 packages republished under the compromised asteroiddao npm account across 9 organizations, each package carries a 976 KB Rust ELF binary fired from a preinstall hook.

The binary uses a custom-modified UPX stub to defeat signature-based unpackers and encrypts every internal string with a unique per-call-site key. An embedded eBPF kernel-level rootkit hides the worm’s own processes, sockets, and anti-debugging tripwires. The implant sweeps 86 environment variables and over 20 credential file paths covering AWS, GCP, Azure, Vault, Kubernetes, npm, Docker, GitHub, and the full current generation of AI provider keys (Anthropic, OpenAI, Gemini, Cohere, Mistral, Groq, Perplexity, xAI). A dedicated Exodus desktop wallet hook weakens Electron sandboxing to capture the seed mnemonic at unlock. C2 runs over Tor. Propagation uses npm Trusted Publishing OIDC token exchange: on any CI runner with active federation, the worm exchanges the runner’s identity token for a short-lived, scoped publish token and republishes itself under every namespace the runner can reach — no stored npm token required.

The operator hardcoded their own BIP-39 recovery phrase in the wallet-stealer skip list, an operational security failure that reads as a rehearsal artifact rather than a finished operation.

TrapDoor: the AI-tool attack surface

TrapDoor is the first confirmed supply chain campaign to simultaneously weaponize npm, PyPI, and Crates.io with execution paths tailored to each runtime: postinstall hooks (npm), import-time remote JS fetch (PyPI), malicious build.rs scripts (Rust/Crates.io). 34 packages, 384+ versions, detected by Socket in under six minutes.

The novel component is the AI coding assistant poisoning. Packages inject .cursorrules and CLAUDE.md files containing zero-width Unicode hidden instructions. When a developer opens the project in Cursor or Claude Code, the assistant reads these configuration files and, following what appear to be legitimate project-level instructions, runs a “security scan” that exfiltrates local secrets. TrapDoor opened pull requests to browser-use/browser-use, langchain-ai/langchain, and langflow-ai/langflow to distribute the poisoned configs upstream. Miasma Wave 2 extended this pattern in June 2026, dropping backdoor configs for Claude Code, Cursor AI, and Google Gemini into project directories alongside the binding.gyp payload.

Miasma Wave 2: Phantom Gyp bypasses every postinstall mitigation

Miasma Wave 2 (June 2–3, 2026) introduced “Phantom Gyp” — a 157-byte binding.gyp file that triggers code execution via node-gyp rebuild shell command expansion. The significance: binding.gyp processing is not a lifecycle script. It bypasses –ignore-scripts, bypasses npm ci –ignore-scripts, and bypasses every conventional lifecycle-script monitor. The payload then downloads the Bun runtime rather than Node.js, bypassing endpoint tools that monitor Node.js process creation specifically.

The campaign deployed 57 packages and 286 malicious versions in under two hours. The binding.gyp file is 157 bytes and identical across all compromised versions (SHA-256: ef641e956f91d501b748085996303c96a64d67f63bfeef0dda175e5aa19cca90), giving defenders a stable hash-based detection signal even though there is no CVE. The –ignore-scripts mitigation, which became the primary recommended response to Shai-Hulud 1.0 in September 2025, was structurally rendered incomplete by June 2026.

What Attackers Impersonate: Typosquat Target Frequency

Frequency of brand or library tokens appearing in malicious package names across the 59-campaign corpus:

Target Brand Occurrences in Malicious Names
TanStack 108
UiPath 67
SolidJS 26
React 25
Mistral AI 19
ESLint 17
Vue 14
Tailwind 12
durabletask 7
Next.js 6
CrowdStrike / Prettier / LiteLLM / ethers / web3 / Telnyx 6 each

TanStack (108 occurrences) and UiPath (67) dominate, displacing the generic utility typosquatting that characterized earlier years. AI-adjacent tooling — Mistral AI, LiteLLM, durabletask — clusters in the top tier. This tells you what developers are reaching for in 2026: modern front-end framework namespaces and the AI/automation tooling around them.

New Techniques Introduced in 2025–2026

Technique Campaign What it Bypasses
Python-to-JavaScript execution bridge Mini Shai-Hulud / PyTorch Lightning PyPI signature verification (Python-only scope)
Phantom Gyp (binding.gyp shell substitution) Miasma Wave 2 All –ignore-scripts + all lifecycle-script monitors
AI tool config poisoning (.cursorrules / CLAUDE.md) TrapDoor, Miasma Wave 2 Developer review; AI assistant becomes the attacker
Bun runtime download Mini Shai-Hulud, Miasma Node.js process monitoring (EDR monitors node, not bun)
ICP canister C2 CanisterWorm, Namastex CanisterWorm Conventional domain takedown
GitHub fork tag-redirect actions-cool, Laravel-Lang Official repo appears clean in any code view
DNS TXT record C2 Go shopspring/decimal typosquat Domain-takedown-resistant command delivery
Registry-as-exfiltration-channel GemStuffer (RubyGems) Registry-level data loss prevention (novel threat model)
Unique per-infection encrypted payload Miasma Wave 1 Version-hash-based fingerprinting
EDR enumeration before execution Miasma Wave 1 Checks CrowdStrike, SentinelOne, Carbon Black, StepSecurity Harden-Runner
SLSA Level 3 / Sigstore provenance forgery TeamPCP Wave 3, Miasma Waves Sigstore-based artifact verification
Constructor-time NuGet execution Sicoob.Sdk Pre-safety-check execution in .NET SDK pattern
Install / postinstall lifecycle hooks (install-time execution) Shai-Hulud v1, SAP CAP, multiple Dependency scanning — hook fires before any build or scan step

Two additional corpus characteristics worth stating plainly: 73 percent of indexed packages carry a pinned malicious version — exact package name plus exact version string — making them blockable as precise IOCs without behavioral detection. 9 of 59 campaigns are cross-ecosystem: TrapDoor hit npm, PyPI, and Crates.io simultaneously; the Shai-Hulud lineage extended into PyPI; Contagious Interview now has confirmed Packagist activity. Attackers no longer specialise in one registry.

The AI Acceleration Layer

The package volume curve and the attacker capability curve are connected. Anthropic’s analysis of 832 accounts banned for violating cyber-related usage policy between March 2025 and March 2026 quantifies the AI contribution. Those accounts used AI models across all 14 MITRE ATT&CK tactics and 482 unique sub-techniques. The share of actors scoring medium risk or higher on the ARiES (AI Risk Enablement Score) framework rose from 33 percent to 56 percent in under a year — a 1.7-fold increase — with growth concentrated in the operational, hands-on-keyboard stages rather than the commodity toolbuilding that dominates the overall count.

Malware development (T1587.001) was used by 560 of 832 accounts — 67.3 percent. That is the commodity layer feeding the registry volume numbers. But the more consequential shift is post-compromise: account discovery (T1087) rose 8.9 percent and automated exfiltration (T1020) rose 6.2 percent across the study year, while phishing fell 8.6 percent and capability development fell 12 percent. Lateral movement was the single strongest predictor of a high-risk actor — the 54 accounts using it averaged a risk score of 56.4 against a population mean of 46.8.

The traditional signals for assessing threat actor risk have stopped working. Technique breadth correlates with risk only weakly (r = 0.27). Interface choice — chat, API, or agentic coding tool — has no bearing on risk, with 80 percent of banned actors using Claude Code, making agentic tooling the statistical default rather than a distinguishing factor. What distinguishes the dangerous actors is scaffolding: the surrounding code and architecture that chains techniques into a continuous, autonomous operation.

The GTG-1002 espionage campaign disrupted in November 2025 scored the maximum 100 on the ARiES framework while using 30 techniques across 13 tactics — a profile comparable to dozens of medium-risk actors in the dataset. The difference was autonomous execution: Claude Code running on a Kali machine with MCP tool integrations scanned internet-facing services, discovered internal portals, exploited an SSRF vulnerability, harvested SSH keys from cloud metadata services, and moved laterally through the victim’s cloud environment, with human input only at the final data extraction step. None of that operational behavior maps to existing ATT&CK IDs. The framework does not yet have taxonomy for autonomous killchain orchestration, real-time pivot decisions, or AI-directed execution.

That MITRE gap matters for defenders of the supply chain specifically. A self-propagating worm that exchanges OIDC tokens, sweeps 130 credential paths, forges backdated commits, drops AI agent configuration hooks, and republishes itself across namespaces is exactly the class of autonomous multi-step operation that has no ID in the framework your threat intelligence team relies on.

Exposure Analysis

Environment Risk Level Reason
CI/CD pipelines Critical OIDC federation enables tokenless self-propagation; Runner.Worker memory holds plaintext secrets that bypass log masking; 5,561 repos already backdoored by Megalodon
Developer workstations Critical Install-time, folderOpen, and AI agent SessionStart execution; persistence survives extension and package uninstall
npm publishing accounts High Single compromised maintainer token cascades to up to 100 downstream packages per worm cycle; 25 packages appear in multiple campaigns
Cloud workloads High AWS/GCP/Azure/Kubernetes credentials harvested across 86+ env vars; GCP/Azure identity enumeration (not just static secret extraction) confirmed in Miasma Wave 1
Packagist / Composer environments High GitHub fork tag-redirect leaves official repo appearing clean; 233 versions across 4 packages compromised in 15 minutes (Laravel-Lang)
IDE / AI agent surface High .cursorrules, CLAUDE.md, VS Code tasks.json, Claude Code settings.json are now confirmed persistence and execution mechanisms

Detection Guidance

Log and Host Indicators

Scanner References

Verification Steps for Teams

  1. Search every lockfile (package-lock.json, yarn.lock, pnpm-lock.yaml, poetry.lock, composer.lock) against the current Phoenix MPI IOC set — 657 indexed package-versions with exact version pinning in 73 percent of cases.
  2. Run behavioral dependency scanning, not CVE-only scanning, across all repositories. CVE scanners had zero detection surface for all 59 documented campaigns.
  3. Audit .github/workflows/ across the entire organization for injected base64 decode steps and any workflow_dispatch backdoor triggers added in May 2026.
  4. Check all installed VS Code and OpenVSX extensions, including their bundled node_modules dependencies, for tampered packages — the 19-extension Rust trojan wave hid its payload inside path-is-absolute in the extension bundle.
  5. Inspect AI agent config files (CLAUDE.md, .cursorrules, settings.json) for zero-width Unicode characters and entries you did not author.
  6. Pin all GitHub Actions to full commit SHAs rather than version tags. Both the actions-cool and Megalodon campaigns exploited tag-based reference.
  7. Review SBOMs for transitive dependency exposure — worm payloads frequently land through declared transitive dependencies, not the direct package the developer chose.

Enriched Malware Families and the Compromised/Malicious Split

Within the human-enriched layer of the corpus — records carrying Phoenix campaign research attribution — the top malware family by record count is “Multi-stage AI toolchain poisoning.” That is the clearest internal signal of the AI-shift thesis across the entire dataset.

Malware Family Enriched Records
Multi-stage AI toolchain poisoning 9
Browser-executed credential theft 7
Crypto-wallet hijackers (browser-side + native) 6
Scavenger (node-gyp.dll) 5
Cross-platform RAT 4
DanaBot variant / JarkaStealer (Java) 4
Linux backdoor (activates on install) 3
TruffleHog secret scanner + credential harvesting 2

Across the full 465,312-record corpus the offender split is near-even: approximately 238,543 records (51%) are compromised legitimate packages where a maintainer account or pipeline was taken over, versus 226,701 records (49%) of attacker-authored packages published directly. The practical implication for defenders: scanning only for new or unknown packages is not sufficient. More than half the threat surface consists of legitimate, established packages that are now under different control. Exact-version lockfile auditing against known IOCs is the minimum; behavioral detection is required to catch takeovers before they appear in advisory feeds.

Remediation Guidance

Immediate Actions

  1. Rotate every credential reachable from any host that ran an affected install or CI job: npm tokens, GitHub PATs, cloud provider keys, Kubernetes configs, SSH keys, and AI provider API keys. IronWorm specifically targets Anthropic, OpenAI, Gemini, Cohere, Mistral, Groq, Perplexity, and xAI credentials.
  2. For Miasma Wave 1: remove the gh-token-monitor daemon before revoking GitHub tokens — the malware detects token revocation and can trigger destructive behavior in response.
  3. Revoke or re-scope npm OIDC trust federation on any affected namespace. OIDC federation requires no stored token and is the propagation mechanism for Mini Shai-Hulud, IronWorm, and the Bitwarden CLI compromise.
  4. Remove all injected lifecycle hooks: .vscode/tasks.json auto-run entries, ~/.claude/settings.json SessionStart hooks, injected .github/workflows/ files. Uninstalling a malicious extension or package does not remove these.
  5. Pin dependencies to known-good exact versions and re-resolve lockfiles from a clean state.

Temporary Mitigations

Phoenix Security Recommendations

The throughline across all 59 documented campaigns is unchanged: zero CVEs during active exploitation, meaning CVE-based detection had no surface to work with across the entire dataset. Phoenix Security addresses the structural gap.

Behavioral scanning through PHX-Neural evaluates packages on install-time and runtime behavior rather than CVE presence, catching malicious packages before they appear in any advisory feed — as demonstrated by the nicegui detection at 100/100 with zero CVEs.

Contextual deduplication correlates findings across SCA, SBOM, and behavioral scanners into a single prioritized backlog. When a worm cascades through 300 namespaces, that does not produce 300 disconnected tickets.

Reachability analysis identifies which compromised components are actually loaded and executed in runtime environments, separating a package in a lockfile from one running on a credential-bearing CI runner. That distinction is operationally significant: a package in a transitive dependency graph that never executes on a production runner has a different remediation priority than one that fires on every CI build.

Remediation campaigns assign owners by affected service, track fixes, and verify runtime closure — turning an active worm into a bounded, auditable response rather than an unstructured incident. Attack surface management identifies internet-exposed services running affected components so the externally reachable instances get triaged first.

Phoenix correlates compromised packages with the runtime workloads executing them, assigns remediation ownership automatically, and verifies that the exposure has closed — shrinking a 59-campaign, multi-ecosystem threat into an owned remediation backlog.