1. Red
  2. Learn
  3. Other incidents

LiteLLM 1.107.0 compromised: are you affected, what to do

LiteLLM 1.107.0 was compromised on 21 October 2026. Which PyPI and Docker artifacts, how to check, how to remove the startup files, and which secrets to rotate.

By Alexander Gusev, run.cloudPublished 28 October 20269 min readHow we check facts
On this page
  1. Who is affected by the LiteLLM 1.107.0 compromise?
  2. Why is "I deleted the package" not enough?
  3. How do I remove it and rotate?
  4. Am I affected?
  5. Was anything exploited?
  6. What is still moving?
  7. How do I stop the next one from reaching me?

LiteLLM says version 1.107.0, published to PyPI, Docker Hub and GHCR on 21 October 2026, carried credential-stealing malware. It says earlier versions were unaffected. If that version was ever installed on a host with outbound internet, LiteLLM says to assume the exfiltration succeeded. Rebuild the environment from scratch, pin 1.106.2 or another earlier release, and rotate every secret that host could read.

FactDetailSource
WhatMalicious litellm 1.107.0 wheels and container images that steal credentials and load remote-code toolingLiteLLM report
CVENone cited by the vendor at our check on 24 October 2026LiteLLM report
PyPI windowAll seven wheels of litellm==1.107.0, 11:39:51 to 13:23 UTC on 21 OctoberLiteLLM report
Docker Hub windowv1.107.0, latest, main-latest, main-stable, 11:46:56 to 14:20 UTCLiteLLM report
GHCR windowSame tags for litellm, litellm-database, litellm-non_root, 11:46:56 to 13:51 UTCLiteLLM report
Not affected (vendor)All earlier versions, the private enterprise registry, and the official v1.107.0 source tag on GitHubLiteLLM report
Earlier version to pin (vendor)litellm==1.106.2 or any explicit version published before the incidentLiteLLM report, Datadog
ExploitationVendor-claimed theft of credentials by the malware. No primary source naming victims or abuse of stolen credentials at our check on 24 October 2026LiteLLM report
StatusPage status line "Incident contained"; 23 October, 21:50 UTC update says the attack-chain investigation is completeLiteLLM report
Checked24 October 2026 (page header last updated 21 October, 20:30 UTC). Re-read on 28 October 2026: no newer dated update in the report or the root-cause record, and PyPI lists no 1.107.0 filethis page

Who is affected by the LiteLLM 1.107.0 compromise?

Anyone whose environment installed litellm==1.107.0, or ran an image whose digest matches one LiteLLM lists. The tag name alone does not decide it, because LiteLLM scopes the images by digest and by time window. That includes laptops, CI runners, build caches and servers, not only the machine running the proxy.

The group most at risk is anyone who installs without a pinned version or lockfile, or who deploys from a mutable tag such as latest. LiteLLM says anyone who ran an unpinned pip install or pulled the listed tags in those windows should assume compromise. LiteLLM says the packages were removed from PyPI and the tags repointed or made unavailable, but its report does not address cached or mirrored copies. Its remediation applies if 1.107.0 was installed on a host with outbound internet, so a host that installed it from a cache after the window is still in scope (at our check on 24 October 2026).

You are not affected by this incident if you can show that no machine of yours ever installed 1.107.0 or ran an image with one of the listed digests. Section "Am I affected?" below says what that evidence looks like.

Why is "I deleted the package" not enough?

This is the trap. The malware did not rely on running code when you imported LiteLLM. LiteLLM reports that the release added cook.pth and sitecustomize.py to the Python environment, and that any Python start in that environment runs them again, including running pip. Python's own documentation says import lines in .pth files are executed at start-up and that a sitecustomize module is imported automatically. Datadog adds that deleting the litellm package directory does not remove these files.

Two consequences follow:

  1. Uninstalling or downgrading does not undo anything. The files stay, and so does anything the malware already sent out.
  2. Running pip uninstall in the affected environment starts Python, which can run the malware again. Isolate first.

Also keep the scope in proportion. The report says the official source tag was not modified and the malicious files were in the published artifacts. It does not say every LiteLLM version, the source code or enterprise customers were affected.

How do I remove it and rotate?

