TeamPCP’s Supply-Chain Campaign Used CI/CD Secrets to Spread Across Software Ecosystems

· Original article ↗

Summary

A detailed profile traces TeamPCP’s 2026 campaign from a Trivy CI/CD compromise through credential theft and propagation across package registries and developer tools, detailing its C2, persistence, exfiltration, and reported impacts.

Key points

  • The article traces the campaign’s initial access to residual Trivy token access after an incomplete credential rotation, which enabled a malicious release and poisoned GitHub Actions.
  • Payloads scraped runner process memory and filesystem paths for secrets, encrypted collected data in tpcp.tar.gz, and used victim-owned GitHub repositories as a fallback exfiltration channel.
  • Stolen publishing tokens enabled CanisterWorm to push malicious updates to 28 npm packages in under 60 seconds; the campaign also reached PyPI and OpenVSX.
  • Reported techniques include Internet Computer Protocol canisters for fallback command and control, Python payloads hidden in WAV files, and persistence through systemd services and privileged Kubernetes DaemonSets.
  • The article reports roughly 500,000 stolen credentials and more than 300 GB of exfiltrated data. It says CERT-EU attributed a European Commission AWS environment breach to TeamPCP, with about 92 GB of compressed data stolen.
  • The article describes the campaign as ongoing in early April 2026 and recommends rotating secrets, auditing for campaign artifacts, and pinning GitHub Actions to full commit SHAs.

Article Details

Attack Vectors
  • TeamPCP used residual access to a Trivy CI/CD service account token to push a malicious v0.69.4 tag and poison the release pipeline.
  • Compromised GitHub Actions harvested secrets from runner process memory and filesystem paths, including cloud credentials, tokens, SSH keys, and Docker configuration.
  • Stolen npm publish tokens enabled CanisterWorm to publish malicious updates to packages the token owners could modify; stolen PyPI tokens were used in the LiteLLM and Telnyx SDK compromises.
  • Compromised Checkmarx credentials were used to compromise GitHub Actions and OpenVSX extensions.
  • The payloads used WAV files containing base64-encoded Python payloads for delivery, and used privileged Kubernetes DaemonSets and malicious systemd services for persistence.
  • The campaign used typosquatted domains, Cloudflare Tunnel endpoints, and an ICP canister for command-and-control or exfiltration; a fallback uploaded encrypted archives to repositories in victims’ GitHub organizations.
  • The article reports SSH key harvesting to support lateral movement and a wiper targeting Iranian hosts.
Defensive Notes
  • Rotate credentials atomically after a compromise, including service-account tokens and package-publishing credentials.
  • Audit logs for tpcp.tar.gz and hunt for docs-tpcp and tpcp-docs repository names.
  • Pin GitHub Actions to full commit SHAs rather than mutable tags.

Indicators of compromise

TypeIndicatorContext
DOMAINcheckmarx[.]zoneC2 and second-stage delivery infrastructure used in the Checkmarx campaign.
HOSTNAMEchampionships-peoples-point-cassette[.]trycloudflare[.]comCloudflare Tunnel hostname reported as C2 for payload versions 3.0 and 3.1.
HOSTNAMEcreate-sensitivity-grad-sequence[.]trycloudflare[.]comCloudflare Tunnel hostname reported as active C2 for payload versions 3.2 and 3.3; it served kamikaze.sh and WAV payloads.
HOSTNAMEplug-tab-protective-relay[.]trycloudflare[.]comCloudflare Tunnel hostname used as a phase 02 exfiltration endpoint.
HOSTNAMEscan[.]aquasecurtiy[.]orgTyposquatted attacker-controlled C2 domain used to fetch malicious Go source files for the Trivy build pipeline.
HOSTNAMEtdtqy-oyaaa-aaaae-af2dq-cai[.]raw[.]icp0[.]ioICP canister hostname used as fallback C2 infrastructure.
IPV445[.]148[.]10[.]212C2 server reported to resolve for scan.aquasecurtiy[.]org.
IPV483[.]142[.]209[.]203New C2 address reported in the compromised Telnyx Python SDK campaign.

MITRE ATT&CK

