TeamPCP Supply-Chain Attacks Steal Credentials Through KICS and elementary-data

· Original article ↗

Summary

Trend Micro analyzes two TeamPCP supply-chain attacks that abused CI/CD and release workflows to distribute credential stealers, compromise downstream software, and access cloud secrets.

Key points

  • The campaign spans at least seven waves from March 19 to April 24, 2026, targeting developer tools, packages, registries, and CI/CD workflows.
  • On April 22, attackers poisoned Checkmarx KICS Docker images, VS Code/OpenVSX extensions, and a GitHub Action; stolen npm tokens were used the next day to hijack @bitwarden/cli.
  • On April 24, an unsanitized pull-request comment triggered elementary-data’s GitHub Actions workflow, letting the attacker create a malicious release without first stealing maintainer credentials.
  • The elementary-data package’s .pth payload ran at Python interpreter startup and harvested credentials, secrets, SSH keys, Kubernetes data, and cryptocurrency wallet files.
  • The stealer also used available AWS credentials to enumerate Secrets Manager secrets and retrieve secret values through live API calls.
  • The article recommends treating systems exposed to affected artifacts as compromised, rotating credentials from clean hosts, and reviewing workflow runs and cloud audit logs.
  • Structural mitigations include sanitizing user-controlled GitHub Actions inputs, pinning container images by verified digest, limiting CI permissions, and restricting runner network egress.

Article Details

Attack Vectors
  • TeamPCP poisoned Checkmarx KICS Docker Hub images, VS Code and OpenVSX extensions, and the checkmarx/ast-github-action workflow.
  • Stolen npm tokens from the KICS incident were used to publish a malicious @bitwarden/cli release.
  • A pull request comment injected a shell command into an elementary-data GitHub Actions workflow that interpolated the comment body into a run block without sanitization.
  • The elementary-data workflow's runner token was used to create a malicious release commit and trigger the project's release workflow, which built and signed the malicious package.
  • The elementary-data .pth payload executed at Python interpreter startup, harvested credentials and secrets, and exfiltrated an archive over HTTPS.
  • The KICS payload downloaded and used the Bun runtime to execute a JavaScript credential stealer.
Defensive Notes
  • Use least-privilege permissions for CI/CD workflows and runner identities.
  • Audit GitHub Actions workflows for user-controlled event data interpolated directly into shell commands; sanitize inputs and avoid unsafe run-block interpolation.
  • Pin container images to verified digests rather than tags, and apply network egress controls to CI runners.
  • Rotate potentially exposed credentials from a clean host, including cloud credentials, GitHub PATs, npm tokens, SSH keys, Kubernetes tokens, and secrets stored in files or developer tooling.
  • Treat hosts that installed elementary-data 0.23.3 or ran the identified compromised KICS, extension, GitHub Action, or Bitwarden CLI artifacts during their exposure windows as compromised.
  • Hunt for unexpected Bun execution, Python interpreter processes making outbound HTTPS connections at startup, GitHub commit-search API calls from CI agents, and the reported temporary artifacts and actor-branded exfiltration header.
  • Review CloudTrail for secretsmanager:ListSecrets, secretsmanager:GetSecretValue, and ssm:DescribeParameters from CI or data-pipeline identities that should not access those services.
  • Block documented C2 infrastructure when available and preserve relevant artifacts for incident response before cleanup.

MITRE ATT&CK