The steps below follow LiteLLM's remediation list, cross-checked against Datadog's. LiteLLM lists deleting the files and reinstalling a pinned version, and says rebuilding images and virtual environments from scratch is better. Datadog's advice is to revert to 1.106.2, remove everything tied to 1.107.0 and rotate from a clean machine. We lead with the rebuild because deleting files by hand can miss whatever you did not know to look for. The two sources agree on the rotation.

How do I clean up if I run LiteLLM myself?

  • Isolate the host or runner from the network, and do not run python or pip in the affected environment yet.
  • Per LiteLLM: delete cook.pth, cook.py, sitecustomize.py and the matching __pycache__ bytecode from every affected site-packages.
  • Per LiteLLM: stop the detached Python process that holds /tmp/remote_code_loader.lock.
  • Rebuild virtual environments and images from scratch rather than patching them. Pin litellm==1.106.2 or another explicit release from before the incident, ideally with hashes. If you run a proxy with an Enterprise license, pin 1.106.5 or the patched release for your branch instead (see "What is still moving?").
  • From a trusted computer, rotate (see AWS on access keys) the instance or task IAM role, every provider key stored in the LiteLLM database, the LiteLLM master and virtual keys, the DATABASE_URL password, and every secret in the environment of any process on the host.
  • Per LiteLLM: in AWS CloudTrail, look for GetCallerIdentity from the instance role around install time, then for the role's credentials being used from outside your infrastructure. Do the same in your other providers' logs.
  • Redeploy dependent services with the new secrets and confirm the old ones are revoked at the provider, not just removed from your config.

What if someone else runs LiteLLM for me?

Send them this and keep the answer:

Was litellm==1.107.0 ever installed in any environment that runs or builds our service, or did any of them run a LiteLLM image whose digest matches one in LiteLLM's incident report (Docker Hub, or the GHCR indexes for litellm, litellm-database and litellm-non_root)? Please include copies pulled from a cache or mirror. Please name the lockfile, image digest or pull log that shows it, say whether the environment was rebuilt from scratch, and list which of our keys and secrets were reachable from it and when each was rotated.

If the answer is "we do not know", that is the unknown state below. Rotate what you control.

What do the indicators look like?

For hunting only: the file names above, litellm-1.107.0.dist-info in site-packages, the lock file /tmp/remote_code_loader.lock, and network traffic to the lookalike domain litellm[.]dev that Datadog lists. LiteLLM says finding one of these confirms exposure and that not finding one does not prove the environment was never exposed.

Am I affected?

Am I affected? Where you stand right now

This is a supply-chain incident. Whether it reached you depends on whether any of your machines ever installed 1.107.0, which no outside scan can see.

  1. Detected You find cook.pth, sitecustomize.py or litellm-1.107.0.dist-info in site-packages, or a lockfile or log shows 1.107.0, or a container ran an image digest that LiteLLM lists as compromised. Look for the files by listing the directory, not by starting Python or pip, which would run the malware again. Treat the host as compromised. Isolate it, rebuild it, and rotate everything it could read.
  2. Unknown You install LiteLLM unpinned or from the latest tag, and you cannot show which version each machine ever resolved, including from caches and mirrors after the original windows. This is the common case. Look at lockfile history, CI logs, registry pull logs and image digests. If they are missing, rotate the secrets those machines could read anyway.
  3. Confirmed by owner evidence A lockfile, build log or registry record shows an earlier version, or an image digest matching none of the compromised digests LiteLLM lists (Docker Hub and all three GHCR indexes), was the only thing installed or pulled. Nothing in this incident points to your host. Keep the pin and consider hash pinning.

No scan, ours included, moves you from "unknown" to "confirmed". Our free scan reads what a site serves to the internet. It cannot see which Python packages sit on a server or in a CI runner, so it cannot answer this question.

Was anything exploited?

At our check on 24 October 2026, two primary sources describe the malware. LiteLLM states that it steals credentials and loads remote-code execution tools. Datadog Security Labs analysed the artifacts itself and describes a credential stealer plus a backdoor that polls a GitHub-hosted file hourly for further code. Datadog says that file only held test values, so it observed no further malicious code delivered in the wild. No primary source we found names a victim or reports stolen credentials being used against anyone. The lack of a public report says little about what happened. If the malware reached your host, assume your secrets left it.

