500 Poisoned Packages, Hundreds of Companies: TeamPCP’s Worm Just Reached GitHub

A credential-theft loop running since March has now exfiltrated 3,800 of GitHub’s internal repositories — and long-lived tokens are still the fuel

Github
Github.com

A GitHub employee installed a routine VS Code extension update on the morning of May 18, 2026. That single action handed cybercrime group TeamPCP enough access to exfiltrate approximately 3,800 of GitHub's internal source code repositories — everything from platform infrastructure to proprietary tooling built by the company that hosts more than 420 million repositories for over 180 million developers worldwide. GitHub confirmed the intrusion on May 20 and said it detected the compromise the previous day.

GitHub CISO Alexis Wales named the specific extension on May 21: Nx Console v18.95.0, a widely used tool for managing Angular and React projects carrying a verified publisher badge and 2.2 million installs. The poisoned build was live on Microsoft's Visual Studio Marketplace for only 18 minutes before the community caught it — but 18 minutes was enough. GitHub contained the compromised endpoint, rotated critical secrets, and said it has no current evidence that customer code was affected. The investigation remains ongoing.

TeamPCP listed the stolen repositories for sale on BreachForums at a minimum price of $50,000, stating in the post that it was not interested in extorting GitHub and would simply leak the code for free if no buyer came forward. "Our current assessment is that the activity involved exfiltration of GitHub-internal repositories only," the company said in a statement.

TeamPCP's Self-Feeding Attack Loop, Explained

The GitHub breach did not begin with GitHub. It began on March 19, 2026, when TeamPCP compromised Aqua Security's Trivy vulnerability scanner via a GitHub Actions workflow that referenced dependencies by mutable version tags rather than fixed commit hashes. The attacker injected a credential-stealing payload — tracked by Google's Mandiant unit as SANDCLOCK — that scraped CI/CD secrets from runner memory and exfiltrated them to an attacker-controlled server disguised as a legitimate telemetry endpoint.

Those stolen credentials funded the next wave. Within days, TeamPCP used the harvested tokens to compromise Checkmarx's KICS infrastructure-as-code scanner, then the LiteLLM Python library — a package downloaded roughly three million times a day — then the Telnyx SDK, then Bitwarden's command-line tool, then 42 packages across the TanStack npm namespace in a window of approximately six minutes on May 11. Each poisoned package stole more credentials. Each new set of credentials poisoned more packages. Phoenix Security documented the full Wave Four attack chain, including GitHub's internal repositories and Microsoft's durabletask Python SDK on PyPI, both compromised on the same day.

The campaign's automation engine is a self-replicating worm called Mini Shai-Hulud — an adapted version of a worm that first appeared in the npm ecosystem in September 2025. It deposits encrypted stolen credentials into GitHub repositories tagged with references to Frank Herbert's Dune series, a consistent naming convention that has served as one of TeamPCP's clearest attribution markers across the campaign. Tenable's Research Special Operations Team describes it as a self-propagating worm that steals developer and cloud credentials, then uses those credentials to publish poisoned versions of additional packages — with each compromised CI/CD pipeline becoming a new distribution vector.

Cybersecurity firm Socket has tracked 20 distinct attack waves and more than 500 poisoned packages — exceeding 1,000 when counting individual hijacked versions. Wiz threat intelligence lead Ben Read has described the tactic as a flywheel of supply chain compromises, estimating that tainted packages gave TeamPCP access to hundreds of companies across the campaign. "It may be their biggest one," Read said of the GitHub breach.

Long-Lived Tokens: One Mechanism Enabling Everything

Palo Alto Networks researcher Nathaniel Quist identified the single underlying enabler that has powered the campaign from wave one: "The biggest opportunistic thing that's making this operation successful is long-lived credentials in these environments. It's vitally important to change your tokens even if you're not using LiteLLM or any of these packages that have been compromised."

The mechanism is straightforward. CI/CD pipelines routinely store GitHub personal access tokens, npm publishing tokens, AWS keys, and cloud credentials in runner memory. When a pipeline runs a compromised tool — a security scanner, a dependency manager, an IDE extension — that tool reads the environment, extracts every secret it can find, and transmits them. If those tokens were rotated on a 30-day schedule or scoped to individual repositories, the blast radius of each theft would be narrow. When tokens are classic, long-lived, and organization-wide — the industry default — a single compromise gives an attacker a master key to everything downstream.

The TanStack wave exposed a more fundamental problem. On May 11, TeamPCP published 84 malicious npm package versions carrying valid SLSA Build Level 3 cryptographic provenance attestations — the verification stamp organizations use to confirm a package came from a legitimate CI pipeline. The attestations were valid because TeamPCP had hijacked the legitimate CI pipeline itself. Standard package-verification tooling flagged nothing.

Confirmed Victims: European Commission, OpenAI, Grafana, Mistral

The campaign's confirmed damage extends far beyond GitHub. CERT-EU attributed the breach of the European Commission's AWS infrastructure to TeamPCP's Trivy compromise in April, with approximately 92 gigabytes of compressed data exfiltrated from 71 EU entities.

