Unit 42 Details TeamPCP Supply-Chain Attacks on Trivy, KICS, LiteLLM and Telnyx

· Original article ↗

Summary

Unit 42 details TeamPCP’s Feb–Mar 2026 compromise of Trivy, KICS, LiteLLM and Telnyx packages, describing credential theft, CanisterWorm’s ICP-based C2 and wiper, and mitigations. Exfiltration scale is reported, not independently established here.

Key points

  • Unit 42 reports that TeamPCP targeted Aqua Security Trivy, Checkmarx KICS, BerriAI LiteLLM and the Telnyx Python SDK between late February and March 2026.
  • The Trivy wave used a compromised service account to force-push malicious code to repository tags; later attacks abused stolen GitHub personal access tokens and PyPI publishing credentials.
  • Payloads were inserted into GitHub Actions and packages. The LiteLLM version 1.82.8 payload used a .pth file that ran when Python started; malicious Telnyx versions executed code on import.
  • The reported payloads sought cloud credentials, SSH keys, Kubernetes secrets and LLM API keys. The article cites estimates of more than 300 GB of data and about 500,000 credentials, but does not establish those figures independently.
  • CanisterWorm used an Internet Computer Protocol canister for C2 and included self-replication and wiper capabilities; the article says a wiper was observed targeting Iran on March 23.
  • Recommendations include checking SBOMs for affected packages, pinning package versions, hardening CI/CD policies and auditing or rotating potentially exposed credentials.

Article Details

Attack Vectors
  • TeamPCP reportedly force-pushed malicious code to Trivy and KICS GitHub Action version tags, and compromised GitHub and PyPI publishing credentials to distribute altered packages.
  • Malicious pre-install or post-install scripts in poisoned npm packages ran when developers or CI/CD runners installed them.
  • A malicious litellm_init.pth file in LiteLLM version 1.82.8 executed during Python interpreter startup; poisoned LiteLLM versions 1.82.7 and 1.82.8 were uploaded to PyPI.
  • Malicious Telnyx Python SDK versions 4.87.1 and 4.87.2 reportedly ran an injector on import and used WAV steganography to conceal encrypted second-stage payloads.
  • The TeamPCP cloud stealer harvested cloud credentials, SSH keys, Kubernetes secrets, and LLM API keys; the article reports collection from environment files and cloud configuration directories.
  • CanisterWorm used an ICP canister for C2 and reportedly spread by scanning exposed Docker APIs and local networks; its wiper component deployed privileged DaemonSets or recursively deleted files.
Defensive Notes
  • Maintain real-time SBOM visibility and use software composition analysis to identify affected or otherwise risky packages.
  • Pin known package versions and Git dependencies to specific commit hashes; scan packages before implementing them.
  • Harden CI/CD policies and review dependencies, including unused dependencies and packages installed without integrity checks.
  • Audit and rotate GitHub personal access tokens, cloud-provider credentials, Kubernetes service account tokens, and container-based SSH keys.

Indicators of compromise