How the attackers got in comes from the maintainer alone. Datadog relies on LiteLLM's account for the release mechanics and says it was not yet clear how the credentials were first compromised. LiteLLM's 21 October report said it had not confirmed how the attacker reached its internal deployment. Its update of 23 October, 21:50 UTC says the investigation into the attack chain is complete, and its root-cause record dated 23 October 2026 says a master key for an internal alpha service was committed to a public repository on 27 May and never revoked. On 10 October it was used against that service's API, which returned the GitHub CLI token of an organisation owner. On 21 October that token was used to disable branch protection on the release repository and to dispatch a build from a lookalike fork whose commit exists only there. The record says the first post's suspicion about logs was corrected. Treat all of this as the maintainer's account.

What happened, hour by hour?

All times are UTC, from the maintainer's root-cause record and incident report, at our check on 24 October 2026.

WhenEvent
27 MayMaster key for an internal service committed to a public repository, not revoked
10 OctoberKey used; an organisation owner's GitHub token returned
21 October, 10:08 to 10:46Branch protection disabled; staging build dispatched from a lookalike fork
21 October, 11:39:51 to 11:40:13Seven litellm==1.107.0 wheels uploaded to PyPI
21 October, 11:46:56Docker Hub and GHCR images published under the four tags
21 October, 13:23PyPI window closes
21 October, 13:51GHCR tags unavailable
21 October, 14:20Docker Hub latest repointed to verified clean artifacts

A fork commit can be served under the parent repository's URL, as GitHub documents for forks. That is how a clean official source tag and a malicious build can both be true.

What is still moving?

ItemStatus at our check on 24 October 2026Where to re-check
InvestigationHeader last updated 21 October 20:30 UTC. A later update of 23 October, 21:50 UTC says the attack-chain investigation is complete and links a root-cause record. LiteLLM says its earlier status posts were left as a record and some assumptions in them proved inaccurate or incompleteLiteLLM report
Embargoed vulnerability fixLiteLLM said its enterprise registry distributes an embargoed fix, with disclosure scheduled for 27 October 2026. On 27 October it published GHSA-w4c7-34wj-hqm8, Critical (CVSS 10.0), no CVE: on a proxy with an Enterprise license, an unauthenticated request to an LLM route can make the proxy read a local file and send it to an attacker's URL, which can expose the master key and provider keys. Patched in 1.103.10, 1.104.8, 1.105.6 and 1.106.5. Open-source deployments without a license are not affected. The incident report does not name this advisory; the date matches. 1.106.2 is below the patched 1.106.5LiteLLM report, GitHub advisory
Earlier 2026 incidentA separate LiteLLM supply-chain attack was reported in April; Datadog says no link to this one has been establishedPyPI blog, Datadog

For another package-registry incident, see the ChainDrop npm worm check, and the other supply-chain and secrets guides cover the rest. If you run other tools in the same week, a checklist that sorts the work by effort helps you order it.

How do I stop the next one from reaching me?

These come from what the incident exposed, and cost little:

  • Pin every Python dependency to an exact version with hashes (the wider pinning and lockfile habits apply to npm too), using pip's hash-checking mode, and pull images by digest, not by latest.
  • Keep AI gateway keys and cloud roles as narrow as you can. A proxy that holds every provider key makes one bad install very expensive.
  • Do not give build machines standing credentials to production.
  • Do not read a signed or "provenance" badge as proof of safety; what npm provenance does and does not prove applies to any registry.
  • Keep a record of what was installed or pulled and when. This incident was decided by a window of about two and a half hours.

Questions people ask

Is LiteLLM compromised? Which versions?

LiteLLM says only version 1.107.0 was malicious, in the seven PyPI wheels and in the specific Docker Hub and GHCR image indexes that the v1.107.0, latest, main-latest and main-stable tags pointed to during short windows on 21 October. A pull of one of those tags outside the windows, or an image with a different digest, is not what LiteLLM describes. It says all earlier versions and its private enterprise registry were not affected. Its 23 October update says the attack-chain investigation is complete, at our check on 24 October 2026.

I ran pip install litellm that morning. What do I do now?

Work out whether 1.107.0 was ever installed on any host with outbound internet. LiteLLM says that if it was, assume the exfiltration succeeded, and it does not make that depend on proof that Python ran afterwards. Treat the machine as compromised, rebuild the environment or image from scratch, and rotate every secret that machine could read from a separate, trusted computer. Do not start Python or pip in that environment before the startup files are removed.

