LiteLLM Hacked Twice in 2026: March vs October

Two malicious LiteLLM releases in 2026 came through different doors. A dated comparison, and what an AI app builder can pin, lock and rotate.

Timothy Lindblom

Founder, Newly

Published Last updated

LiteLLM, an open-source gateway many AI apps use to reach model providers, shipped malicious releases twice in 2026. In March a stolen PyPI token, traced to a compromised security scanner in CI, published two bad versions. On October 21 version 1.107.0 came from LiteLLM's own release pipeline. Datadog says no link between them is established.

What happened in March, and what happened in October?

DetailMarch 2026October 2026
Bad versions1.82.7 and 1.82.81.107.0, plus four Docker tags
Live windowMarch 24 from 10:39 UTC. LiteLLM says about 40 minutes; PyPI counts 2 hours 32 minutes from upload to quarantineOctober 21. PyPI 11:39 to 13:23 UTC; Docker Hub 11:46 to 14:20 UTC; GHCR 11:46 to 13:51 UTC
How it was publishedUploaded straight to PyPI, bypassing the official CI workflowThrough LiteLLM's release workflow, edited to point at a lookalike repository
Stated causeA PyPI token exposed through the Trivy scanner used in CIThree developer credentials abused; how the attacker entered an exposed internal deployment is not confirmed
What it ranA credential stealer in a .pth startup fileA credential stealer that runs whenever Python starts, plus a second stage
RecordGHSA-5mg7-485q-xm76, no CVE assignedLiteLLM report, last updated October 21 at 20:30 UTC

The March facts come from LiteLLM's March update, the GitHub advisory and PyPI's incident report, which says the package was downloaded about 119,000 times in its window. The October facts come from LiteLLM's own report, which is a vendor account. At our check on October 24, 2026 its blog showed no later post, and the fix LiteLLM says goes public on October 27 had not appeared.

How did the two attacks actually differ?

Two attack chains. March: a compromised CI scanner exposed a PyPI token, which was used to upload two bad versions. October: an exposed internal deployment held tokens in its logs, a release workflow was changed, and version 1.107.0 was published.March 2026CI security scannerwas compromisedA PyPI tokenwas exposedUpload straightto PyPI1.82.7 and1.82.8 liveOctober 2026Internal deploymentexposed to internetTokens foundin its logsRelease workflowpointed elsewhere1.107.0 and Dockertags publishedSource: LiteLLM reports and GitHub advisory, see the source list. The October entry route is not confirmed by LiteLLM.

In March the weak point was a tool that ran inside the build. The Trivy scanner's GitHub Actions had their version tags rewritten to point at credential-stealing code, which Aqua's advisory records as 76 of 77 tags in one action (CVE-2026-33634). Microsoft's write-up lists what such a job can expose: cloud keys, database strings, SSH keys and pipeline secrets. LiteLLM says the attacker then uploaded to PyPI directly.

In October the report describes people and infrastructure instead. LiteLLM believes the attacker took tokens from the logs of an internal LiteLLM deployment that was open to the internet, a privileged developer credential overrode branch protections, and the production workflow was pointed at a lookalike repository. The official source tag stayed clean, so reading the repository would not have shown the problem. LiteLLM suspects, but has not confirmed, a recently patched vulnerability as the way into that deployment.

What the two share is the target. A gateway sits next to every provider key, so a bad release runs where the secrets are. Datadog lists cloud credentials, developer keys, AI tool tokens and proxy secrets as targets of the October code.

Does either incident reach my app?

Newly builds a real iPhone and Android app with React Native and Expo. The JavaScript bundle on a phone does not include a Python package, so the app itself is not where LiteLLM would run. Look at what sits behind it: a backend, an AI gateway you host, CI, scripts and any laptop that installs packages for the project. Newly lets you download your code or connect your own repository, so the lockfiles are yours to read.

  • Search every repository for litellm in requirements files, lockfiles and Dockerfiles.
  • For each hit, find the date the version was last installed and compare it with the windows in the table above.
  • For containers, find the digest the running image started from. A tag such as latest is not an answer.

If a host did run a bad version, treat everything it could read as taken, rotate it at each provider and rebuild instead of cleaning. Our pages on the October incident and rotating app secrets cover the steps, and red.run.cloud has a guide to rotating secrets after a breach.

What would have limited the damage each time?

ControlHelps in MarchHelps in OctoberHow to check yours
Lockfile with hashesYes, if locked before March 24Yes, if locked before October 21--require-hashes in your install step
Install delay of a few daysYes, the window was hoursYes, the window was hoursA cooldown setting in your installer
Image pinned by digestNot the causeYes, the Docker tags were moved to the bad image@sha256: in the image reference
Actions pinned to a commit SHAYes, tags were rewrittenNot the stated causeA 40-character hash after each @ in workflow files
Short-lived publishing identityYes, a long-lived token was the problemPartly. The report describes workflow and branch rules being overriddenTrusted Publisher set up in the PyPI project settings
Gateway kept off the public internetNoYes, LiteLLM says an exposed deployment was the routeTry the admin address from outside your network

