Poisoned Pipeline / Incidents / AS17
Team PCP CI/CD secrets campaign
GitHub ActionsPyPICI/CD SaaSGitLab CIAzure PipelinesJenkinsBitbucketCircleCIAzureGitLabKubernetesMCP
Between 19 and 24 March 2026, Team PCP compromised trusted components
(including 76 of 77 version tags of the Trivy GitHub Action, the Checkmarx
KICS Action, the telnyx PyPI package, and LiteLLM), planted credential
stealers on CI runners, and collected secrets those runners had in memory.
CloudSEK later published the victim set: 78,330 distinct secrets from
2,186 organizations across GitLab, GitHub Actions, Azure DevOps, Jenkins,
Bitbucket, and CircleCI. The same month included a related axios npm
compromise dropping a RAT.
Mapped techniques
- T0122 Vulnerability in third-party CI/CD actions
- T0121 Compromised legitimate artifact
- T0109 Publish malicious artifact
- T0181 Malicious module injection
- T0132 Overprivileged CI/CD Runners
- T0140 Harvest tokens from environment variables
- T0193 Sensitive information in environment variables
- T0162 Passwords in CI/CD logs
- T0145 Bypass of outbound traffic control
- T0156 Exfiltration over webhooks
- T0199 Secret leak
- T0201 Customers compromised
supply-chain Trusted CI components (Trivy Action, KICS, telnyx, LiteLLM)
76 of 77 Trivy Action version tags were poisoned; the Checkmarx KICS
Action was hit with the same tag-repoint pattern.
telnyx on PyPI and LiteLLM were trusted packages whose next versions
carried the stealer.
Poisoned Action tags and package versions were published under real names.
The telnyx PyPI stealer was hidden in a WAV file (steganography) inside
the package, not as an obvious install script.
post-supply-chain Victim CI/CD runners
Runners held cloud keys, signing keys, and source-control tokens more
privileged than a phished laptop typically reaches.
Secrets loaded into the job environment were scraped from runner memory.
JWTs, PATs, AWS keys, and OpenAI keys were present as env on the runner.
Pipeline logs and runner output were part of the credential surface
alongside in-memory env.
Open outbound network from runners was the exfil path to attacker C2.
129 organizations leaked Slack webhooks; stolen webhooks are both loot
and an outbound channel.
78,330 distinct secrets left 2,186 organizations in five days.
Downstream CI users of Trivy/KICS/telnyx/LiteLLM were the blast radius.
Framework gaps noted
- Mutable GitHub Actions tag repointing is still modeled as T0122 rather than its own technique.
- Runner-memory scraping is implied by T0132/T0140, not named separately.
Sources
- https://www.stepsecurity.io/blog/teampcp-supply-chain-attack-cicd-secrets-cloudsek-disclosure
- https://www.stepsecurity.io/blog/state-of-open-source-supply-chain-attacks
- https://exposure.cloudsek.com/ai-supply-chain-incident
- https://www.stepsecurity.io/blog/10-layers-deep-how-stepsecurity-stops-teampcps-trivy-supply-chain-attack-on-github-actions
- https://opensourcemalware.com/blog/teampcp-supply-chain-campaign-a-march-2026-retrospective
- https://opensourcemalware.com/blog/teampcp-hijacks-litellms-pypi-package-credential-stealer-hits-40k-star-project
- https://opensourcemalware.com/blog/teampcp-defaces-aqua-securitys-internal-github-org-44-repos-exposed
- https://opensourcemalware.com/blog/teampcp-compromises-antv-npm
- https://opensourcemalware.com/blog/has-teampcp-pivoted-to-using-the-purehvnc-rat
- https://safedep.io/malicious-telnyx-pypi-compromise
- https://safedep.io/malicious-litellm-1-82-8-analysis
- https://safedep.io/trivy-teampcp-supply-chain-compromise
- https://safedep.io/bitwarden-cli-supply-chain-compromise
- https://www.reversinglabs.com/blog/shai-hulud-worm-arrests-what-you-need-to-know
- https://www.cloudsek.com/blog/ai-supply-chain-breach-2500-companies-434000-cicd-pipelines
- https://socket.dev/blog/antv-packages-compromised
- https://socket.dev/blog/bitwarden-cli-compromised
- https://socket.dev/blog/checkmarx-supply-chain-compromise
- https://socket.dev/blog/namastex-npm-packages-compromised-canisterworm
- https://socket.dev/blog/telnyx-python-sdk-compromised
- https://socket.dev/blog/trivy-docker-images-compromised
- https://socket.dev/blog/trivy-under-attack-again-github-actions-compromise
- https://socket.dev/blog/canisterworm-npm-publisher-compromise-deploys-backdoor-across-29-packages
- https://socket.dev/blog/unauthorized-ai-agent-execution-code-published-to-openvsx-in-aqua-trivy-vs-code-extension
- https://www.stepsecurity.io/blog/teampcp-plants-wav-steganography-credential-stealer-in-telnyx-pypi-package
- https://github.com/team-telnyx/telnyx-python/issues/235
- https://www.stepsecurity.io/blog/litellm-credential-stealer-hidden-in-pypi-wheel
- https://github.com/BerriAI/litellm/issues/24512
- https://docs.litellm.ai/blog/security-update-march-2026