Skip to main content
3,000 Repositories Poisoned in Two Minutes: The Trivy Supply Chain AttackIncident
5 min readFor Security Engineers

3,000 Repositories Poisoned in Two Minutes: The Trivy Supply Chain Attack

What Happened

On March 22, 2026, threat actor TeamPCP compromised the Trivy vulnerability scanner's Docker Hub distribution channel and attacked Aqua Security's GitHub infrastructure. Malicious versions of Trivy were pushed to Docker Hub, replacing legitimate releases. These poisoned containers delivered an infostealer, a self-propagating worm, and a Kubernetes cluster wiper to organizations using Trivy in their CI/CD pipelines.

The attack was possible because TeamPCP accessed a service account named Argon-DevOps-Mgt, which had write permissions across Aqua Security's repository ecosystem. Using this account, attackers modified all repositories in a scripted 2-minute burst, showing both preparation and automation. The last known clean release of Trivy on Docker Hub is 0.69.3. The incident is tracked as CVE-2026-33634 with a CVSS score of 9.4.

Timeline

Pre-March 22, 2026: Attackers compromise the Argon-DevOps-Mgt service account through unknown means. The account has broad write access to Aqua Security's GitHub organization.

March 22, 2026 (exact time unknown): In a 2-minute window, automated scripts modify repositories across Aqua Security's GitHub presence. Malicious Trivy images are pushed to Docker Hub, replacing legitimate releases after version 0.69.3.

Post-attack (timeline unknown): Organizations running automated Trivy scans in CI/CD pipelines pull poisoned images. The infostealer activates, the worm begins lateral movement, and in Kubernetes environments, the wiper component triggers.

Which Controls Failed or Were Missing

Service Account Lifecycle Management: The Argon-DevOps-Mgt account operated without time-bound access restrictions. There was no evidence of periodic revalidation or automated expiration policies. The account maintained standing write access across multiple repositories instead of least-privilege, job-specific permissions.

Anomaly Detection: A 2-minute burst of scripted modifications across thousands of repositories should have triggered automated alerts. Either detection rules didn't exist, weren't tuned to catch service account behavior patterns, or alerts were ignored.

Container Image Signing and Verification: Organizations pulling Trivy images from Docker Hub lacked cryptographic verification of image provenance. If images had been signed and verification enforced, the poisoned releases would have failed validation checks before execution.

CI/CD Pipeline Input Validation: Pipelines executed container images without verifying checksums, signatures, or comparing against known-good manifests. The trust boundary extended to "whatever Docker Hub serves" rather than "only verified artifacts."

Privileged Access Monitoring: No real-time monitoring flagged the service account's sudden spike in write operations. Standard user behavior analytics should have caught this deviation from baseline activity.

What the Relevant Standards Require

PCI DSS v4.0.1 Requirement 8.6.1 mandates that service accounts are assigned only the privileges necessary to perform their intended function. The Argon-DevOps-Mgt account violated this by maintaining broad write access rather than scoped, repository-specific permissions.

PCI DSS v4.0.1 Requirement 8.6.2 requires that all service accounts are reviewed at least once every six months to ensure they remain necessary and appropriate. Organizations using Trivy must apply this same discipline to their own automation accounts.

NIST 800-53 Rev 5 Control AC-2(3) requires automatic disabling of accounts after a defined period of inactivity. Service accounts that run scheduled jobs should have time-bounded credentials that expire and require renewal, not standing access.

NIST 800-53 Rev 5 Control CM-7(5) addresses software integrity verification, requiring organizations to verify the integrity of software before execution. Your pipeline should verify container image signatures before pulling and running them.

SOC 2 Trust Service Criteria CC6.6 requires logical access controls that prevent unauthorized access, including monitoring for unusual access patterns. The 2-minute burst of modifications should have triggered alerts under any reasonable monitoring implementation.

ISO 27001 Control 8.3 covers privileged access rights management, requiring that allocation and use of privileged access rights are restricted and controlled. This applies equally to human administrators and service accounts.

Lessons and Action Items for Your Team

Implement time-bound service account credentials. Every automation account in your CI/CD pipeline should use credentials that expire. For GitHub Actions, use OpenID Connect tokens scoped to specific workflows. For container registries, rotate credentials every 90 days maximum. If a service account needs standing access, you haven't scoped its permissions tightly enough.

Enforce container image signing and verification. Sign all internally-built images with Sigstore cosign or Docker Content Trust. For third-party images like Trivy, verify signatures before execution. Configure your Kubernetes admission controllers to reject unsigned images. This adds friction, but that friction prevents poisoned images from running.

Scope service accounts to single repositories or workflows. The Argon-DevOps-Mgt account's broad access enabled widespread compromise. Create separate service accounts for each CI job, each with write access only to its specific target. A deployment account should not have access to modify source code repositories.

Deploy behavioral analytics for service accounts. Your SIEM should baseline normal activity for each automation account: typical operation count per hour, repositories accessed, time-of-day patterns. Alert when a service account deviates from baseline—especially rapid bursts of write operations.

Pin container image versions by digest, not tag. In your CI/CD configurations, reference images by their SHA-256 digest rather than tags like "latest" or version numbers. Tags are mutable; digests are not. This prevents an attacker from replacing v0.70.0 with malicious content while keeping the same tag.

Audit your current service accounts this week. List every service account with write access to your repositories, registries, or infrastructure. For each one, document: what it does, why it needs current permissions, when credentials were last rotated, and who owns it. Revoke any account without a clear, current business justification.

Establish a known-good artifact repository. Maintain an internal mirror of critical dependencies like Trivy, scanning tools, and base images. Verify these artifacts once, then serve them from your controlled repository. This creates a security boundary between external registries and your production pipeline.

The Trivy attack succeeded because of accumulated permission debt and missing verification controls. You cannot prevent account compromise, but you can limit the blast radius when it happens and detect anomalies fast enough to contain them. Start with time-bound credentials and image verification—these controls would have stopped this specific attack chain.

Topics:Incident

You Might Also Like