The LiteLLM Supply-Chain Attack — TeamPCP “SANDCLOCK” CI/CD Credential-Harvesting Campaign via a Backdoored Trivy GitHub Action
Cyber Threat Intelligence
Resecurity has acquired 152.5 GiB of data following a supply-chain security breach involving LiteLLM, exposing stolen corporate credentials and configuration data linked to thousands of domains.
Analysis of the attacker's victim archive from the March 2026 LiteLLM supply-chain compromise (TeamPCP / “SANDCLOCK” stealer): 415,427 on-host secret-capture files harvested from GitHub Actions / CI-CD runners across 898 owners and 2,038 repositories — with the Trivy→LiteLLM attack chain, captured-secret composition, real masked evidence, and named victims.
REPORT ID |
DATE OF ISSUE 14 August 2026 |
CLASSIFICATION TLP:AMBER+STRICT |
| DATASET supplychain_victims.tar (152.5 GiB) |
CAPTURE FILES 415,427 · 898 owners · 2,038 repos |
CAPTURE DATES 19–24 March 2026 |
| CAMPAIGN LiteLLM / TeamPCP “SANDCLOCK” |
VECTOR Backdoored aquasecurity/trivy-action |
PREPARED BY Resecurity HUNTER Unit |
1 Executive Summary
Resecurity analysed an acquired archive, supplychain_victims.tar (≈152.5 GiB), containing 415,427 secret-capture files. Every file follows the naming convention <YYYYMMDD>_<HHMMSS>_<µs>_127.0.0.1.txt and holds a JSON-style secret store of the form "<name>":{"value":"<secret>","isSecret":true}. The uniform 127.0.0.1 tag indicates the secrets were dumped in-process on the victim host — i.e. environment/secret material read from live CI-CD pipeline memory, not intercepted over the network.
The archive is attributed to the LiteLLM supply-chain attack conducted by TeamPCP using the “SANDCLOCK” credential-stealer. Per published incident reporting — corroborated by this dataset — TeamPCP backdoored the Trivy GitHub Action (aquasecurity/trivy-action, which appears in the affected-repos manifest) on 19 March 2026; LiteLLM's CI auto-installed the poisoned Trivy, which stole LiteLLM's PyPI publishing tokens and published malicious litellm==1.82.7 / 1.82.8 on 24 March 2026. On every compromised runner the stealer escalated to root and swept SSH keys, cloud credentials, Kubernetes tokens, .env files and in-memory secrets from /proc/<pid>/mem — precisely the artefacts captured in these files.
Accompanying victim manifests enumerate 898 compromised GitHub owners (organisations/accounts) across 2,038 repositories. The affected owners include major global enterprises — among them Microsoft, Azure, IBM, NVIDIA, PayPal (Zettle), Deloitte, Bosch, S&P Global, Elevance Health, 84.51° (Kroger), Adeo (Leroy Merlin), Kärcher, Dräger, ID.me and 1inch (see §7).
From a 1,073-file sample (the portion recoverable from the partial download), Resecurity catalogued 2,146 captured secret records. The dominant artefact is the GitHub Actions GITHUB_TOKEN — present in ~98% of sampled files — alongside GitHub App private keys, AWS/GCP/Firebase credentials, container-registry (ECR/JFrog) tokens, SSH keys, code-signing passwords and CI webhooks. No live secret values are reproduced in this report; all exhibits show real captures with secret values masked (start/end retained, entropy removed).
Assessment: this is a high-to-critical severity software-supply-chain compromise. Harvested CI-CD tokens grant push/publish access to source repositories and package registries, enabling second-order supply-chain propagation (poisoning downstream artefacts) as well as cloud-account takeover — indeed this campaign itself propagated Trivy→LiteLLM by exactly that mechanism. Every organisation named herein should treat all referenced credentials as compromised and rotate immediately.
2 Key Findings
| 898 COMPROMISED OWNERS |
2,038 REPOSITORIES |
415,427 CAPTURE FILES · 152.5 GIB |
~98% FILES W/ LIVE GITHUB_TOKEN |
AT A GLANCE
|
|||
3 Incident Overview — the Trivy → LiteLLM Attack Chain
This is a chained software-supply-chain attack attributed to TeamPCP, delivering the “SANDCLOCK” credential-stealer. A trusted, widely-used security tool — the Trivy GitHub Action — was backdoored; because thousands of organisations' CI pipelines auto-install Trivy, the poisoned Action executed inside their GitHub Actions runners and swept every secret in reach. The uniform 127.0.0.1.txt captures in this archive are the stealer's per-run loot files.
| # | Stage | Detail |
| 1 | Backdoor the tool | TeamPCP compromised the Trivy GitHub Action ( aquasecurity/trivy-action ) on 19 Mar 2026 |
| 2 | Propagate via CI | LiteLLM's CI (and 898 owners' pipelines) auto-installed the poisoned Trivy Action |
| 3 | Steal publishing tokens | The Action exfiltrated LiteLLM's PyPI publishing tokens |
| 4 | Poison the package | Malicious litellm==1.82.7 / 1.82.8 published to PyPI on 24 Mar 2026 |
| 5 | Harvest on every runner | SANDCLOCK escalated to root; dumped printenv, .env, SSH keys, cloud creds, K8s tokens and in-memory secrets from /proc/<pid>/mem |
| 6 | Exfiltrate | Per-run secrets written to <ts>_127.0.0.1.txt and aggregated into this ~152.5 GiB victim archive |
The chain is corroborated by this dataset: the backdoored aquasecurity/trivy-action appears directly in the affected-repository manifest, the captures are GitHub Actions-scoped (system.github.token in ~98% of files), and runner identifiers reference actions-runner-controller (arc-prod-…-runner) and GitHub-hosted runners — matching the reported self-hosted + hosted CI footprint.
Why GITHUB_TOKEN matters. Every GitHub Actions job receives an automatically-generated GITHUB_TOKEN with write scope to its repository. Harvested at scale (415k+ runs), these tokens — even though short-lived — provide a wide, time-boxed window to push code, publish packages, alter releases and read repository secrets, which is precisely how supply-chain compromises cascade to downstream consumers.
4 Acquired Dataset — Scope & Structure
The archive expands to a single extracted/ directory of 415,427 timestamped .txt capture files (manifest: tree.txt). Files are small on average (median 418 B) but 197,410 exceed 50 KB, with the largest ~30 MB — the size split reflects minimal beacons/empty runs versus full secret-bearing captures. Captures concentrate on 19–20 March, taper on the 22nd, and resurge on 23–24 March.
| Attribute | Value |
| Archive | supplychain_victims.tar (152.5 GiB / 163.78 GB) |
| Structure | extracted/ → 415,427 × *.txt |
| Naming | <date>_<time>_<µs>_127.0.0.1.txt |
| Record format | "<name>":{"value":"<secret>","isSecret":true} |
| Capture window | 19 Mar 2026 – 24 Mar 2026 |
| Per-day counts | 19th: 129,633 · 20th: 111,209 · 22nd: 7,975 · 23rd: 82,228 · 24th: 85,480 |
| Sample analysed | 1,073 files (partial recovery) → 2,146 secret records |
5 Captured Secrets — Composition
Across the 1,073-file sample, Resecurity enumerated 2,146 secret records by key name (values never inspected beyond structural masking). The composition is overwhelmingly GitHub CI-CD identity material, with a long tail of high-value cloud and registry credentials.
| Secret type (key name) | Sample count | Impact |
| system.github.token / github_token | ~2,100 | Repo-scoped write (push/publish/release) during run |
| GH_ACTIONS_APP_PRIVATE_KEY / *_APP_ID | 24 | GitHub App identity — persistent org/repo access |
| GH_PAT / GIT_TOKEN / QS_/FKT_ tokens | 10 | Personal/registry tokens — durable access |
| AWS_* / WORKLOADS_DEV_AWS_* / role | 6 | AWS account access (keys, assumed roles) |
| GCP_SERVICE_ACCOUNT / WIP / Firebase | 3 | GCP/Firebase project access |
| ECR_REPOSITORY_URI / *_WEBHOOK_URL | 3 | Registry push targets; CI webhook abuse |
| SSH_KEY / SIGNING_PASSWORD | 2 | Host access; artefact code-signing abuse |
6 Evidence — Redacted Capture Sample
Real captured records are reproduced below with secret values masked — the real type prefix and final characters are retained (start******end) while all entropy is removed, so the exhibit is authentic yet discloses no usable credential. Key names and non-secret structure are unmodified. Values are drawn from actual sample files.
EXHIBIT A — REAL CAPTURE RECORDS (VALUES MASKED) · *_127.0.0.1.txt
"github_token": {"value":"ghs_**********9wDB", "isSecret":true}, // 40-char GH Actions token
"system.github.token": {"value":"ghs_**********9wDB", "isSecret":true},
"GH_ACTIONS_APP_ID": {"value":"2*****0", "isSecret":true},
"GH_ACTIONS_APP_PRIVATE_KEY":{"value":"----**********--","isSecret":true}, // 1,702-char RSA key
"GH_PAT": {"value":"gith**********BfpL", "isSecret":true}, // 93-char PAT
"AWS_ROLE_TO_ASSUME": {"value":"arn:aws:iam::26******39:role/GithubAutomationPrisma…","isSecret":true},
"WORKLOADS_DEV_AWS_ACCESS_KEY_ID":{"value":"AKIA**********5ED","isSecret":true},
"ECR_REPOSITORY_URI": {"value":"07******86.dkr.ecr.us-gov-west-1.amazonaws.com/****","isSecret":true},
"GCP_SERVICE_ACCOUNT": {"value":"gcp-****@felix-shared-services.iam.gserviceaccount.com","isSecret":true},
"JFROG_AUTH_TOKEN": {"value":"eyJ2**********hxiw", "isSecret":true}, // 759-char JWT
"SECURITY_CI_ERRORS_WEBHOOK_URL":{"value":"https://hooks.slack.com/****","isSecret":true},
"SIGNING_PASSWORD": {"value":"xJRp**********EHL6", "isSecret":true}
Handling caution. Masking retains only a non-usable prefix/suffix; the real archive holds live tokens and private keys in full. Handle it as active credential material — stored encrypted, access-logged, never re-shared. Treat every referenced secret as compromised and rotate it.
7 Affected Organisations & Repositories
Victim manifests (owners.txt, repos.txt) enumerate 898 distinct compromised GitHub owners across 2,038 repositories. The distribution is long-tailed: 631 owners have a single affected repo, while the most-affected owner (Cencosud-Cencommerce) has 64. Critically, the owner list includes major global enterprises and regulated organisations.
7.1 Notable named organisations (verified in owners/repos manifests)
| Organisation | Sector | Example repository (owner/repo) |
| Microsoft | Technology | microsoft/fabric-terraform-quickstart |
| Microsoft Azure | Cloud | Azure/karpenter-provider-azure |
| IBM | Technology | IBM/mcp-context-forge |
| NVIDIA | Technology | NVIDIA/garak |
| FedEx | Logistics | FedEx/* |
| John Deere | Manufacturing | JohnDeere-Tech/* |
| TomTom | Technology / maps | tomtom-internal/trivy-scan |
| PayPal (Zettle) | Fintech | PayPal-Zettle/tf-modules |
| Deloitte | Professional svcs | Deloitte-ConvergeConsumer/*, Deloitte-UK-Converge/* |
| Bosch | Industrial / IoT | bosch-energy-manager/hc-emma-backend |
| S&P Global | Financial data | spglobal-innersource/* (16 repos) |
| Elevance Health | Healthcare | ACT-ElevanceHealth-Sydney-Modernization/monorepo |
| 84.51° (Kroger) | Retail / data | 8451LLC/stratum-auto-insights-poc |
| Adeo (Leroy Merlin) | Retail | adeo/* (20 repos) |
| Kärcher | Industrial | karcher-digital/* (36 repos) |
| Dräger | Medical devices | DraegerSoftwareDevelopment/* (16 repos) |
| ID.me | Identity verification | IDme/* (23 repos) |
| Cencosud | Retail (LatAm) | Cencosud-Cencommerce/* (64 repos) |
| 1inch | Crypto / DeFi | 1inch/fusion-solana-resolver |
Note. Owner names are reproduced from the leak's own manifests to enable defensive notification; they indicate that a repository under the owner was implicated in the harvest and do not, by themselves, establish the depth of each organisation's exposure. Each named owner should independently verify via build-log forensics. The presence of Microsoft, healthcare (Elevance), financial-data (S&P Global), identity (ID.me) and a US GovCloud tenant materially raises the campaign's severity and notification urgency.
7.2 Cloud tenants & secret-scoped identifiers (from sample)
Beyond owner names, capture values embed cloud identifiers pinpointing specific tenants:
| Indicator (from sample) | Type | Affected entity / tenant |
| GHAPP_VASION_READ_REPOS_APP_* | GitHub App (org-scoped) | Vasion |
| DIAGRID_BOT_APPLICATION_* | GitHub App (org-scoped) | Diagrid |
| …@felix-shared-services.iam.gserviceaccount.com | GCP service account | GCP project “felix-shared-services” |
| projects/455268596916/…/shared-p-wip-github | GCP workload-identity pool | GCP tenant (project 455268596916) |
| 492684252576 / 756016341984 / 833816692833 .dkr.ecr.us-east-1 | AWS ECR (account IDs) | 3× AWS tenants (us-east-1) |
| 071032557399.dkr.ecr.sa-east-1 | AWS ECR (account ID) | AWS tenant (South America) |
| 073638633986.dkr.ecr.us-gov-west-1 | AWS GovCloud ECR | AWS GovCloud tenant (US-Gov) |
| QS_ / FKT_ / LOCO_ prefixes | Org-scoped secret names | Additional unattributed tenants |
7.3 Affected owners — sample (45 of 898, by repository count)
| Owner (repos) | Owner (repos) | Owner (repos) |
| Cencosud-Cencommerce (64) | karcher-digital (36) | alianza-dev (29) |
| BuiltTechnologies (26) | cais-group (25) | Wynshop (24) |
| IDme (23) | mcp-servers (22) | adeo (20) |
| YAtechnologies (20) | emma-platform (19) | NSXBet (19) |
| apkappa-pal (18) | spglobal-innersource (16) | GumGum-Inc (16) |
| DraegerSoftwareDevelopment (16) | uneycom (15) | sc-soluciones (15) |
| risk-bsy (15) | greenqloud (15) | PrinterLogic (15) |
| FedEx (15) | mntv-ds (14) | Multiplier-Core (14) |
| liebherr (13) | VectraAI-Engineering (13) | EAS-Test (13) |
| tarkenag (12) | siloamhospitals (11) | guestyorg (11) |
| energypool (11) | CHECK24 (11) | corp-ais (10) |
| bengo4com (10) | agriness-team (10) | timescale (9) |
| qc (9) | leasebase (9) | datavisyn (9) |
| VFGroup-VBIT (9) | ThryvLabs (9) | IT-GAIA (9) |
| GitHub-EDP (9) | Deloitte-ConvergeConsumer (8) | DTS-GDA-BI-Platform (8) |
7.4 Affected repositories — sample (30 of 2,038)
| Repository (owner / repo) | Repository (owner / repo) |
| aquasecurity/trivy-action | reviewdog/action-trivy |
| microsoft/fabric-terraform-quickstart | Azure/karpenter-provider-azure |
| IBM/mcp-context-forge | NVIDIA/garak |
| FedEx/eai-3531981-cdb-customer-service | FedEx/eai-3535360-yos-ui |
| JohnDeere-Tech/change-request-api | JohnDeere-Tech/isg-dc-data-import-tool-server |
| tomtom-internal/trivy-scan | PayPal-Zettle/tf-modules |
| Deloitte-ConvergeConsumer/AgenticGateway | Deloitte-ConvergeConsumer/CustomerGrowth |
| bosch-energy-manager/hc-emma-backend | spglobal-innersource/capitaliq-foundation |
| 8451LLC/stratum-auto-insights-poc | adeo/DP4P-Product-Event-Fusion |
| 1inch/fusion-solana-resolver | 1inch/ts-nestjs-modules-lib |
| IDme/account-api | IDme/anaconda |
| DraegerSoftwareDevelopment/OSS-app-cockpit | adeo/cc--bigquery-scheduled-queries |
| karcher-digital/kap-ak-b2bec-cluster-config | karcher-digital/kap-ak-b2bec-infrastructure |
| Cencosud-Cencommerce/be-easy-cl-ccom-promotions | Cencosud-Cencommerce/Liquibase-Redshift |
| Azure/dalec-build-defs | spglobal-innersource/cess-atlassian-tools-foundation |
Rows 1 above (aquasecurity/trivy-action, reviewdog/action-trivy) are the poisoned build-tooling repositories at the root of the chain; the remainder are victim repositories whose CI executed the backdoored Action. Full lists: 898 owners / 2,038 repositories.
Coverage & method note. The owner/repository counts (898 / 2,038) are taken from the leak's own victim manifests and are authoritative for this dataset. Cloud-tenant identifiers and the secret-type composition are derived from the recovered 1,073-file sample (~0.26% of captures); a complete per-secret and per-tenant extraction requires parsing the full ~152.5 GiB archive. Resecurity can produce that comprehensive mapping if provided the full extracted set.
8 Impact & Risk Assessment
| Risk dimension | Severity | Rationale |
| Second-order supply-chain propagation | CRITICAL | Stolen push/publish tokens (GITHUB_TOKEN, App keys, registry tokens) enable poisoning of downstream packages/artefacts |
| Source-code & CI-CD compromise | CRITICAL | Write access to repositories and pipelines; secret exfiltration and workflow tampering |
| Cloud-account takeover | CRITICAL | AWS (incl. GovCloud), GCP and Firebase credentials enable lateral movement and data access |
| Container-registry poisoning | HIGH | ECR/JFrog tokens allow malicious image push consumed by production |
| Code-signing abuse | HIGH | Signing passwords enable trusted-artefact forgery |
| Persistent access | HIGH | GitHub App private keys and PATs outlive the ephemeral GITHUB_TOKEN |
| Government-tenant exposure | HIGH | US GovCloud account present — elevated regulatory/national-security sensitivity |
9 Attribution & TTPs (MITRE ATT&CK, assessed)
Assessed from dataset structure and public reporting of the associated campaign; not confirmed victim telemetry.
| Tactic | Technique (ID) | Relevance |
| Initial Access | T1195.001/.002 Compromise Software Dependencies & Tools | Backdoored Trivy GitHub Action auto-installed by victim CI; poisoned litellm PyPI package |
| Privilege Escalation | T1068 Exploitation for Priv-Esc | SANDCLOCK escalated to root on compromised runners |
| Execution | T1059 Command & Scripting (CI runner) | Malicious code runs inside CI/CD job context |
| Credential Access | T1552.001/.007 Unsecured Credentials (files, CI/CD env & tokens) | Reads process env, mounted secrets, GITHUB_TOKEN |
| Collection | T1114 / T1530 local capture | Writes secrets to local 127.0.0.1 capture files |
| Exfiltration | T1567 Exfiltration Over Web Service | Capture files aggregated and exfiltrated to actor storage |
| Impact | T1195 downstream poisoning; T1657 Financial Theft | Enables second-order supply-chain attacks and cloud abuse |
10 Indicators & Detection Guidance
| Type | Value / guidance |
| Artefact naming | <YYYYMMDD>_<HHMMSS>_<µs>_127.0.0.1.txt on CI runners / build hosts |
| On-host indicator | Unexpected local files enumerating environment secrets during a build |
| Record signature | "<name>":{"value":"…","isSecret":true} secret-store dumps written to disk |
| Capture window | 19–24 March 2026 (align build logs to this window) |
| Hunt — GitHub | Anomalous GITHUB_TOKEN/App activity: unexpected pushes, package publishes, release edits, secret reads |
| Hunt — cloud | Unusual AWS (incl. GovCloud) / GCP / Firebase API use from CI IPs; new ECR image pushes |
| Hunt — registry | Unexpected JFrog/ECR pushes or auth from unfamiliar sources |
11 Recommendations
▪ Immediate (0–72 hours)
- Rotate everything referenced. Revoke/rotate GitHub App private keys, PATs, AWS/GCP/Firebase credentials, ECR/JFrog tokens, SSH keys and signing passwords; invalidate sessions. Ephemeral GITHUB_TOKENs expire, but persistent secrets exposed alongside them do not.
- Audit for supply-chain propagation. Review repository push history, package/registry publishes and release edits during 19–24 Mar 2026; verify downstream artefact integrity and pin/verify dependencies.
- Identify the malicious component. Examine CI/CD build logs for the trojanised dependency/Action; remove and block it; rebuild from known-good sources.
- Notify affected tenants & authorities. Prioritise the GovCloud tenant and any regulated data; engage cloud providers and, where applicable, collaborate with national CERTs.
- Contain cloud blast radius. Constrain OIDC/workload-identity trust, tighten IAM role conditions, and enable anomaly alerting on the implicated accounts.
▪ Short term (2–6 weeks)
- Adopt short-lived, least-privilege CI secrets (OIDC federation over static keys); scope GITHUB_TOKEN to read-only by default and elevate per-job.
- Enforce dependency pinning, provenance/attestation (e.g. build SLSA), and allow-listing of Actions; isolate runners.
- Deploy secret-scanning and push-protection across repos and registries; add DLP on runners to detect local secret-dump files.
- Establish continuous dark-web/leak monitoring for organisation tokens and cloud identifiers.
12 About Resecurity & Disclaimer
Resecurity is a cybersecurity and threat-intelligence company providing dark-web monitoring, digital-risk protection and CTI services to enterprises and government organizations. This report was produced by the Resecurity HUNTER threat-intelligence unit.
Provided for defensive, situational-awareness and victim-notification purposes only. Findings derive from analysis of the attacker's victim archive and its manifests, correlated with published incident reporting on the LiteLLM / TeamPCP (“SANDCLOCK”) supply-chain attack; the attack-chain narrative reflects that public reporting.
Resecurity has not reproduced any live credential: all exhibits show real captures with secret values masked (start/end retained, entropy removed). Owner/repository counts (898 / 2,038) are taken from the leak manifests; per-secret and per-tenant details derive from the recovered 1,073-file sample. Organisation identifiers are surfaced solely to enable defensive notification; named entities are victims of a criminal supply-chain compromise and no fault is implied. Nothing herein is legal advice.