TeamPCP Exploits CI/CD Trust to Hijack PyPI, Docker Hub, and GitHub Actions in Coordinated Supply Chain Campaign

TeamPCP, a financially motivated threat cluster tracked as SHADOW-WATER-058, orchestrated a highly coordinated supply chain poisoning campaign from March 19 through April 24, 2026. Across at least seven distinct waves, the actor successfully compromised trusted developer toolchains spanning five programming ecosystems and three registry types. Their primary objective remained ruthlessly consistent: the rapid harvesting and monetization of developer credentials, cloud provider keys, and CI/CD tokens. TeamPCP’s operational tradecraft relies heavily on abusing implicit trust within build pipelines, eliminating the need to compromise end-user systems directly. The threat actor demonstrated an unusual preference for embedding distinct branding within their payloads, including Dune-themed staging repositories, specific commit-message markers (“LongLiveTheResistanceAgainstMachines”), and customized exfiltration headers like X-Rise-To-The-Trinny. By leveraging diverse delivery mechanisms, TeamPCP proved adept at tailoring their cryptographic sophistication—ranging from AES-256-GCM to custom MD5-keystream XOR ciphers—to fit the specific operational requirements of each target.

Case Study 1: The Multi-Channel KICS Compromise

On April 22, 2026, the threat actor executed a highly complex, multi-channel poisoning of the Checkmarx KICS distribution infrastructure. Over an 83-minute window, TeamPCP simultaneously overwrote six official Docker Hub tags, published malicious VS Code and OpenVSX extensions, and modified the project’s GitHub Actions workflow to serialize repository secrets. The core payload, an obfuscated 10 MB file named mcpAddon.js, was executed via a downloaded Bun runtime. This stealer aggressively targeted AWS, Azure, GCP credentials, and AI configuration files (including ~/.claude.json), utilizing a robust AES-256-GCM encryption scheme paired with an attacker-embedded RSA public key. The stolen npm tokens were weaponized within 24 hours to hijack the @bitwarden/cli package. The downstream Bitwarden payload introduced a highly resilient C&C fallback mechanism that queried the GitHub commit-search API to retrieve RSA-signed alternate exfiltration domains, ensuring infrastructure survival even if the primary domain was neutralized.

Checkmarx KICS multichannel infection chain, with Docker Hub, VS Code and OpenVSX, and GitHub Actions entry vectors converging on the JavaScript credential stealer, with downstream Bitwarden CLI hijack via stolen npm tokens

Case Study 2: The elementary-data Script Injection

Just two days later, the elementary-data attack demonstrated a technically simpler, yet structurally devastating, initial access vector. A single malicious comment (curl... | bash) on an open GitHub pull request was interpolated directly into a run: block without sanitization by the .github/workflows/update_pylon_issue.yml workflow. This granted the attacker a runner token with repository write access, allowing them to forge a tagged release commit and invoke the project’s legitimate signing infrastructure. The resulting PyPI package, verified by standard checks, deployed a 46 KB pure-Python outer loader that exploited the .pth import mechanism to execute before application code. Utilizing an MD5-keystream XOR cipher—seeded by the operator’s Session messenger ID—the payload decrypted an inner stealer that executed directly in memory. Notably, this stealer engaged in live AWS Cloud API abuse, utilizing secretsmanager:ListSecrets and ssm:DescribeParameters to enumerate and dump plaintext secrets across the account, vastly expanding the blast radius beyond local disk-resident files.

Credential harvesting: More than 80 paths across six categories :

CategoryScope
SSHPrivate keys (RSAEd25519ECDSADSA), authorized_keys, SSH config, and system host keys from /etc/ssh/ssh_host*_key
Cloud (AWS/GCP/Azure)Credential files, environment variables, EC2 IMDS v2, and ECS task credentials
Kubernetes~/.kube/config, cluster-wide secret enumeration via kubectl get secrets --all-namespaces -o json, ServiceAccount tokens from /var/run/secrets/
Developer tooling.npmrc.pypirc.cargo/credentials.toml.vault-tokengh auth token.netrc.git-credentials, and IaC files (terraform.tfstate.gitlab-ci.ymlJenkinsfile)
DatabasesMySQL, PostgreSQL, Redis, MongoDB, LDAP credential files; and environment-variable scans for DATABASEDB_MYSQLPOSTGRESMONGOREDISVAULT patterns
CryptocurrencyBitcoin, Ethereum, Solana (including validator and authorized-withdrawer keypairs), Litecoin, Dogecoin, Zcash, Dash, Ripple, Monero, and Cardano wallet keystores

Remediation and Incident Response