T1021.004 · SSHprop.py harvested ~/.ssh/id_* keys and auth.log entries to support SSH-based spread across local networks.T1027 · Obfuscated Files or InformationPython payloads were base64-encoded inside valid WAV audio files to evade file-extension filtering and static analysis.T1036 · MasqueradingImposter commits spoofed trusted contributor identities, and PostgreSQL-themed service names helped disguise malicious artifacts.T1059.004 · Unix Shellkamikaze.sh acted as a Bash loader, while kube.py and prop.py were Python controllers for deployment and propagation.T1195.001 · Compromise Software Dependencies and Development ToolsPoisoned Trivy GitHub Actions, npm packages, PyPI releases, and OpenVSX extensions were used to compromise downstream users.T1485 · Data DestructionAn Iran-targeted wiper executed rm -rf / on Kubernetes nodes and other Iranian hosts.T1543.002 · Systemd ServiceThe payloads installed pgmon.service, pgmonitor.service, or internal-monitor.service with Restart=always for persistence.T1552 · Unsecured CredentialsThe malicious Actions payload read /proc/[pid]/mem from Runner.Worker processes and searched runner memory and filesystem paths for secrets.T1560 · Archive Collected DataStolen data was packaged as tpcp.tar.gz using AES-256-CBC and RSA-4096 key exchange.T1567.001 · Exfiltration to Code RepositoryA fallback created a tpcp-docs repository in the victim’s GitHub organization and uploaded encrypted archives as release assets.T1610 · Deploy ContainerPrivileged DaemonSets named host-provisioner-std and host-provisioner-iran were deployed in kube-system with hostPath mounts.

CVE

People

Threat Actors

Malware

Vendors

Products

AWS ECRmalicious build logic and poisoned releases that propagated through GitHub Releases, Docker Hub, AWS ECR, and GitHub Container Registry.Checkmarx KICSin March 2026 with a cascading supply chain campaign that compromised Aqua Security’s Trivy, Checkmarx KICS, LiteLLM, Telnyx, Palo Alto Networks, and 66+ npm packages, ultimately breaching the EuropeanDocker HubCI/CD scanners and runner environments to harvest secrets and propagate across GitHub Actions, Docker Hub, npm, PyPI, and OpenVSX.GitHub Actionsweaponized CI/CD scanners and runner environments to harvest secrets and propagate across GitHub Actions, Docker Hub, npm, PyPI, and OpenVSX.GitHub Container Registrylogic and poisoned releases that propagated through GitHub Releases, Docker Hub, AWS ECR, and GitHub Container Registry.LiteLLMsupply chain campaign that compromised trusted security tools and package ecosystems (Trivy, Checkmarx, LiteLLM, Telnyx, 66+ npm packages, PyPI, OpenVSX), resulting in roughly 500,000 stolen credentials and over 300Next.jsIn December 2025, TeamPCP exploited CVE-2025-29927 (CVSS 10.0), a critical React2Shell vulnerability in Next.js, to compromise over 59,000 servers in under 48 hours during Operation PCPcat.npmthat compromised trusted security tools and package ecosystems (Trivy, Checkmarx, LiteLLM, Telnyx, 66+ npm packages, PyPI, OpenVSX), resulting in roughly 500,000 stolen credentials and over 300 GB of exfiltratedOpenVSXsecurity tools and package ecosystems (Trivy, Checkmarx, LiteLLM, Telnyx, 66+ npm packages, PyPI, OpenVSX), resulting in roughly 500,000 stolen credentials and over 300 GB of exfiltrated data including a breachPyPItrusted security tools and package ecosystems (Trivy, Checkmarx, LiteLLM, Telnyx, 66+ npm packages, PyPI, OpenVSX), resulting in roughly 500,000 stolen credentials and over 300 GB of exfiltrated data including aTelnyx Python SDKTelnyx Python SDK versions 4.87.1 and 4.87.2 compromised on PyPI via the same WAV steganography technique, with a new C2 at 83[.]142[.]209[.]203. The package had 742,000 monthly downloads.Trivy2026 open-source supply chain campaign that compromised trusted security tools and package ecosystems (Trivy, Checkmarx, LiteLLM, Telnyx, 66+ npm packages, PyPI, OpenVSX), resulting in roughly 500,000 stolen

Tools

Countries

Related Articles