What Happened
On 19 March 2026, TeamPCP — a threat actor with a pattern of targeting popular developer tools — used stolen credentials to execute a supply chain attack against Aqua Security’s Trivy vulnerability scanner ecosystem. In a single operation, the attackers:
- Published a malicious Trivy v0.69.4 release to the official GitHub repository
- Force-pushed 75 of 77 version tags in the
aquasecurity/trivy-actionGitHub Actions repository to point to credential-stealing malware - Replaced all 7 tags in the
aquasecurity/setup-trivyrepository with malicious commits
A second wave on 22 March replaced Docker Hub images with malicious v0.69.5 and v0.69.6 releases.
Why the Attack Succeeded Twice
The root cause reveals a common and dangerous pattern in credential rotation. Following an initial February 2026 compromise disclosure, Aqua Security rotated its credentials — but the rotation was non-atomic. Not all credentials were invalidated simultaneously, leaving a window of several days during which the attacker could have used a valid token to exfiltrate newly rotated secrets.
StepSecurity confirmed the attacker retained access through the rotation window and used the re-obtained credentials to execute the March 19 attack. This “rotation without revocation” failure is a recurring theme in supply chain incidents.
What the Malicious Actions Did
The embedded infostealer in the malicious Trivy GitHub Actions was purpose-built for CI/CD environments. Unlike malware targeting desktop systems, it:
- Extracted plain-text secrets directly from runner process memory, bypassing GitHub Actions’ standard environment variable masking
- Targeted: cloud provider credentials (AWS, GCP, Azure), Kubernetes tokens, Docker credentials, Git credentials, SSH keys, CI/CD service tokens (GitHub, GitLab, CircleCI, Jenkins), and database connection strings
- Exfiltrated collected secrets to an external attacker-controlled endpoint
Analysis of affected repositories by StepSecurity found that 45 repositories had at least one workflow run that executed a compromised version of trivy-action or setup-trivy during the compromise window.
Why This Matters Beyond Trivy
Trivy is one of the most widely deployed open-source vulnerability scanners in CI/CD pipelines. Compromising it is particularly impactful because:
Position in the pipeline: Security scanning steps run with elevated permissions — they need to inspect containers, access registries, and read build artefacts. The scanner’s position gives it access to a broad range of pipeline secrets.
Trust assumptions: Security tools are generally exempt from the scepticism applied to third-party libraries. Developers assume security tools are safe, making them ideal vectors.
Transitive impact: Organisations that use platforms built on Trivy (Rancher, platform engineering tools, managed DevSecOps services) may be exposed through a provider’s compromised Trivy integration.
CISA added CVE-2026-33634 (the malicious code embedded in Trivy) to the Known Exploited Vulnerabilities catalogue on 26 March 2026.
Recommended Actions
- Audit CI/CD pipeline runs from 19–22 March 2026: identify any workflow that used
aquasecurity/trivy-actionoraquasecurity/setup-trivywithout a pinned SHA — these pipelines may have executed malicious code - Rotate all secrets accessible to affected runners: cloud provider keys, Kubernetes service accounts, Docker hub credentials, and any API tokens available in the pipeline environment
- Pin all GitHub Actions to a commit SHA rather than a version tag (
uses: aquasecurity/trivy-action@abc1234...not@v0.69.x) — tags are mutable and can be force-pushed; SHAs are immutable - Upgrade to Trivy v0.69.7 or later — Aqua Security has published a clean release after the incident. Verify by checking the release signature
- Implement secret scanning across your repository history using tools like truffleHog or GitHub Secret Scanning to detect if credentials were exposed in logs or artefacts from affected pipeline runs
- Review your CI/CD credential rotation policy: ensure rotation is atomic — all usages of a credential must be updated before the old credential is considered revoked