Between 2026-05-18 and 2026-05-24, the threat actor tracked as TeamPCP executed the most damaging week of their Shai-Hulud supply chain campaign to date. Three simultaneous attack vectors — a trojanized VS Code extension with a verified-publisher badge, a poisoned Microsoft Azure Python SDK on PyPI carrying a Linux disk wiper, and a 639-package npm flood across the @antv ecosystem — resulted in confirmed intrusions at GitHub, OpenAI, Grafana Labs, and Mistral AI.
GitHub CISO Alexis Wales publicly confirmed on 2026-05-21 that approximately 3,800 internal repositories were exfiltrated. The root cause traced back to a developer endpoint that auto-updated the malicious Nx Console extension during an 18-minute window on May 18. OIDC credentials harvested in TeamPCP's earlier TanStack wave (May 11, tracked as CVE-2026-45321 per SANS ISC) were used to publish the trojanized extension through the legitimate nrwl.angular-console verified-publisher account.
As of May 25, the Shai-Hulud framework source code had been published to GitHub and copycat forks were already active, materially complicating attribution going forward. Defenders should rotate credentials immediately if any of the affected packages touched their environments.
◈ Table of Contents
Phase 01 — Threat Actor Profile
TEAMPCP| Attribute | Detail |
|---|---|
| Actor Name | TeamPCP (self-designated) |
| Campaign Name | Shai-Hulud / Mini Shai-Hulud |
| First Observed | Late 2025 (npm ecosystem) |
| Motivation | Credential theft, cloud infrastructure access, potential destructive capability (disk wiper) |
| Target Ecosystems | npm, PyPI, VS Code Marketplace |
| Known Aliases | UNC6780 (Mandiant, unconfirmed) |
| Monetization Arms | Vect ransomware affiliate, CipherForce (both currently inactive) |
| Tracking CVE | CVE-2026-45321 (OIDC credential abuse, TanStack wave) |
Phase 02 — The Nx Console VS Code Extension Attack
2026-05-18Attack Sequence
- 1Credential theft (May 11): TeamPCP harvested OIDC credentials from the TanStack supply chain wave via CVE-2026-45321. These credentials included publish rights to the nrwl.angular-console Marketplace account.
- 2Malicious publish (May 18, ~18 minutes): v18.95.0 published to VS Code Marketplace using stolen credentials. Extension carried verified-publisher badge — a legitimate trust signal attached to a poisoned build.
- 3Auto-update compromise: At least one GitHub employee's endpoint auto-updated during the window. The extension executed on load, exfiltrated developer secrets from the local environment, and used those to move laterally through GitHub's internal CI/CD.
- 4GitHub breach confirmed (May 21): GitHub CISO Alexis Wales publicly named Nx Console v18.95.0 as the root cause. Approximately 3,800 GitHub-internal repositories were exfiltrated. Downstream victims with developers who had auto-update enabled: OpenAI, Grafana Labs, Mistral AI.
The VS Code Marketplace verified-publisher badge did NOT protect against this attack. The badge confirms that the publisher account is legitimate — not that any specific version published is legitimate. Do not use the badge as an install-time safety signal.
Phase 03 — Microsoft Azure Python SDK Poisoned on PyPI
2026-05-19| Attribute | Detail |
|---|---|
| Package Name | durabletask (official Microsoft Azure Durable Functions SDK) |
| Malicious Versions | 1.4.1, 1.4.2, 1.4.3 |
| Monthly Downloads | ~417,000 |
| Trigger | Package import (no explicit execution required) |
| Second-Stage Payload | Credential stealer + Linux disk wiper |
| Credential Targets | AWS, Azure, GCP, HashiCorp Vault, 1Password, Bitwarden |
| Propagation | AWS SSM (inside EC2), kubectl exec (inside Kubernetes) |
| Window | Published 2026-05-19, yanked within ~35 minutes |
Any environment that installed durabletask versions 1.4.1, 1.4.2, or 1.4.3 on 2026-05-19 should be treated as fully compromised — including ephemeral CI runners. The import alone is the trigger. Rotate all credentials from affected hosts immediately.
The disk wiper marks the first confirmed destructive capability in this campaign. Prior waves focused on credential theft and propagation. Incident responders should verify data integrity on any host that executed these versions before proceeding with credential rotation alone.
Phase 04 — The @antv npm Wave: 639 Malicious Versions
2026-05-19npm install and harvests over 20 credential classes.NAMED HIGH-VOLUME PACKAGES IN THE @ANTV WAVE — SOURCE: STEPSECURITY / SNYK / SOCKET (2026-05-19)
A previously unreported primitive appeared in this wave: 42 of the 639 malicious packages displayed forged Sigstore verification badges in the npm UI. Combined with the prior wave that shipped valid SLSA Build Level 3 provenance from hijacked release pipelines, provenance is now being attacked from two directions simultaneously — real attestations from compromised pipelines, and fake attestations in the registry UI. Visual trust indicators are no longer reliable.
Credentials Harvested by the Payload
- GitHub tokens and npm granular access tokens (with write permissions and 2FA bypass for ~61,274 tokens invalidated by GitHub cleanup)
- AWS access keys, GCP service account tokens, Azure credentials
- HashiCorp Vault secrets, Stripe API keys
- SSH private keys, Kubernetes service account tokens
- Local password vaults from 1Password and Bitwarden
Phase 05 — TTPs & Kill Chain
Attack FlowTEAMPCP ATTACK FLOW — WEEK OF 2026-05-18
Forged Sigstore Badges
42 of the 323 malicious @antv packages displayed fake Sigstore verification badges in the npm UI — the first observed instance of forged registry trust indicators in this campaign.
Verified-Publisher Account Hijack
The Nx Console extension carried Visual Studio Marketplace's verified-publisher badge because the underlying publisher account was legitimate. A stolen credential-to-publish is indistinguishable from a legitimate publish from the registry's perspective.
Linux Disk Wiper
The durabletask second-stage payload reportedly carries a disk wiper — the campaign's first confirmed destructive capability, extending beyond credential theft and cloud lateral movement.
AI Agent Persistence
Persistence via ~/.claude/settings.json and .vscode/tasks.json specifically targets AI coding agent environments — a persistence vector designed for modern developer workflows.
Open-Sourced Framework
On 2026-05-22, the Shai-Hulud framework source was published to GitHub. Copycat forks appeared within hours. Detection signatures built on framework artifacts will now fire on unrelated operators.
Multi-Stage Chain
First publicly confirmed multi-stage operation: TanStack OIDC credentials (May 11) reused to publish Nx Console trojan (May 18) that breached GitHub. Loot from one wave funds the next.
Phase 06 — Indicators of Compromise
IOC Table| Registry | Package / Publisher | Malicious Version(s) | Date |
|---|---|---|---|
| VS Code Marketplace | Nx Console (nrwl.angular-console) | 18.95.0 | 2026-05-18 (~18 min window) |
| PyPI | durabletask (Microsoft official) | 1.4.1, 1.4.2, 1.4.3 | 2026-05-19 (~35 min window) |
| npm | @antv/echarts-for-react | Multiple (wave of 639) | 2026-05-19 |
| npm | @antv/size-sensor | Multiple | 2026-05-19 |
| npm | @antv/timeago.js | Multiple | 2026-05-19 |
| npm | @antv/* (323 packages total) | 639 versions across ecosystem | 2026-05-19 |
| IOC Type | Indicator | Purpose |
|---|---|---|
| File Path | ~/.claude/settings.json | Persistence in AI coding agent environments |
| File Path | .vscode/tasks.json | VS Code task-based persistence |
| C2 Domain | filev2[.]getsession[.]org | Session Messenger exfiltration channel |
| C2 Domain | seed1[.]getsession[.]org | Session Messenger exfiltration channel |
| String Artifact | PBKDF2 salt strings (campaign fingerprint) | Present in all Shai-Hulud wave payloads |
| String Artifact | "niagA oG eW ereH :duluH-iahS" (reversed) | Framework identifier in GitHub repo naming |
| String Artifact | "Love - TeamPCP" in README | Framework source repository identifier |
Phase 07 — Detection & Hunt Queries
Detection LogicLinux / macOS — Hunt for Shai-Hulud persistence writes
KQL — Sentinel / Defender — Detect malicious package execution side effects
npm Audit — Identify affected @antv packages in lockfile
Do not rely on Sigstore verification badges or SLSA provenance attestations as install-time safety signals. This campaign demonstrated both can be forged or produced by hijacked legitimate pipelines. Pin exact versions and verify lockfile hashes against a known-good baseline from before 2026-05-18.
Phase 08 — Immediate Defense Actions
Remediation- 1Nx Console v18.95.0: Inventory all developer endpoints with VS Code auto-update enabled. Any endpoint running VS Code during the ~18-minute window on 2026-05-18 should be treated as exposed. Rotate all credentials stored on or accessible from those endpoints.
- 2durabletask PyPI versions 1.4.1 – 1.4.3: Treat any environment that imported these versions on 2026-05-19 as fully compromised — including ephemeral CI runners. Check for disk-wipe indicators before proceeding with credential rotation alone.
- 3@antv npm packages: Inventory all @antv/* installations. Rotate all credentials from affected hosts: GitHub PATs, npm tokens, AWS/GCP/Azure credentials, HashiCorp Vault secrets, 1Password and Bitwarden vaults.
- 4Audit persistence paths: Check all developer endpoints for
~/.claude/settings.jsonand.vscode/tasks.jsonmodifications from the 2026-05-18 to 2026-05-24 window. - 5Kubernetes / AWS SSM: Audit recent
kubectl execand AWS SSM session history for anomalous activity from compute that ran any of the affected packages. - 6Token hygiene: GitHub invalidated ~61,274 npm granular access tokens with write permissions and 2FA bypass. Verify your tokens are not among the invalidated set; reissue if uncertain.
- 7Copycat awareness: The open-sourced framework means detection signatures built on TeamPCP-specific artifacts (PBKDF2 salts, dead-drop strings) will now also fire on copycat operators. Supplement with behavioral indicators (Session exfil, .claude/.vscode persistence) that are more durable.
Phase 09 — MITRE ATT&CK Mapping
ATT&CK Framework| Tactic | Technique ID | Technique | Evidence |
|---|---|---|---|
| Initial Access | T1195.002 | Supply Chain Compromise: Software Supply Chain | npm, PyPI, VS Code Marketplace trojanization |
| Execution | T1059.007 | Command and Scripting Interpreter: JavaScript | npm install trigger, obfuscated JS payload (~499KB) |
| Execution | T1059.006 | Command and Scripting Interpreter: Python | durabletask import-time execution |
| Persistence | T1554 | Compromise Host Software Binary | Injected dropper into package source files |
| Persistence | T1053.003 | Scheduled Task/Job: Cron / Task | Persistence via .vscode/tasks.json |
| Credential Access | T1528 | Steal Application Access Token | GitHub/npm/AWS/GCP/Azure/Vault/Stripe tokens |
| Credential Access | T1552.001 | Unsecured Credentials: Credentials in Files | 1Password / Bitwarden local vault extraction |
| Lateral Movement | T1021.001 | Remote Services: SSH | SSH key theft enabling cloud lateral movement |
| Collection | T1119 | Automated Collection | 20+ credential class harvesting at npm install time |
| Exfiltration | T1041 | Exfiltration Over C2 Channel | Session Messenger C2 (filev2[.]getsession[.]org) |
| Impact | T1485 | Data Destruction | Linux disk wiper in durabletask second stage |
| Impact | T1496 | Resource Hijacking | Cloud infrastructure access for further propagation |
Phase 10 — Sources & References
Attribution🔍 Check Your Environment for Shai-Hulud IOCs
Use the CyberHawk IOC Scanner to check domains (getsession[.]org infrastructure), file hashes, and package indicators from this campaign against your environment telemetry. The scanner supports bulk lookups and integrates with common SIEM formats.
◈ Stay Connected
Follow CyberHawk Threat Intel for threat intelligence, deployment guides and hands-on SOC tooling content.
"They can't exploit you if you are the Exploit."