2026-03-19 UTC
Active Investigation

TeamPCP Supply Chain Campaign

A multi-week, multi-ecosystem attack chain spanning GitHub Actions, Docker Hub, npm, PyPI, and OpenVSX. Impacted so far: Aqua's Trivy, Checkmarx KICS, and LiteLLM.

Last updated:

Campaign So Far

Trivy (Aqua): The initial victim after incomplete containment following 03/01 PwnRequest. Attackers published malicious builds. (blog post, security advisory, GHSA-69fq-xp46-6x23)
KICS (Checkmarx): OpenVSX extension and GitHub Action hijacked via compromised account. Repo restored Mar 23. (Statement)
LiteLLM (BerriAI): PYPI_PUBLISH token harvested via Trivy in CI/CD. Versions 1.82.7/1.82.8 removed from PyPI. (Issue #24512 · PYSEC-2026-2)

Detailed Analysis

Want a detailed analysis? Check out our blog posts: Trivy Compromised and TeamPCP Attacks KICS

Precursor

February 27, 2026

Threat actor MegaGame10418 executed a Pwn Request against Trivy's CI, exploiting a vulnerable pull_request_target workflow to exfiltrate the aqua-bot PAT. Incomplete credential rotation enabled the current attacks.

Show details

Observed impact (per Aqua):

  • Repository made private and renamed to aquasecurity/private-trivy; empty repo pushed in its place
  • GitHub Releases v0.27.0–v0.69.1 deleted, including discussions and assets
  • Malicious artifact pushed to Trivy's VSCode extension on Open VSIX marketplace, using former employee's token

Remediation:

Aqua removed the vulnerable workflow, revoked the malicious extension token, restored the repo, and republished v0.69.2. Container images and package manager installs were unaffected; binary downloads and Trivy Action were temporarily degraded.

What they missed:

Credential rotation "wasn't atomic and attackers may have been privy to refreshed tokens" — enabling the current flurry of attacks.

Phase 01

Initial Compromise

v0.69.4 tag pushed -> references imposter commits (trivy, actions/checkout) → C2 fetch (scan.aquasecurtiy.org / 45.148.10.212) → cred stealer in built artifacts
Malicious Commit Exfiltration

Imposter Commit to actions/checkout

Attacker creates a malicious commit impersonating rauchg (Guillermo Rauch) in the actions/checkout repository. Payload fetches malicious Go files from typosquatted C2 and injects them into the build.

Show evidence
Malicious Commit Persistence

Imposter Commit to aquasecurity/trivy

Attacker duplicates a prior legitimate contribution and impersonates DmitriyLewen. This malicious commit references the imposter checkout action, establishing the attack chain.

Show evidence
Tag Push Release
17:43:37 UTC

Malicious v0.69.4 Tag Pushed

Tag v0.69.4 pushed to trivy repository, pointing to the malicious commit. This triggers automated release workflows.

Show evidence
Distribution Supply Chain

Malicious Releases Distributed

Automated workflows publish the malicious v0.69.4 release to multiple distribution channels, maximizing supply chain impact.

Show evidence
Phase 02

Lateral Movement via compromised aqua-bot identity

aqua-bot compromised → malicious workflows steal creds (tfsec, trivy-action, traceeshark) → trivy-action + setup-trivy tags pointed to malicious versions
Workflow Injection Secret Dump
21:31:23 UTC

tfsec Workflow Compromised

Malicious workflow added to aquasecurity/tfsec using compromised aqua-bot identity. Workflow dumps secrets, then is reverted.

Show evidence
Workflow Injection Secret Dump
21:35:34 UTC

traceeshark Workflow Compromised

Same attack pattern applied to aquasecurity/traceeshark. Malicious workflow injected via compromised bot account.

Show evidence
Workflow Injection Secret Dump
21:36:28 UTC

trivy-action Workflow Compromised

Attack continues to aquasecurity/trivy-action. This repository is particularly critical as it's used by thousands of downstream projects.

Show evidence
Phase 03

Malicious Distribution

Tag Manipulation Supply Chain
22:08 UTC

Malicious Action Tags Published

Using compromised aqua-bot credentials, attacker publishes malicious tags for trivy-action and setup-trivy, potentially affecting all downstream users.

Show evidence
Phase 04

Obfuscation coordinated spam flood

Spam Flood 96 Accounts
00:08:33 - 00:09:00 UTC (Mar 20)

Discussion #10420 Flooded

96 spam accounts posted generic praise comments within ~30 seconds, drowning technical discussion and incident coordination. Includes troll comments referencing "sugma" and "ligma".

Show evidence
Phase 05

npm Worm CanisterWorm propagation

Stolen npm tokens → self-propagating worm → ICP canister C2 → 28+ packages compromised in <60 seconds
Worm npm Supply Chain
20:45 UTC (Mar 20)

CanisterWorm Deployed to npm

Less than 24 hours after the Trivy compromise, TeamPCP deployed a self-propagating worm across npm. The worm uses the same ICP canister (tdtqy-oyaaa-aaaae-af2dq-cai) as the Trivy fallback C2—confirming shared infrastructure.

Show evidence
Phase 06

ICP Fallback Activated kamikaze.sh deployed

ICP C2 fallback activated → kamikaze.sh payload → K8s DaemonSet escape → Iran-targeted wiper
Wiper K8s Escape
~11:45 UTC (Mar 22)

kamikaze.sh v1 Payload Active on ICP C2

The ICP canister fallback C2 (tdtqy-oyaaa-aaaae-af2dq-cai) is serving kamikaze.sh—a Kubernetes-focused payload with an Iran-targeted wiper. Monolithic 150-line bash script with embedded logic.

Show evidence
Modular C2 Anti-Forensics
~12:45 UTC (Mar 22)

kamikaze.sh v2: Modular Architecture

ICP canister now redirects to Cloudflare tunnel. Payload evolved from monolithic bash to 15-line loader that fetches kube.py from C2 at runtime, then self-deletes.

Show evidence
Worm SSH + Docker
~13:00 UTC (Mar 22)

kamikaze.sh v3: Now a Worm

Major pivot: no longer K8s-focused. Now a self-propagating worm targeting SSH keys and exposed Docker APIs (port 2375). Scans local /24 subnet, parses auth logs for targets.

Show evidence
Modular Split prop.py
~13:25 UTC (Mar 22)

kamikaze.sh v3.1: Two-Module Architecture

Payload split into separate modules: kube.py (K8s DaemonSets) + prop.py (worm spreading). K8s module appears degraded (placeholder base64), but worm module fully functional.

Show evidence
Production C2 Rotation
14:56 UTC (Mar 22)

kamikaze.sh v3.2: Production-Ready Deployment

C2 infrastructure rotated. The placeholder PYTHON_B64 from v3.1 now contains actual ICP backdoor payload—v3.1 appears to have been a dev/test build.

Show evidence
Steganography WAV Payloads
~16:15 UTC (Mar 22)

kamikaze.sh v3.3: WAV Steganography

Payloads now hidden in WAV audio files. Python modules embedded as base64 in audio frames, extracted at runtime. Evades .py filters and static analysis.

Show evidence
Phase 07

Docker Hub Direct Push bypassing GitHub releases

Compromised Docker Hub creds → direct image push → 0.69.5, 0.69.6 tags → no corresponding GitHub release
Malicious Image Docker Hub
15:43 UTC (Mar 22)

aquasec/trivy:0.69.5 pushed to Docker Hub

Attacker pushes malicious image directly to Docker Hub, bypassing the GitHub release process entirely. No corresponding v0.69.5 tag exists on GitHub—this is a direct registry attack using compromised credentials. Image propagates to third-party mirrors including mirror.gcr.io.

Show evidence
Malicious Image Docker Hub
16:34 UTC (Mar 22)

aquasec/trivy:0.69.6 pushed to Docker Hub

Second malicious image pushed less than an hour after 0.69.5. Attacker continues to exploit Docker Hub access while GitHub-side compromise is being remediated. Also propagates to third-party mirrors.

Show evidence
Data Exfil Internal Repos
Mar 22, 20:31–20:32 UTC

Internal Aqua Repos Publicized via aquasec-com Org

Using compromised Argon-DevOps-Mgt service account, attacker defaced 44 repositories in aquasec-com—Aqua's internal GitHub org—in a 2-minute automated blitz. All repos renamed with tpcp-docs- prefix; internal assets now publicly exposed.

Show evidence
2026-03-22 21:31 UTC
ICP Canister Denylisted
C2 endpoint taken down due to policy violation
2026-03-22 23:20 UTC
aquasec-com Repositories Cleaned
Internal org repos restored and defacement removed
2026-03-23 01:40 UTC
Malicious Docker Tags Removed
All 15 tags removed from Docker Hub (0.69.5, 0.69.6, latest + arch variants) — ~9.5 hour exposure window.
2026-03-24 ~06:25 UTC
mirror.gcr.io Images Removed
Google removes cached malicious images from mirror.gcr.io after Aqua outreach. Confirmation.
Phase 08

Checkmarx Ecosystem same TTPs, new targets

Compromised Checkmarx accounts → OpenVSX extensions + GitHub Actions hijacked → C2 at checkmarx.zone
Malicious Extension
12:53 UTC (Mar 23)

Malicious extensions published to OpenVSX

Two extensions pushed via compromised ast-phoenix account, 12 seconds apart: ast-results v2.53.0 and cx-dev-assist v1.7.0. Payload checks for cloud credentials before downloading second-stage from checkmarx[.]zone. VS Code Marketplace unaffected.

Show evidence
Tag Hijack Credential Theft
12:58 UTC (Mar 23)

35 KICS versions redirected to malicious commits

Attacker compromises cx-plugins-releases service account (ID 225848595) and updates all 35 tags (v1 through v2.1.20) to point to staged commits containing setup.sh credential stealer.

Show evidence
Tag Hijack
Mar 23

Checkmarx/ast-github-action v2.3.28 compromised

Same payload deployed to AST GitHub Action. Identical TTPs: setup.sh entry point, credential scraping, encrypted exfil to checkmarx[.]zone.

Show evidence
2026-03-24 03:38 UTC
Clean OpenVSX Versions Published
ast-results v2.56.0 and cx-dev-assist v1.10.0 published (~15 hours after compromise). Malicious versions still downloadable as of 09:00 UTC.
2026-03-23 16:50 UTC
KICS Repository Taken Down
Community member reports compromise; repo taken offline. ~4 hour exposure window.
2026-03-23 18:59 UTC
KICS Repository Restored
Maintainers confirm incident resolved; repo reinstated.
Phase 09

LiteLLM PyPI infostealer via .pth injection

Compromised maintainer account → malicious PyPI releases → credential theft via .pth auto-execution
PyPI Compromise Credential Theft
10:39 & 10:52 UTC (Mar 24)

Malicious litellm 1.82.7 & 1.82.8 published to PyPI

Two malicious versions via compromised maintainer account. 1.82.8: .pth file executes on Python startup, exfil to models[.]litellm[.]cloud. 1.82.7: same KICS payload in proxy_server.py → drops p.py, exfil to checkmarx[.]zone/raw. Both harvest SSH keys, cloud credentials, env vars, crypto wallets.

Show evidence
Spam Botnet
12:44 UTC (Mar 24)

Spam flood targets security disclosure

28 spam comments posted in 43 seconds to bury Issue #24512. 25 accounts used—76% overlap with Trivy spam botnet confirms same operator. Mix of compromised developer accounts (stolen tokens) and purchased dormant accounts.

Show evidence
Defacement
~12:59 UTC (Mar 24)

BerriAI GitHub repos defaced

Via compromised krrishdholakia account, multiple BerriAI repositories had descriptions changed to "teampcp owns BerriAI".

2026-03-24 11:25 UTC
Malicious LiteLLM Versions Quarantined
PyPI quarantines litellm 1.82.7 and 1.82.8. ~3 hour exposure window.
2026-03-24 15:35 UTC
PYSEC-2026-2 Advisory Published
PyPA publishes official advisory. Credits Callum McMahon (Futuresearch) as reporter. Project reinstated on PyPI.
Thread 01

How did they gain access to push the malicious v0.69.4 tag?

The attacker was able to push a tag to aquasecurity/trivy pointing to a malicious commit. This requires write access to the repository. Was this via a compromised PAT, GitHub App, or deploy key?

Resolution: Aqua Security confirmed the attack stemmed from incomplete containment of the March 1, 2026 incident. Credential rotation "wasn't atomic and attackers may have been privy to refreshed tokens."

Official disclosure ↗
Resolved
Thread 02

Was aqua-bot the initial access vector, or only compromised via /trivy?

The aqua-bot service account was used for lateral movement to tfsec, traceeshark, and trivy-action. However, it's unclear whether aqua-bot credentials were the initial compromise, or if they were harvested from the trivy repository's secrets after the v0.69.4 tag push triggered workflows.

Resolution: The official disclosure confirms incomplete credential rotation from the first incident allowed attackers to capture refreshed tokens, including aqua-bot credentials.

Official disclosure ↗
Resolved
Thread 03

What was the v0.70.0 trivy attacker tag?

At 17:51:17 UTC on March 19, a v0.70.0 tag was deleted. The commit (9dbb34d3ec0f) was authored by aqua-bot on March 16 — 3 days earlier — with message "Updates", modifying cmd/trivy/main.go, pkg/github/auth.go, pkg/github/repowrite.go, pkg/github/runner.go. This suggests aqua-bot compromise may predate March 19.

View commit (via Adnan Khan) ↗
Unresolved
Thread 04

What was the setup-trivy poisoning?

All 7 tags (v0.2.0-v0.2.6) were force-pushed to malicious commits. Commit 8afa9b9f spoofed contributor "thara" (Tomochika Hara). Message: "Pin Trivy install script checkout to a specific commit (#28)". Spoofed date: 2026-01-15. Exposure window: ~4 hours (17:43-21:44 UTC Mar 19).

Malicious commit ↗ Victim example (grafana) ↗
Resolved
Thread 05

Is DarkSeek3r related?

A GitHub user "DarkSeek3r" (now deleted, user ID 266895321) was created at 2026-03-10T01:44:23. Their only public activity before account deletion was forking aquasecurity/trivy and actions/checkout — the exact repositories used in this attack.

View Gist (bored-engineer) ↗
Unresolved
Network Infrastructure

C2 Domains & IPs

# Primary C2 (typosquat) scan.aquasecurtiy.org 45.148.10.212 (TECHOFF SRV LIMITED, Amsterdam, NL) # Cloudflare Tunnels souls-entire-defined-routes.trycloudflare.com (v1 - CanisterWorm stager) plug-tab-protective-relay.trycloudflare.com (exfil) investigation-launches-hearings-copying.trycloudflare.com (v2) championships-peoples-point-cassette.trycloudflare.com (v3/v3.1) create-sensitivity-grad-sequence.trycloudflare.com (v3.2/v3.3) # v3.3 WAV steganography payloads create-sensitivity-grad-sequence.trycloudflare.com/bg_kube.wav create-sensitivity-grad-sequence.trycloudflare.com/bg_prop.wav # ICP Canister C2 - shared across Trivy fallback + CanisterWorm tdtqy-oyaaa-aaaae-af2dq-cai.raw.icp0.io # Links both attacks to same TeamPCP infrastructure # LiteLLM typosquat C2 models.litellm.cloud (NOT litellm.ai) # LiteLLM malicious package hashes 8395c3268d5c5dbae1c7c6d4bb3c318c752ba4608cfcd90eb97ffb94a910eac2 litellm-1.82.7.whl d2a0d5f564628773b6af7b9c11f6b86531a875bd2d186d7081ab62748a800ebb litellm-1.82.8.whl 8a2a05fd8bdc329c8a86d2d08229d167500c01ecad06e40477c49fb0096efdea litellm-1.82.7.tar.gz d39f4e7a218053cce976c91eacf184cf09a6960c731cc9d66d8e1a53406593a5 litellm-1.82.8.tar.gz a0d229be8efcb2f9135e2ad55ba275b76ddcfeb55fa4370e0a522a5bdee0120b proxy_server.py 71e35aef03099cd1f2d6446734273025a163597de93912df321ef118bf135238 litellm_init.pth
Malicious Commits

Imposter & Injected Commits

# Imposter commits (spoofed identities, verification.verified: false) 70379aad1a8b40919ce8b382d3cd7d0315cde1d0 actions/checkout (impersonating rauchg) 1885610c6a34811c8296416ae69f568002ef11ec aquasecurity/trivy (impersonating DmitriyLewen) ddb9da4475c1cef7d5389062bdfdfbdbd1394648 aquasecurity/trivy-action (imposter) # Lateral movement commits (via aqua-bot) a67fd5b5b119 aquasecurity/tfsec 56591dfe113b aquasecurity/traceeshark 93ed41111017c3767fafc7d9cc8711f3be1a661f aquasecurity/trivy-action # setup-trivy poisoning (January 2026, spoofing thara) 8afa9b9f9183b4e00c46e2b82d34047e3c177bd0 aquasecurity/setup-trivy
Compromised Accounts

GitHub Accounts

# Compromised service account aqua-bot (ID: 54269356, created 2019-08-19) # Suspected attacker accounts (deleted/banned) DarkSeek3r (ID: 266895321, created 2026-03-10T01:44:23)
Affected Artifacts

Poisoned Releases & Images

# Trivy v0.69.4 (~3 hour exposure: 18:22-21:42 UTC Mar 19) ghcr.io/aquasecurity/trivy:0.69.4 docker.io/aquasec/trivy:0.69.4 public.ecr.aws/aquasecurity/trivy:0.69.4 # setup-trivy: ALL 7 tags compromised (~4 hour exposure: 17:43-21:44 UTC Mar 19) aquasecurity/setup-trivy@v0.2.0 through v0.2.6 # Fixed: v0.2.6 (re-released) # trivy-action: 76 of 77 tags compromised (~12 hour exposure) # 17:43 UTC Mar 19 - 05:40 UTC Mar 20 # Never compromised: 0.35.0 (protected by GitHub immutable releases) # Safe SHA: 57a97c7e7821a5776cebc9bb87c984fa69cba8f1 # Maintainers removed all compromised tags and re-tagged clean releases # with a v prefix (e.g., v0.35.0 instead of 0.35.0) # LiteLLM PyPI (quarantined) litellm==1.82.7 litellm==1.82.8 # Contains litellm_init.pth - auto-executes on Python startup
Full list of affected packages (Socket.dev) ↗
Malware Signatures

Strings & Filenames

# Attribution strings "TeamPCP Cloud stealer" "tpcp.tar.gz" (exfil bundle) "tpcp-docs" (fallback exfil repo / GitHub dead drop) # Credential sweeper targets 50+ sensitive file paths # Injected files (from C2) cmd/trivy/main.go cmd/trivy/scand.go cmd/trivy/fork_unix.go cmd/trivy/fork_windows.go .golangci.yaml # Target process "Runner.Worker" (memory scraping target) # kamikaze.sh v1 (ICP fallback payload) /var/lib/svc_internal/runner.py /etc/systemd/system/internal-monitor.service DaemonSet: host-provisioner-std DaemonSet: host-provisioner-iran (wiper) # kamikaze.sh v2 (modular) Container: kamikaze hostPID: true (process namespace access) # kamikaze.sh v3 (worm) /var/lib/pgmon/pgmon.py /etc/systemd/system/pgmonitor.service Scans ports 22, 2375 on local /24 Parses /var/log/auth.log for targets rm -- "$0" (self-deletion)
Threat Actor

TeamPCP

Also known as PCPcat, Persy_PCP, ShellForce, and DeadCatx3. Emerged as a significant threat to cloud-native infrastructure in late 2025.

Self-attribution string "TeamPCP Cloud stealer" found in the trivy-action payload links this incident to the group.

Telegram: @Persy_PCP, @teampcp

View on Wiz Threat Center ↗
Targets

Cloud-Native Infrastructure

Docker APIs Kubernetes clusters GitHub Actions runners Ray dashboards Redis servers CI/CD pipelines
TTPs

Common Techniques

# Initial Access Supply chain poisoning (GitHub Actions, package registries) Exposed service exploitation (Docker, K8s, Redis) # Credential Harvesting /proc/[pid]/mem memory scraping Filesystem credential sweeping (50+ paths) Cloud metadata service (IMDS) theft # Exfiltration Typosquatted domains Cloudflare Tunnels (ephemeral C2) GitHub dead drops (tpcp-docs repos) ICP-hosted fallback infrastructure # Objectives Credential theft → lateral movement Ransomware deployment Cryptomining Extortion
Source

Flare.io Analysis

"TeamPCP Cloud-Native Ransomware" — detailed analysis of the December 2025 worm-driven campaign targeting cloud infrastructure.

Source

Beelzebub Analysis

Next.js exploit campaign analysis — 59K compromises in 33 hours. Reveals Telegram handles and Singapore C2 infrastructure.

Aqua Security (Official)

Trivy Supply Chain Attack: What Happened and What You Need to Know

Official vendor response with full timeline, IOCs, and remediation guidance.

Aikido Security

TeamPCP Deploys CanisterWorm via npm

Analysis of the self-propagating npm worm using ICP canisters for C2, deployed <24 hours after Trivy compromise.

BoostSecurity Labs

20 Days Later: Trivy Compromise Act II

Detailed technical analysis of the second Trivy compromise.

Socket.dev

Trivy Under Attack Again: GitHub Actions Compromise

Payload analysis including three-stage exfiltration mechanism and TeamPCP Cloud stealer.

StepSecurity

Trivy Compromised a Second Time - Malicious v0.69.4 Release

Timeline and detection guidance for the v0.69.4 supply chain attack.

BoostSecurity

MegaGame10418: The User Behind Hackerbot-Claw

Identifies MegaGame10418 as the attacker behind the February 27 Pwn Request that exfiltrated the aqua-bot PAT via memory dump technique.

Open Source Malware Index

aquasecurity/trivy

Malware catalog entry with IOCs and package metadata.

Open Source Malware Index

TeamPCP aquasec-com GitHub Org Compromise

Forensic analysis of the internal org defacement, Argon-DevOps-Mgt token compromise, and kill chain reconstruction.

Socket.dev

Trivy GitHub Actions Compromise

Supply chain attack database entry with affected versions and remediation.

Flare.io

TeamPCP Cloud-Native Ransomware

Analysis of TeamPCP stealer targeting cloud credentials and CI/CD pipelines.

Sysdig

TeamPCP Expands Supply Chain Compromise: Spreads from Trivy to Checkmarx

Multi-stage payload analysis covering ast-github-action compromise, IMDS harvesting, and encrypted exfiltration.

shift-js

Trivy Compromise Analysis

Deep dive on "Imposter Commits" technique exploiting Git alternates, GPG verification bypass detection, and three-stage payload architecture.

The Official Soundtrack of the Trivy Supply Chain Attack

Every threat actor leaves fingerprints. TeamPCP left a playlist. Songs embedded in payloads, C2 infrastructure, and attack tooling.