OpenAI disclosed that two employee devices were compromised in the May 11 TanStack attack, with internal source code repositories accessed and iOS, macOS, and Windows code-signing certificates subsequently rotated. Grafana Labs confirmed a breach via the same Nx Console extension vector; the company declined to pay a ransom demand and notified federal law enforcement, consistent with FBI guidance against paying extortion. Mistral AI confirmed one developer device was compromised and said it is facing a $25,000 extortion demand for an alleged 5 GB source code theft. Mercor, a $10 billion AI data startup whose customers include Anthropic, OpenAI, and Meta, was hit earlier in the campaign via the LiteLLM compromise; a third-party forensics investigation is ongoing. Phoenix Security's Wave Four briefing tracks confirmed victim disclosures across the campaign's full timeline.

A second threat group, which SentinelOne researcher Alex Delamotte named PCPJack, has since emerged — actively removing TeamPCP's implants from already-compromised environments and using the same stolen credentials to steal additional cloud secrets for its own operators.

GitHub Acknowledges Structural Debt; Roadmap Still in Preview

GitHub has not waited for the May breach to respond. In March 2026, the company published a security roadmap for GitHub Actions that acknowledged the systemic problem directly: "The failures we've seen around dependency management, complex and implicit trust boundaries, secret handling, and observability have led to an increase in attacks across the software supply chain."

The roadmap commits GitHub to moving Actions toward secure-by-default behavior — deterministic dependency locking, network egress firewalls for runners, scoped secrets, and centralized policy enforcement. Most features remain in public preview, with general availability expected at six to nine months from publication. The admission is significant: GitHub's current defaults allow workflows to reference dependencies by mutable tags and branches, meaning an attacker who compromises a single maintainer account can silently redirect millions of CI/CD pipelines to malicious code without publishing a new package version.

Charlie Eriksen, a security researcher at Aikido Security, offered the clearest statement of what unchanged defaults produce: VS Code extensions have full access to everything on the developer's machine — credentials, cloud keys, and SSH keys. "The day before the GitHub breach was disclosed, a completely separate extension called Nx Console, 2.2 million installs, was also briefly backdoored. The community caught that one in 11 minutes, which sounds fast until you realise how many machines auto-update in that window."

Federal Response Has Not Matched Campaign Scale

The regulatory response has lagged the technical damage by a significant margin. CVE-2026-33634, the Trivy vulnerability at the root of TeamPCP's first major wave, carries a CVSS severity score of 9.4. CISA added it to the Known Exploited Vulnerabilities catalog in March 2026, setting a federal remediation deadline of April 8, 2026.

Despite the campaign's scale — a months-long operation targeting Tier 1 technology companies, a major AI lab, a European Union institution, and now GitHub itself — CISA had not issued a standalone advisory naming TeamPCP, an emergency directive, or a joint advisory with the FBI or NSA as of mid-May 2026. NHS England Digital issued a cyber alert naming affected packages on May 12, 2026. Singapore's Cyber Security Agency remains among the few government bodies to have published dedicated advisories targeting the campaign specifically. The SANS Internet Storm Center, tracking campaign activity through May 17, noted that the continued absence of a dedicated federal advisory on a campaign of this profile is itself a meaningful data point.

What Developers Must Do Before Their Token Is Next

The immediate mitigations require no new tooling and no new budget.

Rotate GitHub personal access tokens immediately, particularly any classic tokens that lack an expiration date or that have organization-wide scope. Treat any CI/CD pipeline that ran between mid-March and May 22, 2026 as potentially compromised and rotate all associated credentials — GitHub tokens, npm publishing tokens, AWS keys, and cloud provider credentials — from a clean machine.

Audit CI/CD pipeline logs for outbound connections to unexpected endpoints, particularly OpenTelemetry-format URLs. The SANDCLOCK stealer specifically mimics telemetry traffic to evade detection; look for POST requests to domains that resemble legitimate monitoring services but resolve to unfamiliar infrastructure.

Pin GitHub Actions dependencies by full commit SHA, not by version tag or branch name. Tags are mutable — an attacker who controls the upstream account can silently replace them. Commit hashes are not. The difference between uses: some-action@v3 and uses: some-action@abc123def456 is the difference between a deterministic dependency and an open door.

Screen VS Code extensions before installing, regardless of publisher badges, verified status, or install counts. Nx Console carried all three. Check recent version history and look for unexpected permission requests. If auto-update is enabled in VS Code, consider disabling it for extensions with privileged access to the development environment.

Use fine-grained personal access tokens scoped to specific repositories with a 30- to 90-day expiration, or replace classic tokens with GitHub Apps installation tokens entirely. A PAT that never expires and carries organization-wide write access is the single credential type that makes TeamPCP's loop possible. Remove it, and each wave's blast radius shrinks from thousands of downstream repositories to one.

GitHub said it is beginning conversations with high-profile open-source maintainers about deeper structural changes to supply chain security. TeamPCP has already moved to its next wave. That gap — between a roadmap still in preview and a worm actively harvesting credentials — is where the next breach will be written.

ⓒ 2026 TECHTIMES.com All rights reserved. Do not reproduce without permission.

Join the Discussion