Science1 distinct publisher3 min readPublished
Datadog's investigation puts genuine PyPI releases of litellm and telnyx inside the same campaign that poisoned Trivy on March 19, which makes the unit of remediation the secrets the build could see rather than the version pin.
The Scientist · Science desk

Compiled by The ScientistSomething wrong?How this is made
The join between these two PyPI projects and the rest of the campaign rests on access rather than on a published payload signature. Datadog's reading is that one operator moved from project to project, siphoning credentials and spending them on the next target, with each stage reusing tradecraft or tokens from the one before it [7]. There is one concrete infrastructure overlap in the write-up: the callback domain from the March 20 npm worm was, by March 22, also serving a Kubernetes script that sorted victims into a destructive and a non-destructive path [15]. Shared infrastructure is decent evidence that stages belong to one operation. It says very little about what any individual victim lost, which is why the response guidance, not the attribution, is the load-bearing part of the report.
The best-documented payload in the campaign is the Trivy stage, and it explains that guidance. The malicious trivy-action and setup-trivy commits dumped Runner.Worker memory, scraped common credential locations, encrypted the results with AES and RSA, and shipped them to a look-alike domain, scan.aquasecurtiy[.]org [10]. When direct exfiltration failed and a usable GitHub token was present on the runner, the code created a public repository called tpcp-docs and uploaded the stolen data there instead [11]. A team that blocked the exfiltration domain and called the matter contained has misread the design, because the fallback leaves through the same service the build already talks to. Uninstalling a version restores the dependency tree without undoing an exfiltration.
Scale, where the report gives numbers. On March 19 the actor force-pushed 76 of 77 aquasecurity/trivy-action tags to malicious commits and replaced all seven setup-trivy tags [8]; that is 98.7% of the action's tags [1]. The npm stage covered 28 packages in @EmilGroup and 16 in @opengov plus three named singletons [12], 47 in total across the scopes listed [2]. The worm resolved which packages each stolen token was allowed to publish, bumped patch versions, and re-fetched the original READMEs so the listings looked untouched [13]. From the first poisoned Trivy release to the telnyx backdoor is eight days [3].
The thing this doesn't tell you is your own denominator. The write-up publishes no install or download counts for the four backdoored versions [4], so exposure has to be rebuilt from your CI logs rather than read off the report. Nor does it state how the maintainer credentials for either PyPI project were obtained [5], which is the fact that would tell a downstream team whether the way in is shut. And the branching in the Kubernetes script is worth holding onto for anyone inclined to read a quiet host as an untouched one: it checked timezone and locale, deleted the filesystem and force-rebooted on systems it judged Iranian [16], and installed persistent backdoor logic on everything else [17].
My view, with its condition attached. If any of those four versions touched a runner, treat every credential that runner could see as burned and rotate on that basis [6]. If the job held nothing beyond a short-lived, narrowly scoped token, the blast radius really is smaller, but that is a claim about your CI hygiene, not about the package.
Ranked by verification strength, evidence, and original report placement.
On March 24, 2026, two PyPI releases of LiteLLM, 1.82.7 and 1.82.8, were published with malicious code as a result of a supply chain compromise; PyPI later quarantined the project.
On March 27, two releases of the telnyx package, 4.87.1 and 4.87.2, were also backdoored.
The affected packages were not fake or typo-squatted uploads but compromises of the real projects: litellm, a widely used proxy layer for LLM providers, and telnyx, a telephony SDK.
Datadog Security Research links the PyPI compromises to a broader campaign that began with the March 19 Trivy compromise, continued with CanisterWorm on npm, and then reached Checkmarx KICS and related artifacts.
Datadog says defenders should treat any host or CI job that installed litellm 1.82.7 or 1.82.8, or telnyx 4.87.1 or 4.87.2, as a full-credential exposure event and investigate for persistence, outbound traffic and Kubernetes activity, not just package presence.
In Datadog's analysis the operator moved from project to project, siphoning credentials and using them to expand the campaign, with each stage reusing access or tradecraft from the one before it.
Distinct publishers with included, body-backed reporting in this cluster.
1 article · August 28, 2026
Follow any of these and your For You feed starts watching them — no settings page required.
security
A misconfigured GitHub Actions workflow handed TeamPCP the token that poisoned five ecosystems1 distinct publisher
security
The 2,500-org compromise was a Trivy problem. LiteLLM was the closing act.1 distinct publisher
build
56 build-pipeline attacks, one vendor's alert queue, and the February jump nobody can attribute yet1 distinct publisher
security
Oligo dates the crew behind ShadowRay 2.0's self-propagating botnet back to 20201 distinct publisher
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
Artifact-dense, single-voiced
The indicators are the strongest part of this: precise versions, the AES-256-then-RSA-4096 scheme, scan.aquasecurtiy[.]org and models.litellm[.]cloud, the tpcp-docs fallback repo, DaemonSet and container names. All of it can be checked against your own lockfiles and egress logs without trusting anyone. What holds the score down is that a single lab supplies every line — no PyPI advisory text, no maintainer post-mortem, no word from Aqua, Checkmarx or Telnyx — and the one question a defender would ask first, how the PyPI accounts were taken, has no answer.
Five ecosystems hit, none of them counted
The footprint is documented as events rather than volumes, and the events are not small: poisoned releases in two registries, 76 of 77 tags rewritten, 47 packages republished under other people's scopes, 44 Aqua repositories renamed, two Checkmarx actions and two OpenVSX extensions turned. But no one has said how many builds actually pulled litellm 1.82.7, 1.82.8, telnyx 4.87.1 or 4.87.2, and PyPI's quarantine is reported without a timestamp. The spread is real; the exposed population is guesswork.
Undersold, mostly by omission
Datadog can name the container that wipes a node and still keeps the flat register of a timeline, and its boldest sentence — treat an install as full-credential exposure — is no more than the catalogue of stolen secrets it documents already implies. The eight-day sweep through five ecosystems arrives without a single superlative. If anything is off, it is that nobody counted the installs, so a reader has no way to feel how large this was; the language sits slightly below the facts rather than above them.
Threat research about three rivals' pipelines
Datadog sells exactly the monitoring and cloud-security tooling this story argues you need, and every victim it walks through — Aqua's Trivy, Checkmarx's actions and extensions, an LLM proxy, a telephony SDK — belongs to someone else. That does not weaken the indicators, which anyone can test, but it does explain the shape: a campaign narrative and a hunting checklist, with no accounting of whether Datadog's own pipelines consumed any of the poisoned artifacts and no space given to the affected vendors' side of it.
Trust the indicators, hold the scope
Two different things are being assessed here. The checkable parts — versions, domains, tags, container names — deserve high confidence because they are locally testable and internally consistent across stages, right down to the repeated public-repo fallback appearing as tpcp-docs and then docs-tpcp. The interpretive parts — one operator, this ordering, this entry into PyPI — rest on a single lab's telemetry with no corroborating account and one unexplained step, which is where the reservation sits.