T1005 · Data from Local SystemThe payloads collected local credential files, shell history, and developer configuration files.T1027 · Obfuscated Files or InformationThe payloads used AES-256-GCM with RSA OAEP-SHA256 or MD5-keystream XOR to protect or obscure data.T1041 · Exfiltration Over C2 ChannelBoth payloads sent encrypted credential archives to primary C2 endpoints over HTTPS.T1059.004 · Unix ShellThe injected elementary-data stager command was executed by the GitHub Actions runner through a shell.T1059.006 · PythonThe elementary-data .pth payload executed as Python code at interpreter startup.T1059.007 · JavaScriptThe KICS JavaScript payload was executed through the Bun runtime.T1070.004 · File DeletionThe elementary-data payload used a temporary-directory context manager to delete its archive and other temporary artifacts.T1071.001 · Web ProtocolsThe payloads used HTTPS to communicate with actor-controlled C2 endpoints.T1078 · Valid AccountsThe article maps the KICS republishing activity to use of stolen publisher credentials.T1102.001 · Dead Drop ResolverThe KICS and Bitwarden payloads queried GitHub commit search to recover fallback C2 domains.T1195.002 · Compromise Software Supply ChainPoisoned Docker images, editor extensions, PyPI packages, and GitHub Actions were distributed through compromised software supply chains.T1199 · Trusted RelationshipA pull request comment triggered script injection that abused the elementary-data GitHub Actions runner token.T1526 · Cloud Service DiscoveryThe stealer enumerated AWS secrets and SSM parameters using live API calls.T1528 · Steal Application Access TokenThe elementary-data attack abused the runner's GITHUB_TOKEN to create a release commit.T1530 · Data from Cloud StorageThe elementary-data stealer retrieved plaintext values from AWS Secrets Manager.T1547 · Boot or Logon Autostart ExecutionThe elementary-data .pth file executed on Python interpreter startup on affected hosts.T1552.001 · Credentials In FilesBoth payloads harvested credential files, including SSH keys, cloud credentials, and developer tokens.T1552.005 · Cloud Instance Metadata APIThe elementary-data stealer queried EC2 IMDS v2 and ECS task credential endpoints.T1567 · Exfiltration Over Web ServiceThe KICS payload used auto-created public GitHub repositories to stage encrypted credential blobs.T1613 · Container and Resource DiscoveryThe elementary-data payload used kubectl to enumerate Kubernetes secrets across namespaces.T1657 · Financial TheftThe elementary-data payload harvested cryptocurrency wallet keystores.

People

Threat Actors

Vendors

Products

@bitwarden/cliKICS showed multichannel poisoning across Docker Hub, VS Code/OpenVSX, and GitHub Actions, followed by a downstream hijack of @bitwarden/cli using stolen npm tokens.AWS Secrets ManagerBunJavaScript/Bun runtime delivery (KICS, Bitwarden CLI)Docker HubKICS showed multichannel poisoning across Docker Hub, VS Code/OpenVSX, and GitHub Actions, followed by a downstream hijack of @bitwarden/cli using stolen npm tokens.elementary-dataAnalyzing TeamPCP’s Supply Chain Attacks: Checkmarx KICS and elementary-data in CI/CD Credential TheftGHCRsigned by legitimate CI and published to Python Package Index (PyPI) and GitHub Container Registry (GHCR).GitHub ActionsKICS showed multichannel poisoning across Docker Hub, VS Code/OpenVSX, and GitHub Actions, followed by a downstream hijack of @bitwarden/cli using stolen npm tokens.KICSAnalyzing TeamPCP’s Supply Chain Attacks: Checkmarx KICS and elementary-data in CI/CD Credential TheftOpenVSXKICS showed multichannel poisoning across Docker Hub, VS Code/OpenVSX, and GitHub Actions, followed by a downstream hijack of @bitwarden/cli using stolen npm tokens.PyPIpipeline, producing a malicious package signed by legitimate CI and published to Python Package Index (PyPI) and GitHub Container Registry (GHCR).SSM Parameter StoreIn elementary-data, the stealer also makes live Amazon Web Services (AWS) API calls to enumerate and pull secrets from Secrets Manager and SSM Parameter Store, going beyond files stored on disk.VS CodeKICS showed multichannel poisoning across Docker Hub, VS Code/OpenVSX, and GitHub Actions, followed by a downstream hijack of @bitwarden/cli using stolen npm tokens.

Industries

Related Articles