Organizations exposed to either the KICS or elementary-data compromises must assume full CI/CD environment breach and initiate comprehensive incident response protocols.

  • Credential Rotation: Immediately rotate all GitHub PATs, AWS IAM access keys, Azure service principal secrets, GCP service account keys, and npm tokens from a verified clean host.
  • Infrastructure Auditing: Audit GitHub Actions logs for anomalous format-check.yml workflow runs and search for auto-created public repositories matching the Dune-themed naming pattern.
  • Payload Hunting: Proactively hunt for Bun runtime artifacts in unexpected directories and investigate any elementary.pth file in Python site packages exceeding 100 KB.
  • Telemetry Review: Monitor CloudTrail logs for unexpected secretsmanager:ListSecrets calls originating from CI/CD runner principals, which serves as a highly reliable hunting signal for this specific threat actor.

Expert Opinion: The Fragility of Implicit Trust in CI/CD Pipelines

The TeamPCP campaign exposes a fundamental, industry-wide architectural flaw: our dangerous over-reliance on implicit trust within CI/CD pipelines. While the multi-channel KICS attack was operationally impressive, the elementary-data breach is far more alarming. The fact that a single, unsanitized pull request comment could hijack a trusted runner token and trick a project’s own infrastructure into cryptographically signing malware highlights a severe disconnect between software security and pipeline security.

We are witnessing a paradigm shift where threat actors no longer need to burn expensive zero-days to breach enterprise networks; they simply exploit the excessive permissions granted to automated workflows. TeamPCP’s ability to seamlessly pivot from static credential harvesting to live AWS API abuse demonstrates a mature understanding of modern cloud-native environments. Furthermore, the actor’s deliberate choice to use pure-Python payloads with plaintext-level entropy to bypass traditional, pattern-based static analysis engines underscores the limitations of legacy endpoint detection tools. Moving forward, the industry must mandate “zero trust” principles for CI/CD environments. We must strictly scope runner tokens, aggressively sanitize all external inputs in GitHub Actions, and treat build pipelines as highly privileged, inherently hostile perimeters rather than secure internal utilities.

MITRE ATT&CK mapping

TacticTechniqueIDObservation
Initial AccessSupply Chain Compromise: Compromise Software Supply ChainT1195.002Poisoned Docker Hub images, VS Code extensions, PyPI packages, and GitHub Actions across both incidents
Initial AccessValid AccountsT1078KICS incident: stolen publisher credentials used for Docker Hub, VS Code, and GitHub Action republish
Initial AccessTrusted RelationshipT1199Elementary-data incident: GitHub Actions runner token abused through PR comment script injection
ExecutionCommand and Scripting Interpreter: JavaScriptT1059.007KICS mcpAddon.js executed via Bun runtime on the victim system
ExecutionCommand and Scripting Interpreter: PythonT1059.006Elementary-data .pth payload executed at Python interpreter startup
ExecutionCommand and Scripting Interpreter: Unix ShellT1059.004Elementary-data: GitHub Actions runner executes shell stager after comment injection
PersistenceBoot or Logon Autostart ExecutionT1547Elementary-data .pth fires on every Python interpreter startup on the host
Defense EvasionObfuscated Files or InformationT1027KICS payload uses AES-256-GCM + RSA OAEP-SHA256; elementary-data uses MD5-keystream XOR
Defense EvasionIndicator Removal: File DeletionT1070.004Elementary-data uses a temporary-directory context manager to delete trin.tar.gz on exit
Credential AccessUnsecured Credentials: Credentials In FilesT1552.001Both payloads harvest SSH keys, cloud credential files, and developer tokens from disk
Credential AccessUnsecured Credentials: Cloud Instance Metadata APIT1552.005Elementary-data stealer queries EC2 IMDS v2 and ECS task credential endpoints
Credential AccessSteal Application Access TokenT1528Elementary-data: GitHub Actions runner GITHUB_TOKEN abused to forge release commit
DiscoveryCloud Service DiscoveryT1526Elementary-data: secretsmanager:ListSecrets and ssm:DescribeParameters live enumeration
DiscoveryContainer and Resource DiscoveryT1613Elementary-data: kubectl get secrets –all-namespaces enumeration
CollectionData from Local SystemT1005Credential files, shell history, AI and MCP configuration files harvested
CollectionData from Cloud StorageT1530Elementary-data: secretsmanager:GetSecretValue retrieves plaintext secrets
Command and ControlApplication Layer Protocol: Web ProtocolsT1071.001HTTPS exfiltration to actor-controlled C&C endpoints in both incidents
Command and ControlDead Drop ResolverT1102.001KICS and Bitwarden variants use GitHub commit-search API to recover fallback C&C domains
ExfiltrationExfiltration Over C2 ChannelT1041Both payloads POST encrypted credential archives over HTTPS to the primary C&C endpoint
ExfiltrationExfiltration Over Web ServiceT1567KICS dead-drop to auto-created public GitHub repositories under Dune-themed names
ImpactFinancial TheftT1657Cryptocurrency wallet harvesting observed in the elementary-data payload