TypeIndicatorContext
DOMAINcheckmarx[.]zoneVendor-themed typosquat used by the Checkmarx-wave payload for data exfiltration.
DOMAINmodels[.]litellm[.]cloudTyposquatted C2 and exfiltration domain used in the LiteLLM wave.
DOMAINscan[.]aquasecurtiy[.]orgTyposquatted TeamPCP exfiltration domain used by the Trivy-wave payload.
DOMAINtdtqy-oyaaa-aaaae-af2dq-cai[.]raw[.]icp0[.]ioBackup C2 domain used by the Trivy-wave payload.
HOSTNAMEchampionships-peoples-point-cassette[.]trycloudflare[.]comCloudflare tunnel hostname listed as infrastructure used for staging or redirects.
HOSTNAMEcreate-sensitivity-grad-sequence[.]trycloudflare[.]comCloudflare tunnel hostname listed as infrastructure used for staging or redirects.
HOSTNAMEinvestigation-launches-hearings-copying[.]trycloudflare[.]comCloudflare tunnel hostname listed as infrastructure used for staging or redirects.
HOSTNAMEplug-tab-protective-relay[.]trycloudflare[.]comCloudflare tunnel hostname listed as infrastructure used for staging or redirects.
HOSTNAMEsouls-entire-defined-routes[.]trycloudflare[.]comCloudflare tunnel hostname listed as infrastructure used for staging or redirects.
IPV4195[.]5[.]171[.]242IP listed in the article's TeamPCP C2 and infrastructure indicators.
IPV4209[.]34[.]235[.]18IP listed in the article's TeamPCP C2 and infrastructure indicators.
IPV4212[.]71[.]124[.]188IP listed in the article's TeamPCP C2 and infrastructure indicators.
IPV423[.]142[.]184[.]129IP listed in the article's TeamPCP C2 and infrastructure indicators.
IPV445[.]148[.]10[.]212IP listed in the article's TeamPCP C2 and infrastructure indicators.
IPV463[.]251[.]162[.]11IP listed in the article's TeamPCP C2 and infrastructure indicators.
IPV483[.]142[.]209[.]11IP listed in the article's TeamPCP C2 and infrastructure indicators.
IPV483[.]142[.]209[.]203IP listed in the article's TeamPCP C2 and infrastructure indicators.
SHA2560880819ef821cff918960a39c1c1aada55a5593c61c608ea9215da858a86e349SHA-256 of a malicious file listed among TeamPCP payloads and binaries.
SHA25618a24f83e807479438dcab7a1804c51a00dafc1d526698a66e0640d1e5dd671aSHA-256 of a malicious file listed among TeamPCP payloads and binaries.
SHA25630015dd1e2cf4dbd49fff9ddef2ad4622da2e60e5c0b6228595325532e948f14SHA-256 of a self-signed certificate associated with a TeamPCP operation wave.
SHA25641c4f2f37c0b257d1e20fe167f2098da9d2e0a939b09ed3f63bc4fe010f8365cSHA-256 of a self-signed certificate associated with a TeamPCP operation wave.
SHA25661ff00a81b19624adaad425b9129ba2f312f4ab76fb5ddc2c628a5037d31a4baSHA-256 of a malicious file listed among TeamPCP payloads and binaries.
SHA2567b5cc85e82249b0c452c66563edca498ce9d0c70badef04ab2c52acef4d629caSHA-256 of a malicious file listed among TeamPCP payloads and binaries.
SHA256887e1f5b5b50162a60bd03b66269e0ae545d0aef0583c1c5b00972152ad7e073SHA-256 of a malicious file listed among TeamPCP payloads and binaries.
SHA256cd08115806662469bbedec4b03f8427b97c8a4b3bc1442dc18b72b4e19395fe3SHA-256 of a malicious file listed among TeamPCP payloads and binaries.
SHA256d8caf4581c9f0000c7568d78fb7d2e595ab36134e2346297d78615942cbbd727SHA-256 of a self-signed certificate associated with a TeamPCP operation wave.
SHA256e6310d8a003d7ac101a6b1cd39ff6c6a88ee454b767c1bdce143e04bc1113243SHA-256 of a malicious file listed among TeamPCP payloads and binaries.
SHA256e87a55d3ba1c47e84207678b88cacb631a32d0cb3798610e7ef2d15307303c49SHA-256 of a malicious file listed among TeamPCP payloads and binaries.
SHA256ecce7ae5ffc9f57bb70efd3ea136a2923f701334a8cd47d4fbf01a97fd22859cSHA-256 of a malicious file listed among TeamPCP payloads and binaries.
SHA256f7084b0229dce605ccc5506b14acd4d954a496da4b6134a294844ca8d601970dSHA-256 of a malicious file listed among TeamPCP payloads and binaries.

MITRE ATT&CK

T1003.007 · Proc FilesystemThe first Trivy-wave script read runner.worker process memory through /proc/<pid>/mem to obtain plaintext tokens.T1021.007 · Cloud ServicesThe article reports Python-process requests to Kubernetes API endpoints for secrets, namespaces, and nodes, describing the activity as enumeration and lateral movement.T1041 · Exfiltration Over C2 ChannelThe payloads exfiltrated harvested credentials and secrets to TeamPCP C2 infrastructure.T1059.004 · Unix ShellThe kamikaze.sh loader used Bash scripts to run the multi-stage payload.T1059.006 · PythonPython loaders and the malicious LiteLLM .pth file executed payload code, including during Python interpreter startup.T1074 · Data StagedThe malware created local artifacts including session.key, payload.enc, session.key.enc, and tpcp.tar.gz in its staging and exfiltration activity.T1105 · Ingress Tool TransferA later kamikaze.sh loader downloaded the second-stage kube.py payload.T1195.002 · Compromise Software Supply ChainTeamPCP reportedly poisoned trusted GitHub Action tags and published malicious npm and PyPI package versions to compromise downstream development and CI/CD environments.T1485 · Data DestructionThe CanisterWorm wiper reportedly bricked Kubernetes clusters or recursively deleted files on non-containerized hosts.T1546.017 · Udev RulesThe litellm_init.pth file executed malicious code automatically when Python processes initialized.T1552.001 · Credentials In FilesPayloads harvested secrets from .env files, cloud configuration directories, and Kubernetes configuration files.T1552.004 · Private KeysThe malware harvested SSH keys from compromised environments.T1552.005 · Cloud Instance Metadata APIThe Trivy-wave payload queried instance metadata services to harvest cloud credentials.

CVE

Threat Actors

Malware

Vendors

Products

Countries

Related Articles