Credential Density Was The Targeting Function
Signature checks, SBOM diffing and vulnerability scanners all passed clean through this campaign, which is why rotation scope — not patch speed — is the decision in front of you.
Risky.Biz places the compromised releases of Trivy, KICS, LiteLLM and Telnyx in a January-to-August 2026 exposure window. The Hacker News dates the Trivy and Checkmarx compromise to March 2026. That disagreement is the rotation window, and the two accounts do not overlap cleanly. Neither states the entry vector per project. Trivy ships as a Go binary and container image rather than a language-registry package, so compromised release automation is at least as plausible as a stolen registry account. Treat January 2026 as the start date until a per-project advisory narrows it.
The worm never touched the artifact layer. It waited for install on a developer machine, stole stored credentials, then republished itself into other libraries the same maintainer owned. The release is signed by the real publisher and the SBOM version checks out, so no scanner has a CVE to match. The attack traverses the human trust graph while almost every supply-chain control on the invoice watches artifacts.
| Kill chain stage | Control that breaks it | Control that does not |
|---|---|---|
| Delivery of a signed release | Delayed-adoption quarantine on new versions | Signature verification, SBOM diffing |
| Activation at install time | Install-script disablement, hermetic offline resolution | Static dependency scanning |
| Credential theft | Short-lived OIDC federation, per-job token scoping | Repo secret scanning |
| Exfiltration | Default-deny egress with proxy allowlist | Endpoint AV on the runner |
| Self-propagation | Publish only from a hardened CI identity | 2FA on the registry account alone |
The two exploited bugs sitting in the same blast radius
Gitea CVE-2026-60004 is the same mechanism from the other side. An attacker with repository write access, from a leaked PAT or an over-permissioned bot, posts a malicious patch to the diffpatch endpoint. Gitea writes an executable file into the repo's hooks directory, and the next matching Git operation runs it as the Gitea service account. That account holds every repo on disk plus webhook secrets, runner registration tokens and usually registry push credentials. Admin is never required. SANS is explicit that upgrading does not remove hooks already planted, so the order is patch, diff every hooks directory against defaults, rotate.
The MLflow SSRF is the ML-platform variant, and it sits next to an ISC diary on mass scanning for cloud metadata services. Read together, the chain closes: reach an unauthenticated tracking server inside the VPC, coerce it into fetching 169.254.169.254, collect the instance-profile credentials it carries for artifact-store access. IMDSv2 with hop limit 1 and default-deny egress break that chain on an unpatched tracking server. The work lands in the metadata service config and the subnet egress rules.
Two arrests closed the case in Western Australia, but the stolen credentials still authenticate and the planted hooks still execute, so rotation and hook diffing are still owed.
The move
Sources agree on the sequence and disagree only on scope. The Hacker News makes the sharpest structural point: OIDC-federated short-lived credentials need no rotation at all, which is the argument for the migration that keeps getting deferred. The rest is mechanical. Runners get destroyed per job, sub-hour OIDC tokens replace every static secret, and scanners run in a separate job with no deploy credentials and egress limited to the vulnerability-database endpoints. Pin scanner images by SHA256 digest while in there, because aquasec/trivy:latest inside a job holding a cloud role is the exact configuration this campaign was designed against.
What to do
Rotate every long-lived credential readable from a CI runner or developer workstation between January and August 2026 — registry tokens, static cloud keys, PATs, model-provider keys, webhook secrets — starting with jobs that invoked Trivy or KICS.
Patch self-hosted Gitea past CVE-2026-60004, then diff every repository's .git/hooks against defaults and rotate the Gitea service account's runner tokens and registry credentials before Friday.
Front every MLflow tracking server with authentication and enforce IMDSv2 with hop limit 1 plus default-deny egress on all ML infrastructure this sprint.