97M
Monthly Downloads
5
Ecosystems Hit
6
Days, 3 Targets
3h
LiteLLM Exposure
The Story
March 19: Trivy. TeamPCP compromised Aqua Security's Trivy vulnerability scanner by force-pushing malicious code to 76 of 77 version tags in the trivy-action GitHub Action and all 7 tags in setup-trivy. Every CI/CD pipeline pinned to a tag (rather than a commit SHA) began running the attacker's code on its next execution. The payload harvested environment variables and secrets from GitHub Actions runner memory, searched for cloud and infrastructure credentials, encrypted the results, and exfiltrated them to attacker-controlled infrastructure. Because the legitimate Trivy scan still ran afterward, many users saw normal output and missed the theft entirely. The compromise is tracked as CVE-2026-33634 (CVSS 9.4).
March 23: Checkmarx KICS. Using credentials harvested from the Trivy compromise, TeamPCP poisoned the Checkmarx KICS GitHub Action (checkmarx/kics-github-action) and the Checkmarx AST Action. Wiz confirmed the attack used the same RSA encryption key and payload naming conventions as the Trivy operation. TeamPCP also published trojanized versions of two Checkmarx Open VSX extensions: ast-results (v2.53.0) and cx-dev-assist (v1.7.0). The C2 domain checkmarx[.]zone was registered specifically for this operation. The VS Code Marketplace versions were not affected.
March 24: LiteLLM. LiteLLM's CI/CD pipeline used Trivy as part of its build process. The compromised Trivy action exfiltrated the PYPI_PUBLISH token from the GitHub Actions runner. With that token, TeamPCP published litellm 1.82.7 at 10:39 UTC and 1.82.8 at 10:52 UTC. Both contained a three-stage attack payload. Version 1.82.8 also included a .pth file that executes the malware every time Python starts on the infected machine, even if the user never imports litellm. The backdoored versions were live on PyPI for approximately three hours before quarantine. LiteLLM has approximately 97 million monthly downloads (3.4 million per day). The entire package has been quarantined on PyPI.
The campaign's deliberate escalation pattern is what makes it exceptional. Endor Labs described it: "Each compromised environment yields credentials that unlock the next target. The pivot from CI/CD (GitHub Actions runners) to production (PyPI packages running in Kubernetes clusters) is a deliberate escalation." Wiz reported that TeamPCP is now collaborating with LAPSUS$ and that the group posted on Telegram claiming they are "partnering with other teams to perpetuate the chaos" and that "many of your favourite security tools and open-source projects will be targeted in the months to come."
Microsoft published detailed detection guidance today for Defender for Cloud and Defender for Endpoint, including KQL queries for hunting TeamPCP activity across cloud and on-premises environments.
The Adversary Perspective
From a red team lens, TeamPCP has executed the most effective supply chain pivot chain we have seen this year. Three design choices stand out.
First, they targeted security tools specifically. Trivy and KICS are security scanners. They run with elevated permissions in CI/CD pipelines by design because they need to read code, configurations, and secrets to do their job. Compromising a security tool is higher value than compromising an arbitrary dependency because security tools are explicitly trusted with broad access to the environments they scan. The irony is that the tools meant to protect the pipeline became the attack vector.
Second, the credential harvesting was weaponized for chain exploitation. This was not a smash-and-grab. TeamPCP did not just steal credentials and sell them. They used Trivy's stolen credentials to compromise Checkmarx. They used Trivy's stolen PyPI token to compromise LiteLLM. Each link in the chain was chosen because the previous compromise yielded the specific credential needed for the next target. This is structured, methodical supply chain pivoting.
Third, the LiteLLM payload targets production Kubernetes clusters. The credential harvester sweeps SSH keys, cloud credentials, Kubernetes secrets, crypto wallets, and .env files. The Kubernetes lateral movement toolkit deploys privileged pods to every node. The persistent systemd backdoor polls for additional binaries every 50 minutes. This is not just credential theft. This is persistent access to production infrastructure at scale.
Figure 01
- MAR 19 // CRITICAL
Trivy Compromise
Force-pushed malicious code to 76/77 trivy-action tags and all setup-trivy tags. Credential stealer harvested secrets from CI runners. Legitimate scan still ran, masking theft. CVE-2026-33634 (CVSS 9.4). - MAR 22
Docker Hub Poisoning
Malicious Docker images of Trivy (v0.69.5, v0.69.6) published. Hijacked Aqua Security's GitHub organization. Defaced 44 repositories. SSH worm and Kubernetes wiper deployed in some environments. - MAR 23 // CRITICAL
Checkmarx KICS Compromise
Stolen credentials used to poison kics-github-action and ast-github-action. Two Open VSX extensions trojanized. C2 domain checkmarx[.]zone registered for this op. Same RSA key and payload structure as Trivy. - MAR 24 // CRITICAL
LiteLLM Backdoor
Trivy-harvested PYPI_PUBLISH token used to publish litellm 1.82.7 and 1.82.8. Three-stage payload: credential harvester, Kubernetes lateral movement toolkit, persistent systemd backdoor. .pth file ensures execution on every Python startup. 97M monthly downloads. Package quarantined on PyPI. - MAR 24
Community Suppression
88 bot comments from 73 compromised developer accounts posted in 102 seconds to bury the disclosure issue on GitHub. Issue closed as "not planned" using the compromised maintainer account. 76% account overlap with Trivy botnet. - ONGOING // CRITICAL
Expansion & LAPSUS$ Partnership
TeamPCP claims partnership with LAPSUS$. Threatens additional security tools and open source projects. Campaign spans 5 ecosystems: GitHub Actions, Docker Hub, npm, Open VSX, PyPI. Endor Labs says "almost certainly not over."
Detection & IOC Summary
- CVE: CVE-2026-33634 (CVSS 9.4) - Trivy supply chain compromise
- Exfil Domains: scan.aquasecurtiy[.]org, checkmarx[.]zone, models.litellm[.]cloud
- Exfil IP: 45.148.10.212
- Backup Exfil: tpcp-docs / docs-tpcp GitHub repositories created via victim tokens
- Kill Switch: Payload aborts if C2 URL contains youtube[.]com
- Persistence: ~/.config/sysmon/sysmon.py (systemd service polling every 50 min)
- .pth Payload: Fires on any Python process startup (litellm 1.82.8)
- Compromised Versions: Trivy v0.69.3-v0.69.6, KICS action (Mar 23 tags), litellm 1.82.7/1.82.8
- Safe Versions: Trivy 0.69.7+, KICS 1.10.0/2.56.0+, LiteLLM 1.82.9+ (when unquarantined)
- Microsoft Detection: KQL queries published for Defender for Cloud and Defender for Endpoint
- Locale Check: Kubernetes wiper activates on Iranian timezone/locale systems
Defensive Takeaways
- 1
Check Immediately: Did You Run Trivy, KICS, or LiteLLM Between March 19 and 24?
If yes, assume full credential compromise for every secret accessible from those environments. Rotate all cloud credentials, SSH keys, Kubernetes secrets, API tokens, database passwords, and CI/CD tokens. Check for the presence of
tpcp-docsordocs-tpcprepositories in your GitHub account, as these are confirmed exfiltration indicators. Search for~/.config/sysmon/directories on Linux hosts andsysmon.servicein systemd. Runpip show litellm | grep Versionacross all Python environments, including Docker images and CI runners. - 2
Pin All GitHub Actions to Commit SHAs, Not Tags
The entire Trivy compromise worked because CI/CD pipelines referenced Actions by tag name. Tags in Git are mutable. Anyone with push access can reassign them to point to malicious commits. Pin every GitHub Action in your workflows to a full commit SHA. This is the single most effective control against this class of attack. Tags are convenient. SHAs are secure. Pick one.
- 3
Treat CI/CD Secrets as High-Value Targets, Not Convenience Tokens
The PYPI_PUBLISH token that enabled the LiteLLM compromise was stored as a GitHub Actions secret accessible to CI runners. Use short-lived OIDC tokens instead of stored secrets wherever possible. If long-lived tokens must be used, restrict their scope to the minimum required permissions and rotate them on a defined schedule. Never store publishing credentials (PyPI, npm, Docker Hub) as persistent secrets in CI environments if OIDC-based publishing is available.
- 4
Deploy Microsoft's Published Detection Queries
Microsoft published KQL hunting queries today for Defender for Cloud and Defender for Endpoint that detect TeamPCP activity across cloud workloads and on-premises environments. If you run Microsoft Defender, deploy these queries immediately. Key patterns to detect: processes spawning from
entrypoint.shwithgrep -qiE (env|ssh),kubectl get secrets --all-namespacescommands, and outbound connections to the known exfiltration domains listed in the IOC block above. - 5
Audit Your Open Source Security Tooling as Attack Surface, Not Just Defense
TeamPCP specifically targeted security scanners because they are trusted with elevated access by design. Trivy, KICS, and similar tools scan your code, read your secrets, and run in your CI/CD pipelines with broad permissions. If one of these tools is compromised, the attacker inherits all of that trust. Evaluate the supply chain risk of your security tools with the same rigor you apply to production dependencies. Verify update integrity, pin versions, and monitor for unexpected changes in tool behavior or network activity.