Is it enough to downgrade to 1.106.2?

No. The malware sits in files next to the package and runs whenever Python starts, so removing or replacing the litellm package does not remove it. Rebuild from scratch, pin the earlier version, and rotate the credentials, because anything the host could read may already have left it.

How do I know if my Docker image was the bad one?

Compare the digest of the image you ran with the compromised digests LiteLLM lists (Docker Hub, and the GHCR indexes for litellm, litellm-database and litellm-non_root). LiteLLM names the v1.107.0, latest, main-latest and main-stable tags only for the windows in its report, and says Docker Hub `latest` was repointed to verified clean artifacts by 14:20 UTC. A matching digest means compromised. If you cannot tell what a tag pointed to when you pulled, that is unknown, and rotating is the cheap answer.

What exactly should I rotate?

Everything the affected host could reach: the cloud role attached to it, every provider key stored in the LiteLLM database, the LiteLLM master and virtual keys, the database password, and any secret in the environment of any process on that host. Rotate from a trusted machine, then look in your provider logs for use from outside your infrastructure.

Is 1.106.2 still the version to pin?

It is the version LiteLLM and Datadog name as clean. On 27 October LiteLLM also published a critical advisory, GHSA-w4c7-34wj-hqm8, for proxies that run with an Enterprise license. It lists 1.106.5 as the patched release on that branch, so 1.106.2 is below it. Open-source deployments without a license are not affected by that advisory. If you run the Enterprise proxy, pin 1.106.5 or the patched release for your branch.

Was the LiteLLM source code on GitHub compromised?

LiteLLM says the official v1.107.0 source tag on GitHub does not contain the malicious files. The malicious packages were built from a lookalike repository instead. That is the maintainer's account, at our check on 24 October 2026.

Sources

  1. LiteLLM: Contained, Oct 21, 2026 LiteLLM release v1.107.0 Compromised (LiteLLM incident report)The maintainer's own report. Published 21 October, header last updated 21 October 20:30 UTC, with a later update dated 23 October 21:50 UTC saying the attack-chain investigation is complete, at our check on 24 October 2026. All windows, checks and rotation steps below come from it.
  2. Datadog Security Labs: LiteLLM compromised on PyPI and Docker (21 October 2026)Independent vendor write-up of the same artifacts: how the startup files run, the indicators, and a matching recommendation to pin 1.106.2 and rotate.
  3. Python documentation: the site module (.pth files and sitecustomize)Documents that import lines in .pth files are executed and that sitecustomize is imported at interpreter start.
  4. PyPI blog: incident report on the earlier LiteLLM and telnyx supply-chain attack (April 2026)A separate, earlier incident. Datadog says no connection to the October one has been established.
  5. LiteLLM root-cause record: how the release was built (23 October 2026)The maintainer's timeline of the leaked key, the stolen tokens, the branch-protection override and the lookalike fork, all in UTC.
  6. GHSA-w4c7-34wj-hqm8: Unauthenticated file read leaks master key on Enterprise proxy (BerriAI/litellm advisory, 27 October 2026)Critical, CVSS 10.0, no CVE. Patched in 1.103.10, 1.104.8, 1.105.6 and 1.106.5. Needs an Enterprise license. The incident report does not name it. Read on 28 October 2026.
  7. PyPI: litellm release historyOn 28 October 2026 the latest release was 1.106.5 (uploaded 27 October). No 1.107.0 file is listed.
  8. pip documentation: secure installs and hash-checking modeHow to pin exact versions and require hashes so an unexpected file is refused.
  9. Docker documentation: docker image pull (pulling by digest)Documents pulling an image by digest, which is how to compare against the digests LiteLLM lists.
  10. AWS documentation: STS GetCallerIdentityThe API call LiteLLM tells you to look for in CloudTrail.
  11. AWS documentation: managing IAM access keysHow to rotate and deactivate access keys.
  12. GitHub documentation: about forksBackground for why a fork commit can be built while the official source tag stays clean.

Facts on this page are dated and point at the primary source next to them. If a vendor status changes after the date shown, the vendor's page wins; tell us at support@run.cloud and we will update it.