Each row rests on vendor documentation. pip's hash-checking mode uses hashes in your requirements file to catch tampering. GitHub advises pinning actions to a commit SHA and a read-only default token. PyPI Trusted Publishers swap a long-lived token for one that expires after 15 minutes. PyPI also reported that 40 to 50 percent of installs in the March window were unpinned, and it recommends dependency cooldowns. The windows here ran from under an hour to a few hours, so a delay of a few days would have skipped both. That last point is our arithmetic.

Reading this table

No single control covers both incidents. The table is a map of which door each control closes, based on the causes the vendors state, and LiteLLM has not confirmed the October entry route.

What should I check in my own project this week?

  1. List every place that installs LiteLLM, and the exact version and date of the last install.
  2. Add hashes to the lockfile and move containers from tags to digests.
  3. Replace version tags in your GitHub workflows with full commit hashes and set the default token to read-only.
  4. Check whether any gateway admin page answers from outside your network, and whether its logs contain tokens. Our page on an internal AI gateway on the internet walks through it.
  5. Write down which provider keys a gateway host can read, so rotation takes minutes when the next notice arrives.

The wider list of poisoned packages and actions is in supply-chain attacks on AI and LLM tooling, and the 15-minute app check covers the rest of the app. For the same weeks, the October 2026 security meltdown tracker lists other notices. Back to the security hub.

Where do you stand?

Everything starts as unknown, because an unchecked item is unknown. Move an item to confirmed only when you hold the evidence under it. No scan, ours included, moves a build machine or private container from unknown to confirmed.

Your LiteLLM supply-chain check

  • Detected: You found the problem.
  • Unknown: Not checked yet, or the check could not tell.
  • Confirmed by owner evidence: You checked and kept the proof.
  1. 1. I know every place that installs litellm: backend, gateway container, CI, scripts and laptops.

    Evidence: a list of hosts and repositories with the output of pip show litellm or the lockfile entry.

  2. 2. No place ran 1.82.7 or 1.82.8 on March 24, 2026, or 1.107.0 or its Docker tags on October 21, 2026.

    Evidence: lockfile history, CI logs with install times and the image digest each container started from.

  3. 3. If any host ran a bad version, every secret it could read was replaced at its provider and the old one revoked.

    Evidence: a provider-side list showing the old key revoked and a new key created after the incident date.

  4. 4. Installs use a lockfile with hashes, and containers start from an image digest instead of a moving tag.

    Evidence: the lockfile and the image reference in your deployment config.

  5. 5. Every third-party GitHub Action in my workflows is pinned to a full commit SHA, and the default token is read-only.

    Evidence: the workflow files and the repository's Actions permission page.

  6. 6. Any AI gateway I run is not reachable from the public internet, and its request logs hold no tokens.

    Evidence: the network rule that limits access and a log sample with credentials redacted.

0 detected6 unknown0 confirmed by owner evidence

Your answers stay in this browser tab. Nothing is saved or sent.

Frequently asked questions

Were the March and October incidents the same attack?

Nothing published says so. Datadog wrote on October 21, 2026 that no connection between the two compromises had been established at the time of writing. LiteLLM's October report describes a different chain, with exposed deployment logs and a changed release workflow, and says it hardened its release pipeline after March.

Which LiteLLM versions were malicious?

Two in March: 1.82.7 and 1.82.8. One in October: 1.107.0, plus the Docker tags v1.107.0, latest, main-latest and main-stable during the windows LiteLLM lists. LiteLLM says earlier versions and its private Enterprise release were not affected in October.

I upgraded LiteLLM after each incident. Is that enough?

Upgrading removes the package but not what a process already read. If a bad version ran on a host, rotate every secret that host could read, and rebuild the host or image instead of cleaning it in place. LiteLLM's October report says running pip can re-trigger the startup files.

Does pinning my dependencies fully protect me?

No. A pin to an earlier version or a hash keeps a new bad release from arriving on its own. It does not help if you update during the window, if a pinned file was already bad, or if a secret has been exposed through another route. Pinning narrows the chance, and rotation limits the damage.

My app is an Expo app on a phone. Why is this my problem?

The app bundle on the phone does not contain a Python package. The problem is any server, gateway, build machine or script behind the app that installs LiteLLM. Those hold your provider keys, so check them and your lockfiles.

Sources

Each source was opened and checked on October 24, 2026.

  1. LiteLLM v1.107.0 security incident report, October 21, 2026, LiteLLM
  2. LiteLLM security update, March 2026, LiteLLM
  3. GHSA-5mg7-485q-xm76, two LiteLLM versions published with malware, GitHub Advisory Database
  4. Incident report: LiteLLM/Telnyx supply-chain attacks, April 2, 2026, PyPI blog
  5. GHSA-69fq-xp46-6x23, Trivy ecosystem supply chain compromise, Aqua Security, GitHub
  6. Detecting, investigating and defending against the Trivy compromise, Microsoft Security Blog
  7. LiteLLM supply chain compromise: what you need to know, Datadog Security Labs
  8. Security hardening for GitHub Actions, GitHub Docs
  9. Trusted Publishers, PyPI docs
  10. Secure installs and hash-checking mode, pip documentation

Continue Learning