Skip to content
>_ITDITDWeb Security Platform

Security Guides

LiteLLM 1.107.0 Shipped a Credential Stealer (October 2026): Affected PyPI Release and Docker Images, and What Users Should Do

LiteLLM 1.107.0 on PyPI and Docker contained a credential stealer on October 21, 2026. Per BerriAI: affected versions and tags, the time window, the safe version and which keys to rotate.

Published 2026-10-22 Updated 2026-10-22 Last verified 2026-10-22 18 min read

For: developers and operators who use LiteLLM, the open-source tool for calling many LLM (large language model) APIs through one interface, either as a Python library or as a proxy (LLM gateway) running in Docker.

This article is based on the official notice from BerriAI, the company behind LiteLLM, and the status updates it posted on GitHub. It does not cover attack techniques, the malware's contents, or specific indicator-of-compromise (IoC) values. Check file names and image digests on the company's notice page.

Developing: this article will be updated as the organisation publishes more

As of 04:30 UTC (13:30 JST), October 22, 2026

Not yet known

  • How the attacker got into the internal deployment (the company suspects a recently patched vulnerability)
  • The number of affected users or environments
  • Whether stolen data has been used
  • Detailed guidance on finding signs of compromise (the company says it will publish more)

The company says it will add details to the notice as it learns more. The notice is still the version updated at 20:30 UTC on October 21; the update it promised for 22:30 UTC has not appeared.

The company had been posting status updates on the GitHub issue about every two hours. Its update at 02:19 UTC on October 22 (11:19 JST) reported no material developments and said its registries remain locked to new releases and regular releases remain paused. It said it will now post updates only when there are significant developments, instead of every two hours.

What LiteLLM users should do today

Step 1 is for everyone. The steps after that follow the company's guidance for environments that installed or started an affected version or image.

1

Check whether you are affected: when you installed, and which tag you used

The company lists the following affected artifacts. All times are October 21, 2026.

