TeamPCP Supply-Chain Attack Compromises npm and PyPI Packages

· Original article ↗

Summary

TeamPCP compromised npm and PyPI packages using a credential-stealing worm. The report details a GitHub Actions cache-poisoning attack, exfiltration methods, destructive persistence, affected packages, and recommended response steps.

Key points

  • The campaign compromised packages across npm and PyPI, including packages in the TanStack, UiPath and Mistral namespaces, plus guardrails-ai.
  • The TanStack attack poisoned a GitHub Actions cache through a pull_request_target workflow, then abused runner OIDC tokens to publish malicious package versions.
  • The payload steals CI/CD, cloud, Kubernetes, Vault and package-registry credentials, and can use stolen tokens to publish poisoned packages to spread further.
  • Credentials were exfiltrated through git-tanstack[.]com, the Session messenger network, and GitHub API dead drops.
  • On some developer systems, a persistent daemon monitors GitHub token revocation and may attempt to delete the home directory; the article reports that an updated payload fixed a related deletion bug.
  • Wiz attributes the activity with high confidence to TeamPCP. The npm team was removing malicious versions from the registry.
  • Security teams should check package lockfiles and CI logs, remove the gh-token-monitor persistence before revoking GitHub tokens, rotate exposed credentials, and block reported C2 infrastructure.

Article Details

Attack Vectors
  • A fork of TanStack/router was submitted through a pull_request_target workflow that checked out and executed attacker code, poisoning the GitHub Actions cache; later release workflows restored the cache, enabling OIDC token theft and malicious package publication.
  • Compromised npm packages used an optional dependency pointing to an orphan commit that ran a payload through a prepare script, and also embedded router_init.js in package tarballs.
  • Compromised @uipath packages used a preinstall script to download the Bun runtime and execute a payload.
  • Malicious PyPI packages downloaded and executed a credential-stealing payload from git-tanstack.com/tmp/transformers.pyz.
  • The payload stole CI/CD, cloud, Kubernetes, Vault, and package-registry credentials, then used stolen npm and GitHub Actions OIDC tokens to publish poisoned packages to repositories accessible to victims.
  • Stolen credentials were exfiltrated through a typosquat domain, the Session messenger network, and GitHub API dead drops.
  • On developer machines, a persistent daemon monitored GitHub tokens and attempted to wipe the user's home directory after token revocation.
Defensive Notes
  • Search lockfiles and CI logs for affected package versions, and inspect package roots for router_init.js or setup.mjs.
  • Find and remove the gh-token-monitor daemon before revoking GitHub tokens to avoid triggering its destructive handler.
  • If exposure is suspected, rotate GitHub and npm tokens, AWS and Vault credentials, Kubernetes service-account credentials, and CI/CD secrets.
  • Inspect .claude/ and .vscode/ directories for router_runtime.js or setup.mjs.
  • Block git-tanstack.com and *.getsession.org at DNS or proxy level.

Indicators of compromise

TypeIndicatorContext
DOMAINfilev2[.]getsession[.]orgSession file server identified as part of the malware's exfiltration channel.
DOMAINgit-tanstack[.]comTyposquat C2 and credential-exfiltration domain used by the payload.
DOMAINseed1[.]getsession[.]orgSession network seed node used as part of the malware's exfiltration channel.
DOMAINseed2[.]getsession[.]orgSession network seed node used as part of the malware's exfiltration channel.
DOMAINseed3[.]getsession[.]orgSession network seed node used as part of the malware's exfiltration channel.
IPV483[.]142[.]209[.]194Payload server receiving credentials stolen by the Python variant.
SHA112f35b1081b17d21815b35feb57ab03d02482116Hash of the malicious setup.mjs package artifact.
SHA1820fa07a7328b6cf2b417078e103721d4d8f2e79Hash of the malicious opensearch_init.js artifact.
SHA1e7d582b98ca80690883175470e96f703ef6dc497Hash listed for a malicious package artifact.
SHA2561e8538c6e0563d50da0f2e097e979ebd5294ce1defe01d0b9fe361ba3bed1898Hash of a trojanized package tarball.
SHA2562258284d65f63829bd67eaba01ef6f1ada2f593f9bbe41678b2df360bd90d3dfHash of the malicious setup.mjs package artifact.
SHA2562ec78d556d696e208927cc503d48e4b5eb56b31abc2870c2ed2e98d6be27fc96Hash of the malicious router_init.js package artifact.
SHA256ab4fcadaec49c03278063dd269ea5eef82d24f2124a8e15d7b90f2fa8601266cHash of the malicious router_init.js package artifact.
URLhxxps[:]//git-tanstack[.]comTyposquat domain identified as a credential-exfiltration channel.

MITRE ATT&CK

Threat Actors

Malware

Products

1PasswordCPUs. It gathers a variety of information, of note for the first time this includes password vaults (1Password, Bitwarden) and exfiltrates it to 83.142.209[.]194, with GitHub as a fallback, in which case PUSH URAWSself-propagating worm. It targets CI/CD tokens (GitHub Actions OIDC, GitLab, CircleCI), cloud credentials (AWS IMDSv2, GCP, Azure), Kubernetes service accounts, HashiCorp Vault, and package registry tokens. It usesAzureIt targets CI/CD tokens (GitHub Actions OIDC, GitLab, CircleCI), cloud credentials (AWS IMDSv2, GCP, Azure), Kubernetes service accounts, HashiCorp Vault, and package registry tokens. It uses stolen npm tokens andBitwardengathers a variety of information, of note for the first time this includes password vaults (1Password, Bitwarden) and exfiltrates it to 83.142.209[.]194, with GitHub as a fallback, in which case PUSH UR T3MPRR is usedBunnamespace were compromised. These packages use a preinstall script (node setup.mjs) that downloads the Bun runtime and executes the payload. This is the same delivery mechanism that was seen in the earlier SAPGCPworm. It targets CI/CD tokens (GitHub Actions OIDC, GitLab, CircleCI), cloud credentials (AWS IMDSv2, GCP, Azure), Kubernetes service accounts, HashiCorp Vault, and package registry tokens. It uses stolen npmGitHub ActionsThe TanStack compromise exploited a chain of three vulnerabilities in GitHub Actions. The attacker created a fork of the TanStack/router repository (renamed to zblgg/configuration to evade fork-list searches), thenHashiCorp VaultOIDC, GitLab, CircleCI), cloud credentials (AWS IMDSv2, GCP, Azure), Kubernetes service accounts, HashiCorp Vault, and package registry tokens. It uses stolen npm tokens and GitHub Actions OIDC tokens to publishKubernetesCI/CD tokens (GitHub Actions OIDC, GitLab, CircleCI), cloud credentials (AWS IMDSv2, GCP, Azure), Kubernetes service accounts, HashiCorp Vault, and package registry tokens. It uses stolen npm tokens and GitHubnpmOn 11 May 2026, TeamPCP launched a coordinated supply chain attack against the npm and PyPi ecosystems, compromising packages across multiple namespaces simultaneously.PyPIOn 11 May 2026, TeamPCP launched a coordinated supply chain attack against the npm and PyPi ecosystems, compromising packages across multiple namespaces simultaneously.SessionThe payload exfiltrates stolen credentials via three redundant channels: a typosquat domain (git-tanstack[.]com), the decentralized Session messenger network, and GitHub API dead drops using stolen tokens.

Countries

Related Articles