ChannelAffectedWindow (UTC)
PyPIlitellm==1.107.0 (all seven wheels)11:39 to 13:23
Docker Hubv1.107.0, latest, main-latest, main-stable11:46 to 14:20
GHCR (GitHub's container registry)The same four tags (litellm, litellm-database, litellm-non_root)11:46 until unavailable by 13:51

The company says you are affected if you installed LiteLLM with pip without pinning a version during the window, or started a container from one of these tags during the window. If CI runs pip install litellm on every build, or your Dockerfile builds FROM the latest tag, the affected version may have been installed without anyone doing anything.

  • Check the installed version with pip show litellm (the company's guidance)
  • The company has published the file names to look for and the image digests. Finding them confirms exposure, but not finding them does not prove the environment is clean
  • If you had explicitly pinned 1.106.2 or earlier, or 1.107.0rc1 or rc2, you are not affected (the company says all earlier versions are safe)
  • Customers pulling from the private enterprise registry were not affected (the company)
2

If it was installed: do not start with pip install in that environment

According to the reporter's analysis quoted in the company's notice, the malware is installed as files that Python loads automatically every time it starts. It runs again for any Python process, including ones that never import litellm and pip itself.

The cleanup order the company gives is as follows (file names and locations are on its notice page):

  • Without starting Python, delete the malicious files the company names (and their cache files) from every affected site-packages directory, from the shell
  • Stop the Python process left running in the background
  • Only then reinstall pinned to litellm==1.106.2. The company says rebuilding images and virtual environments from scratch is better

If you ran it in containers, the quickest route is usually to stop the containers created from the affected image and recreate them from an image pinned to a clean version (this site's note).

3

Pin a version: 1.106.2, or another explicit earlier version

For now the company asks users to pin 1.106.2 or any explicit version published before this incident. As of October 22, the latest version on PyPI is back to 1.106.2 and 1.107.0 has been removed.

In Docker, refer to images by a version tag, or better by digest (a value computed from the image contents), rather than by tags such as latest or main-stable whose contents change. Then a change to what a tag points to does not reach you. The company says regular releases are paused and its registries are locked to new releases. When a new version does appear, it is safer to wait until the company confirms it is clean (this site's note).

4

Rotate keys: everything the environment could reach

The company says that if 1.107.0 was ever installed on a host with outbound internet access, you should assume the stolen data was sent out successfully. It names these in particular:

  • The cloud role attached to the server or container (such as an AWS instance or task IAM role)
  • Every LLM provider key stored in the LiteLLM proxy database
  • The proxy master key and all virtual keys you issued
  • The password in the database connection string (DATABASE_URL)
  • Every secret that was in the environment of any process running on the host

In the reporter's analysis, the malware was also built to collect SSH keys, Git and package-publishing credentials, Kubernetes tokens, passwords saved in browsers and the settings of AI coding assistants. If you ran 1.107.0 on a developer laptop, the credentials on that laptop need rotating too.

Issue a new key in each service's dashboard and revoke the old one (this site's note: set the new key first, then revoke the old one, to avoid an outage). How to handle API keys is covered in what makes .env files and API keys risky.

5

Check for misuse: cloud audit logs and LLM usage

The company asks you to check the AWS audit log (CloudTrail) for an identity check call (GetCallerIdentity) made with the instance role around the time of installation, and then for any use of that role's credentials from outside your own infrastructure.

As a note from this site, also check your LLM providers' dashboards for any unexpected rise in usage or charges since 11:39 UTC on October 21 (the evening in Japan). When a stolen LLM key is used, it can show up in usage and billing. What happens with stolen keys is covered in how stolen API keys lead to account bans.

Installed 1.107.0 or started an affected tag during the window

Treat as compromised

↓

1. Clean up without starting Python

Better: rebuild images and virtual environments

The host had outbound internet access

Assume the data was sent out

↓

2. Rotate every key it could reach

Cloud roles, provider keys, master key, database

Explicitly pinned 1.106.2 or earlier

The company says earlier versions are safe

↓

3. Keep the pin; wait for the notice before upgrading

In Docker, use a version tag or a digest

The actions and order for each case, based on BerriAI's notice. File names and digests are on the company's notice page.

If you run the LiteLLM proxy

The proxy database holds the keys for every LLM provider you connect. In the reporter's analysis, when DATABASE_URL was set, the malware was built to read the tables holding provider keys and model settings. If your proxy started on 1.107.0, plan on rotating every provider key registered in it, and make a list before you begin. The virtual keys you handed out will also need to be reissued, so preparing a message for the people who use them will reduce confusion.

What happened (per BerriAI)

The following is based on BerriAI's blog post "Contained: Oct 21, 2026 LiteLLM release v1.107.0 Compromised" (published October 21, 2026, updated at 20:30 UTC that day) and the status updates its director of security posted on the GitHub issue. All times are UTC on October 21 unless stated.

  1. 10:08

    Branch protection rejects a change to the private release workflow. Five seconds later, a credential tied to a privileged developer account is used to override the protection and apply the change.
  2. 10:46

    The modified workflow starts a staging run built from the attacker-controlled lookalike repository.
  3. 11:11

    A credential tied to a second developer account is used to pass the production approval gate.
  4. 11:39 to 11:40

    Seven malicious 1.107.0 wheels are uploaded to PyPI.
  5. 11:46

    The Docker images for the same release are published.
  6. 11:53

    A credential tied to a third developer account is used to delete the workflow run records, limiting the logs available for investigation.
  7. 12:06

    An outside researcher reports the problem in a GitHub issue.
  8. By 13:23

    PyPI has removed 1.107.0.
  9. 14:20

    All affected Docker Hub tags have been removed or repointed to clean images.
  10. 20:30

    The company updates the notice, saying it believes it has identified the attack chain.
  11. 23:37

    The company reports that it is identifying every authentication token across the organisation and revoking or rotating each one. Registries stay locked to new releases and regular releases stay paused.
  12. 02:19 on October 22 (11:19 JST)

    The company reports no material developments since its last update. Registries stay locked and regular releases stay paused. It moves from updates every two hours to updates when there are significant developments.
About 2 hours
Time live on PyPI (11:39 to 13:23 UTC)
About 2.5 hours
Time the Docker Hub tags pointed to the malicious image
1.106.2
Version the company asks users to pin
Not affected
Private enterprise registry (the company)
What the notice says (per BerriAI)
Affected
litellm==1.107.0 on PyPI (all seven wheels). The v1.107.0, latest, main-latest and main-stable tags on Docker Hub and GHCR (on GHCR: the litellm, litellm-database and litellm-non_root images)
What happened
The release pipeline was compromised and a 1.107.0 containing malware was published. The official v1.107.0 tag on GitHub does not contain the malicious files; the artifacts were built from an attacker-controlled lookalike repository
What the malware does (as disclosed)
Compiled malware that steals credentials and loads remote-code-execution tools. It runs whenever Python starts and leaves a process running in the background
Safe versions
All earlier versions are safe. For now, pin 1.106.2 or another explicit version
Cause (the company's current understanding)
The attacker had GitHub CLI OAuth tokens belonging to three developers. An organisation owner's token was used to disable branch protection and change the workflow. The company believes the tokens were taken from the logs of an internal LiteLLM deployment exposed to the internet
The company's response
Removed the artifacts from PyPI, Docker Hub and GHCR. Revoked the tokens involved, reduced its GitHub organisation to one unaffected member, removed trusted links from its public registries to the organisation, and is revoking or rotating every token
Numbers and misuse
Not disclosed

What is known and what is not

This is the state as of October 22, 2026. When there is a follow-up, the status column will be updated.

ItemWhat the notice saysStatus
Affected version (PyPI)litellm==1.107.0, all seven wheelsConfirmed (the company)
Affected images and tagsv1.107.0, latest, main-latest, main-stable on Docker Hub and GHCRConfirmed (the company)
Time windowPyPI 11:39 to 13:23 UTC; Docker Hub 11:46 to 14:20 UTC; GHCR unavailable by 13:51 UTCConfirmed (the company)
Malware in the releaseSteals credentials and loads remote-code-execution toolsConfirmed (the company)
Credentials on affected hostsIf the host had outbound access, assume the data was sent outPossible (the company)
Earlier versionsAll safeNot affected (the company)
Private enterprise registryNot affectedNot affected (the company)
Official source tag on GitHubDoes not contain the malicious filesNot affected (the company)
How the tokens were takenBelieved to be from the logs of an internal LiteLLM deploymentPossible (the company)
How the attacker got into the internal deploymentNot confirmed; a recently patched vulnerability is suspectedUnder investigation
Number of affected users or environmentsNot stated in the noticeNot stated
Misuse of stolen dataNot stated in the noticeNot stated

How to read this: even though the window was short, decide by whether you installed or started it

The release was live on PyPI for about two hours, but unpinned installs in CI or automatic rebuilds can pick it up within that time. This site does not guess at numbers. Decide whether you are affected by whether you installed 1.107.0 or started an affected tag during the window.

The company's notice names the researcher who contributed guidance and the developer tool involved in the cause. In line with this site's policy, only the organisation that disclosed the incident is named; others are described by role.

What can happen when a release contains malware

The following is general, and does not mean these things happened in this case. What the company has disclosed about this malware is in "What happened" above.

A Python package runs with the permissions of whoever installs it. On a server or container, it can reach that host's environment variables, files and any cloud role attached to it. An LLM gateway exists to hold keys for several LLM providers in one place, so when it is compromised, the keys for every provider it connects to are at risk at once.

What sets this apart from typosquatting or exploiting an old version's vulnerability is that the malicious code came from the official channel, under the official name and version number. Incidents of the same kind include the Trivy supply-chain compromise, the TanStack and Nx Console incidents, and the malware in Rank Math PRO, a WordPress plugin.

What LiteLLM users should review: lessons from the disclosed facts

This section does not judge the company's response. It picks three points from the notice that users can act on to prepare for the next incident.

1

Stop using references whose contents change: pin versions and use digests

The affected environments were those that installed with pip without a pinned version, or used tags such as latest, main-latest and main-stable whose contents change. Environments that pinned 1.106.2 and referenced Docker images by digest were not affected, even if they were rebuilt during the window.

As a first step, pin the dependencies used in production and CI with a lock file that includes hashes (pip install --require-hashes, or uv or Poetry lock files). A setting that avoids versions published very recently (such as uv's exclude-newer, which ignores anything published after a given time) also helps against releases that are pulled within hours. The approach is covered in auditing dependencies with OSV-Scanner.

2

Split the keys you give the LLM gateway, assuming you will have to rotate them

The proxy database holds the keys for every provider you connect. When you have to rotate them, as now, not knowing which key belongs to which environment leaves you choosing between missing some or shutting everything down.

Using separate provider keys for development, testing and production, and setting spending limits and alerts on the provider side, keeps the rotation smaller and helps you notice misuse sooner. What to do when a key leaks is covered in an API key that leaked from AI-written code.

3

Keep the gateway's logs and admin interface off the internet

The company believes the attacker got into an internal LiteLLM deployment that was exposed to the internet, and that its logs contained developers' GitHub tokens that an AI coding assistant had included in response bodies. If an LLM gateway logs full response bodies, secrets can end up in those logs.

For a gateway you run yourself, check three things: the admin interface and API are not reachable directly from the internet, the logging settings that keep response bodies are reviewed, and if you keep them, the retention period is short. For developers' GitHub tokens, use ones that expire, and keep organisation owner rights separate from the accounts used for day-to-day work, so that a stolen token does less damage. Protecting a GitHub account is covered in setting up GitHub two-factor authentication.

Sources (public record)

The facts in this article come from the public information below. The malware's contents, the addresses it contacts and specific indicator values are not reproduced.

  • BerriAI (LiteLLM), "Contained: Oct 21, 2026 LiteLLM release v1.107.0 Compromised" (published October 21, 2026, updated at 20:30 UTC that day) — docs.litellm.ai
  • BerriAI/litellm GitHub issue #47826 (the outside researcher's report and the company's status updates, checked up to the 02:19 UTC update on October 22) — github.com
  • The PyPI project page for litellm (checked October 22; the latest version is 1.106.2 and 1.107.0 is no longer listed) — pypi.org

Update history

2026-10-22 (13:30 JST): Added the GitHub update at 02:19 UTC on October 22 (no material developments; updates now only on significant developments). The notice is still the 20:30 UTC version. Clarified which images are affected on GHCR and the wording of the misuse check.

2026-10-22: First version, based on BerriAI's notice as updated at 20:30 UTC on October 21 and the GitHub update at 23:37 UTC that day. It will be updated when the intrusion path or numbers are published.

FAQ

QWhich LiteLLM versions and images are affected?
A

According to BerriAI (LiteLLM), the affected artifacts are litellm==1.107.0 on PyPI (all seven wheels, live from 11:39 to 13:23 UTC on October 21, 2026) and the v1.107.0, latest, main-latest and main-stable tags on Docker Hub and GHCR. On Docker Hub the tags pointed to the compromised image from 11:46 to 14:20 UTC; on GHCR they were taken down by 13:51 UTC. The company says all earlier versions are safe and that customers using its private enterprise registry were not affected.

QHow do I check whether I am affected?
A

The company says you are affected if you installed an unpinned LiteLLM with pip during the window, or started a container from one of the affected tags during the window. It asks you to treat any environment that started Python with litellm==1.107.0 as compromised, and you can check the installed version with pip show litellm. The company has published the file names to look for, but says that not finding them does not prove an environment is clean.

QAm I at risk even if my code never imports litellm?
A

Yes. According to the reporter's analysis quoted in the company's notice, the malware is installed as files that Python loads automatically every time it starts, so it runs even for Python processes that never use litellm, and even when you run pip itself. That is why the company sets a cleanup order and warns against starting with pip install in an affected environment.

QWhich credentials should I rotate?
A

The company's guidance is everything the host could reach. In particular: the cloud role attached to the instance or task (such as an AWS IAM role), every LLM provider key stored in the LiteLLM proxy database, the proxy master key and all virtual keys, the DATABASE_URL password, and any secret in the environment of any process on the host. If 1.107.0 was ever installed on a host with outbound internet access, it asks you to assume the data was sent out successfully.

QWhat caused it?
A

The company says the attacker had GitHub CLI OAuth tokens belonging to three developers. One belonged to an owner of its GitHub organization and was used to disable branch protection and change the release workflow so that it built from a lookalike repository. The company believes the tokens were taken from the logs of an internal LiteLLM deployment that was exposed to the internet. As of October 22 it had not confirmed how the attacker got into that deployment, and suspected a recently patched vulnerability.

QLiteLLM was also compromised in March. Is this the same incident?
A

No. In this notice the company says that after the March incident it hardened its release pipeline (moving releases to a private repository, using trusted publishing, making Docker release tags immutable and signing images), and that this time the attacker had to get past several of those controls using legitimate credentials. The versions affected in March are different from 1.107.0.