On 21 October 2026 an attacker used LiteLLM’s own release pipeline to publish a malicious version 1.107.0 to PyPI and Docker. It ran every time Python started, collected cloud, AI provider and developer credentials, and sent them to the attacker. It was live for about two hours, and stolen credentials have already been used. If you installed it or ran an affected image, rotating secrets matters more than removing the package.
Reflects what was publicly known on the last updated date. Every fact links to a primary source at the end of the page.
Only the 1.107.0 release on 21 October is malicious. Find the row that describes you.
You installed litellm 1.107.0 from PyPI
pip, uv or Poetry between 11:39 and 13:23 UTC on 21 October, including unpinned installs and CI jobs
Treat the machine or runner as compromised. The theft happened when Python first started, so rotate every secret it could read. Clean up and rotate
You ran a LiteLLM Docker image from a floating tag
latest, main-latest, main-stable or v1.107.0, pulled or restarted between 11:46 and 14:20 UTC on 21 October
Treat the container and the secrets passed to it as compromised. Redeploy pinned to a digest. Check the digest you ran
You run the LiteLLM proxy with a database
The litellm-database image, or any deployment with DATABASE_URL set
If it ran the bad release, the malware queried the proxy database for its stored provider keys. Rotate every provider key, the master and virtual keys, and the database password.
You use LiteLLM through another package
DSPy, langchain-litellm, llama-index-llms-litellm, Open Interpreter, Guardrails AI, or the litellm extra of CrewAI, smolagents and others
Check your lockfile and install logs. You are affected only if the install resolved to 1.107.0 during the window. How to check
You pin LiteLLM to an earlier version or image digest
Any version up to 1.106.2, or a digest you chose before 21 October
Not affected. LiteLLM says every earlier version is safe. Keep the pin until releases resume.
You use LiteLLM’s private enterprise registry
Enterprise customers pulling from BerriAI’s private registry
Not affected, according to LiteLLM.
You run agents on Amazon Bedrock AgentCore harness
AWS’s managed harness image, not a container you built
Not affected: the current images bundle LiteLLM 1.85.1. That copy never shows up in your own lockfiles or SBOMs, so add it to your inventory. Copies your scans miss
Checking a laptop rather than a server? The safe check and the other October updates for developer machines are in the device security checklist.
If 1.107.0 ran anywhere, assume its secrets are already with the attacker. Removing the package does not undo that.
Find every place that ran 1.107.0
Isolate it and keep the evidence
Rotate every secret it could read, from a clean machine
Rebuild, then pin
litellm==1.106.2, and pin Docker images by digest instead of a tag. Clean digestsLook for use of stolen credentials
Times are UTC on 21 October 2026. All of these have been removed or pointed back at clean images.
| Artifact | Live | Now |
|---|---|---|
| PyPI: litellm 1.107.0, all seven wheels | 11:39:51 to about 13:23 UTC | Removed by PyPI |
| GHCR: ghcr.io/berriai/litellm, litellm-database, litellm-non_root | 11:46:56 to 13:51 UTC at the latest | Removed |
| Docker Hub: docker.io/litellm/litellm | 11:46:56 to 14:20 UTC | Removed |
On every registry the affected tags were v1.107.0, latest, main-latest and main-stable. A deployment that follows a floating tag could have pulled the bad image without anyone choosing 1.107.0. The source archive (sdist) carried the tampered build setting but not the malicious files.
LiteLLM says every earlier version is safe and tells users to pin litellm==1.106.2. Normal releases are paused while it investigates, so there is no newer clean release yet. The floating Docker tags now point to the 1.106.2 images. Pin these image index digests rather than a tag:
| Image | 1.106.2 index digest (sha256) |
|---|---|
| ghcr.io/berriai/litellm and docker.io/litellm/litellm | 7294b90f868c5c38c99b83021c7ba46f9b439e95f8e32964c925c7d2563a03f7 |
| ghcr.io/berriai/litellm-database | 35f2cec3a14bb297e08bfab56c1fc377432bc4071aaf71978fdff043a5d91e79 |
| ghcr.io/berriai/litellm-non_root | 07fabea33dfc2b127e865c03112dfc76936334b29028ec05cdd355af2385dc04 |
Clean digests are from issue #47826 and matched the registries on 22 October. Check them again before you deploy.
Run checks from a shell. Starting Python or pip inside a suspect environment, even to check a version, runs the malware again.
Look for the malicious files directly on disk. Any match means the environment ran, or will run, the malware.
# Run from a shell. Do not start Python or pip in a suspect environment.
find / -path '*-packages/litellm-1.107.0.dist-info' -type d 2>/dev/null
find / -path '*-packages/cook.pth' -type f 2>/dev/nullLiteLLM’s own report suggests pip show litellm, but also warns that any Python start runs the malware. Use pip only from a clean interpreter pointed at the suspect environment, or stick to the file checks above.
# requirements files, and uv.lock or poetry.lock (which list wheel file names)
grep -rnE 'litellm(\[[^]]*\])? *(==|-) *1\.107\.0([^0-9a-z]|$)' .Pre-releases such as 1.107.0rc1 and 1.107.0rc2 are reported clean. Pipfile.lock puts the version on a separate line, so open it and read the litellm entry. Unpinned installs leave no lockfile, so also search CI logs and package caches from 21 October for litellm-1.107.0.
docker images --digests | grep -E 'berriai/litellm|litellm/litellm'
docker images --digests | grep -E '1bbcb1443bc9|c00f9d92c427|7b00e91cd2fe'kubectl get pods -A -o jsonpath='{range .items[*]}{.metadata.namespace}/{.metadata.name}{"\t"}{.status.containerStatuses[*].imageID}{"\n"}{end}' \
| grep -E '1bbcb1443bc9|c00f9d92c427|7b00e91cd2fe|bd1aeee419ea|56b74573eed6|24581ddc3076|827dd893c74c|645a67d81062|f75c8edae59b'These show only images present now. A pod that ran the bad image and was replaced since leaves no trace here, so also check deployment history and registry pull logs for 11:46 to 14:20 UTC on 21 October. Inside a LiteLLM image the files sit in /app/.venv/lib/python3.13/site-packages/.
ls -la /tmp/.pc_once_72129118c59f5636c0bb /tmp/remote_code_loader.lock 2>/dev/null
lsof /tmp/remote_code_loader.lock/tmp/.pc_once_72129118c59f5636c0bb means the stolen data was sent successfully./tmp/remote_code_loader.lock is the background loader still running.A missing marker proves nothing. Failed uploads, temporary folder clean-up and container restarts all leave none behind.
The checks above cover code you build. Managed services can run their own copy of LiteLLM that never appears in your lockfiles or SBOMs. Amazon Bedrock AgentCore is one: its harness, where you describe an agent as configuration and AWS runs the loop, uses an AWS-managed image unless you supply your own. That image bundles LiteLLM under /opt/amazon.
We inspected the public images on 22 October without running them. Each Region has its own repository, named harness-<region> under a per-Region alias on Amazon ECR Public, with a single latest tag. Two builds were current, and both carry LiteLLM 1.85.1. Neither contains 1.107.0 or the malicious startup files, and none was pushed during the malicious window.
| Regions | latest digest (sha256) | Built |
|---|---|---|
| us-east-1, us-east-2, us-west-2, ca-central-1, sa-east-1, eu-central-1, eu-west-1, eu-west-2, eu-west-3, eu-north-1, ap-northeast-1, ap-northeast-2, ap-south-1, ap-southeast-1 | cbca7676596101f7049cbea2bcfe10c1f9c355a054f1e444e240f4b72c62dab9 | 15 October 2026 |
| ap-southeast-2, ap-southeast-5, ap-southeast-7, eu-south-1, eu-south-2 | e9aeb978f1381da79b87090bb03366339ad01b91b2e4aa88b66ad6e877cc2cd9 | 17 October 2026 |
latest at each start or a fixed digest, and whether a harness version freezes the image.Add managed agent and AI runtimes to your inventory as dependencies, record the versions they bundle, and check them against each new advisory. Ask your provider for a version or digest commitment, or release notes, for any managed image you rely on.
Rebuilding from scratch is safer than cleaning in place. If you must clean in place, do it from a shell, after saving evidence.
# 1. Stop the background loader
kill $(lsof -t /tmp/remote_code_loader.lock)
# 2. Remove the startup files (set SP to each affected site-packages folder)
SP=/path/to/site-packages
rm -f "$SP/cook.pth" "$SP/cook.py" "$SP/sitecustomize.py" \
"$SP"/__pycache__/cook*.pyc "$SP"/__pycache__/sitecustomize*.pycSome systems ship a legitimate sitecustomize.py. Check its hash against the indicators before you delete it. Then reinstall litellm==1.106.2, and block 1.107.0 in any package proxy or mirror you run.
If 1.107.0 ran on a machine with internet access, assume the theft succeeded. Rotate from a clean machine, starting with what the attacker is known to use: cloud roles and AI provider keys.
| Area | What to rotate |
|---|---|
| Cloud identities | AWS instance and task roles, the AWS, Azure and Google Cloud files in the home folder, and Kubernetes and Docker configs. The malware read cloud metadata services directly and checked AWS keys before sending them. |
| AI provider keys | Every key in the process environment, and every key stored in a LiteLLM proxy, plus its master key, virtual keys and salt key. |
| Databases | The DATABASE_URL password, and any connection string in .env files or the environment. |
| Code and package publishing | GitHub CLI tokens, Git credentials, npm, PyPI, Cargo, Maven and other registry tokens, and SSH and GPG keys. |
| CI and infrastructure | GitLab runner and Jenkins secrets, Vault tokens, Terraform credentials, and TLS private keys on the host. |
| AI coding tools | Sessions and configs for Claude Code, Codex, Gemini CLI, Cursor, Copilot, Windsurf and similar tools, including MCP server configs that hold tokens. |
| Browsers on developer machines | Saved passwords and session cookies from Chrome, Edge, Brave, Firefox and other browsers. Sign out of important sessions and change those passwords. |
The malicious release added three files at the top of the Python library folder. LiteLLM’s own code was not changed.
Python reads .pth files and sitecustomize.py every time it starts. The release used both, so the malware ran whenever any Python program started in that environment, whether or not it imported LiteLLM: pip, pytest, a notebook, or the LiteLLM proxy itself. Installing the package did not run it; the next Python start did. According to Socket, the files were slipped in through one added line in the build configuration, which the official 1.107.0 tag does not contain.
| Area | What it takes |
|---|---|
| Environment | Every environment variable of the Python process and, on Linux, of every other process it can read. This is how provider keys such as OPENAI_API_KEY and ANTHROPIC_API_KEY are taken. |
| LiteLLM proxy database | With DATABASE_URL set, it queries the proxy’s stored credentials and model settings, up to 500 rows of each. |
| Cloud | AWS, Azure and Google Cloud credential files and metadata services, ECS task credentials, Kubernetes service account tokens, and mounted container secrets. |
| Developer secrets | .env files, Git, npm, PyPI and other registry credentials, SSH, GPG and TLS private keys, and key files under the home folder. |
| CI and infrastructure | GitLab runner and Jenkins secrets, Vault tokens, and Terraform and Packer credentials. |
| AI tools | Login files and configs for about 20 AI coding tools, including Claude Code, Codex, Gemini CLI, Cursor, Copilot and Hugging Face. |
| Workstation | Browser passwords, cookies and history, shell and database client histories, and network details. |
It encrypts everything with a key only the attacker can unlock and sends it to www.litellm.dev, a domain registered on 13 October that looks like LiteLLM’s own. Because the upload is encrypted, captured network traffic will not show what was taken.
The second file starts a hidden background process. Every hour it reads a small file from a GitHub repository to learn which server to contact, then downloads and runs whatever Python code that server returns, with no checks. The pointer file only ever held test values and has been empty since 20 October, and the account has since been taken down. No second stage has been seen, but a running loader would obey whoever controls that pointer, so stop it. On Windows the loader fails and only the theft runs.
Yes. Wiz reports that from 16:20 to 17:01 UTC on 21 October the attacker tested AWS role credentials stolen from CI runners and Kubernetes nodes across multiple environments. Each was checked, then used to list the AI models available in Amazon Bedrock. That pattern points to LLMjacking: running AI models at the victim’s expense. In some environments the attacker also listed IAM users, roles and access keys and checked CloudTrail settings. No victim count or download count for 1.107.0 has been published.
Domains are written with brackets so they cannot be clicked. Remove the brackets before you load them into a tool.
hxxp://www[.]litellm[.]dev/healthcheck with the header X-Token: XWiA8gZNa7NcX2XRoAEbletters9813/pythonclient-test, read through raw[.]githubusercontent[.]com/codepy169.254.169.254 or 169.254.170.2168.100.8[.]57 and 165.227.201[.]8 (Wiz)litellm.dev sits behind Cloudflare, so block the domain, not its IP addresses. Block the GitHub repository path, not all of raw.githubusercontent.com.
In AWS CloudTrail, look for sts:GetCallerIdentity from an instance or task role around the time 1.107.0 first ran, followed by use of the same role from outside your network, especially bedrock:ListFoundationModels and IAM listing calls.
cook.pth, cook.py or an unexpected sitecustomize.py at the top of site-packages, and their .pyc fileslitellm-1.107.0.dist-info/tmp/.pc_once_72129118c59f5636c0bb, /tmp/remote_code_loader.lock, and folders named /tmp/.pc_sq_* or /tmp/.pc_e_*PRIVCOLLECT_ACTIVE=1, and a detached Python process whose working folder is /| litellm-1.107.0-cp310-abi3-… | SHA-256 |
|---|---|
macosx_10_12_x86_64.whl | 7598727f209d717041db37f7dca271d3a7d328a279890e0e1d55375729aeb86d |
macosx_11_0_arm64.whl | 0aaf7ba346d41ef2f40390436738b001180d5a1c03aa093f121078a9969d9a1a |
manylinux_2_28_aarch64.whl | 668169d35b87bf51324080390b1b1c5ab12bd335cfe5f1a99e3689abd5e02ae6 |
manylinux_2_28_x86_64.whl | 462d0c9f67ca522d9e0e4acd245e90b36ce0d5353604a66bb7c43a1ec4a6fcf7 |
musllinux_1_2_aarch64.whl | c2e32d0ce2548aa662c18bf5001911a79fe5b30cf8357132275add02fdcde054 |
musllinux_1_2_x86_64.whl | 1bbce8caa94f01c0aaa0b7ddae51553a8a32e1ce53d96d44fe583272aff7ad00 |
win_amd64.whl | 12d4ccc5c6f8d35cf4f2cf233b7f3e418e863e657d81ff5f5fc9e210005b9484 |
litellm-1.107.0.tar.gz (sdist) | 2befe2a79fb4fbbd9a543b5b40b530c8cffa8771bab22b8fb22b2e4ae3b1f819 |
| File | Linux and macOS | Windows |
|---|---|---|
cook.pth | 7f191632e7320705d154b85204f1ae546b543acbd7e8861229b76f5042b92bdb | 84dc8c82c0a4a4a62552ef826b49fcc86d1a5c4a5d0f2c06665723f93d129d7d |
cook.py | 9dd0a3926f96a37eb86cf1ee2310d9be93139cc4ebef3ef9e2efe9531390be25 | 03ac2a8b752605d1d7710979c17ff18b03dd978203ba23ba97fd8ce3d6f897ea |
sitecustomize.py | 34bef04fe88ac9d0aae0475630b1738681d15b94f233ac8aa46eacf5968305fa | b6122440d0d9cb1eb1ade9933f49214da8c31288de7710c076c2680dfa528465 |
7598727f209d717041db37f7dca271d3a7d328a279890e0e1d55375729aeb86d
0aaf7ba346d41ef2f40390436738b001180d5a1c03aa093f121078a9969d9a1a
668169d35b87bf51324080390b1b1c5ab12bd335cfe5f1a99e3689abd5e02ae6
462d0c9f67ca522d9e0e4acd245e90b36ce0d5353604a66bb7c43a1ec4a6fcf7
c2e32d0ce2548aa662c18bf5001911a79fe5b30cf8357132275add02fdcde054
1bbce8caa94f01c0aaa0b7ddae51553a8a32e1ce53d96d44fe583272aff7ad00
12d4ccc5c6f8d35cf4f2cf233b7f3e418e863e657d81ff5f5fc9e210005b9484
2befe2a79fb4fbbd9a543b5b40b530c8cffa8771bab22b8fb22b2e4ae3b1f819
7f191632e7320705d154b85204f1ae546b543acbd7e8861229b76f5042b92bdb
84dc8c82c0a4a4a62552ef826b49fcc86d1a5c4a5d0f2c06665723f93d129d7d
9dd0a3926f96a37eb86cf1ee2310d9be93139cc4ebef3ef9e2efe9531390be25
03ac2a8b752605d1d7710979c17ff18b03dd978203ba23ba97fd8ce3d6f897ea
34bef04fe88ac9d0aae0475630b1738681d15b94f233ac8aa46eacf5968305fa
b6122440d0d9cb1eb1ade9933f49214da8c31288de7710c076c2680dfa528465| Image | amd64 | arm64 |
|---|---|---|
| litellm (GHCR and Docker Hub) | bd1aeee419ea36da9aa2b657288da4101887be468f020ac63d22ba6ed84a3ea5 | 56b74573eed6e4aafe4b50603dbe7853e0345f188c8e44a09f1098caf1f4bcdf |
| litellm-database | 24581ddc30767f16ecb69d2b0517556f2cd7dea56971adb42a3d1beb97d69523 | 827dd893c74cf621a860a66a3a447a5c732533f087589ce905573e285c0a239c |
| litellm-non_root | 645a67d810628252d63df85dcc8824c58bcc77cf8383f4d3e6321f0ccc3ce9e4 | f75c8edae59b72b1ebfd617295833f465c85bb2fab9c1d60f21b496db86cb8da |
The image index for litellm on GHCR and Docker Hub is 1bbcb1443bc962e45f5aad53fe3d2c30600e0379715fb6c664cdd3ac126c339e. The index digests for litellm-database and litellm-non_root have only been published in part: c00f9d92c427… and 7b00e91cd2fe…. Hashes are from Socket, Wiz, SafeDep and the LiteLLM report.
This is LiteLLM’s preliminary account. The maintainers say they are still confirming parts of it.
After an earlier compromise in March, LiteLLM moved releases to a private repository, published through PyPI’s trusted publishing, made Docker tags immutable and signed its images. Publishing was limited to one account tied to a laptop kept in the office. The attacker went around these controls rather than through them: with stolen credentials they ran LiteLLM’s own release pipeline, so the malicious release was built, signed and published like a normal one.
Berri-AI/litellm, a lookalike of BerriAI/litellm that differs by one hyphen. A second account approved the release, and a third deleted the workflow records afterwards.LiteLLM found an unexpected, innocently named user account in its own internal LiteLLM deployment, which was reachable from the internet. It believes the attacker read the tokens from that deployment’s logs. LiteLLM says it has seen specific situations in which Claude Code puts a user’s GitHub CLI token into a response body, and where response bodies are logged, the token lands in LiteLLM’s logs. It has not published those situations, and at the time of writing we found no statement from Anthropic about this.
The lesson applies beyond LiteLLM. An AI gateway’s logs can hold anything that passes through it, including tokens. Treat those logs as secret, limit who can reach them, and keep internal gateways off the public internet.
LiteLLM revoked the tokens involved, removed all but one user from its GitHub organisation, cut the trusted links between public registries and GitHub, locked its registries and paused releases. It is rotating every token across the organisation. An unrelated embargoed security fix, due for disclosure on 27 October, is going only to its private enterprise registry.
In March 2026 LiteLLM 1.82.7 and 1.82.8 were malicious for about 40 minutes, in an attack tied to the Trivy compromise. The October payload, infrastructure and way in are all different. The two incidents share one GitHub advisory and one OSV record, while the PyPA record PYSEC-2026-2 lists only the March versions. A scanner that relies on that record alone may not flag 1.107.0, so check the version directly.
Times are UTC. The attacker prepared for at least a week before the release.
2026-10-13
The domain litellm.dev is registered, and the GitHub account that later hosts the loader’s pointer file is created.
2026-10-20
LiteLLM temporarily widens release permissions so two engineers can publish daily bugfix backports.
2026-10-2108:56 UTC
The attacker starts committing the malicious files to a lookalike repository, Berri-AI/litellm.
2026-10-2110:08 UTC
Branch protection blocks a change to the private release workflow. Seconds later a privileged developer credential overrides it.
2026-10-2111:11 UTC
A second developer’s credential approves the production release.
2026-10-2111:39 UTC
Seven malicious litellm 1.107.0 wheels are uploaded to PyPI.
2026-10-2111:43 UTC
Automated scanners begin flagging the wheels: AISLE at 11:43, Socket at 11:46.
2026-10-2111:46 UTC
The malicious Docker images are published, and floating tags such as latest start pointing to them.
2026-10-2111:53 UTC
A third developer’s credential deletes the release workflow records, limiting the logs available to investigators.
2026-10-2112:06 UTC
Upwind researcher Lidor Machluf reports the compromise publicly.
2026-10-2113:50 UTC
LiteLLM acknowledges the compromise and declares its top severity.
2026-10-2114:20 UTC
All affected Docker Hub tags are removed or pointed back at clean images.
2026-10-2116:20 UTC
Wiz sees the attacker testing stolen AWS role credentials and listing Amazon Bedrock models, until 17:01.
2026-10-2116:32 UTC
LiteLLM says the attacker used stolen GitHub CLI tokens belonging to three engineers.
2026-10-2123:37 UTC
LiteLLM is rotating every token across its organisation. Registries stay locked and releases are paused.
Reports written during the day disagree in places. Here is what each says and how we read it.
| Question | What the sources say | Our reading |
|---|---|---|
| When PyPI removed it | 13:20 UTC (Wiz, Datadog); by 13:23 UTC (LiteLLM). | Use 13:23. A few minutes do not change the advice: treat any install of 1.107.0 that day as compromised. |
| When the Docker images were removed | About 13:53 UTC for all registries (Wiz, Datadog); GHCR by 13:51 and Docker Hub at 14:20 UTC (LiteLLM). StepSecurity uses 14:32 as a cautious end. | Use 14:20 for Docker Hub. LiteLLM’s own check at 13:51 found Docker Hub still serving the bad image. |
| The clean version to pin | 1.106.2 (LiteLLM, Wiz, Datadog, Upwind); 1.106.0 (OX Security). | Both are reported clean. Pin 1.106.2, the version LiteLLM names. |
| Whether the malware is compiled | “Compiled malware” (LiteLLM); one layer of encoded and compressed Python source (Socket, StepSecurity, Endor Labs). | It is Python that reads plainly once decoded. This does not change any remediation step. |
| Whether pip uninstall removes it | Yes, because the files are listed in the package record (StepSecurity); removing the package does not remove them (Socket, Endor Labs, Datadog). | Running pip starts Python and runs the malware again. Delete the files from a shell, or rebuild. |
| What it steals | Wiz lists Safari data and quotes a query that reads the whole credentials table. | The decoded code has no Safari module and reads named columns. We follow the code as published by Socket and the issue thread. |
| How the attacker got in | Early reports guessed a stolen PyPI publishing token (AISLE, the original issue). LiteLLM later said it was stolen GitHub CLI tokens. | Follow LiteLLM’s account, which it calls preliminary. Parts of it are unconfirmed. |
OX Security names 1.106.0 as the clean version. Every other source, including LiteLLM, names 1.106.2.
For most teams this is a supplier incident that may have exposed credentials. An auditor will ask how you found out, which systems ran the bad release, and what you rotated.
| Framework | Control | What to record |
|---|---|---|
| ISO 27001:2022 | A.5.21 | Managing security in the ICT supply chain. Record which systems pulled LiteLLM, including copies bundled in managed services such as AgentCore, how versions were pinned, and what you changed. |
| ISO 27001:2022 | A.8.7 | Protection against malware. Record the detection, removal and rebuild of each affected system. |
| ISO 27001:2022 | A.5.17 | Authentication information. Keep the list of secrets rotated, with dates. |
| ISO 27001:2022 | A.5.25, A.5.26, A.5.27 | Assess the event, respond to it, and record what you learned, such as moving to digest pinning. |
| ISO 42001 | A.10.3 | Suppliers of AI system components. LiteLLM sits between your systems and your AI providers. |
| SOC 2 | CC6.8 | Preventing and detecting malicious software. |
| SOC 2 | CC7.3, CC7.4 | Evaluating and responding to the incident. |
| SOC 2 | CC9.2 | Managing the risk of vendors and open source suppliers. |
| SOC 2 | CC6.1 | Revoking and reissuing exposed credentials. |
Evidence to keep: when you assessed it, the systems, lockfiles and image digests you checked, what you found, the rebuilds, every secret rotated with its date, and the log review. If the malware ran where personal data was reachable, such as a proxy database holding customer prompts, assess whether you have a duty to notify.
Short answers. The sections above have the detail and sources.
On 21 October 2026 an attacker who held stolen developer credentials pointed LiteLLM's private release workflow at a lookalike repository, Berri-AI/litellm, and published the result as litellm 1.107.0 on PyPI and as LiteLLM's Docker images. The release added three files that run whenever Python starts and steal credentials. The official 1.107.0 source code on GitHub does not contain them.
LiteLLM says every version before 1.107.0 is safe and tells users to pin litellm==1.106.2. Floating Docker tags such as latest now point to the 1.106.2 image again. Normal releases are paused while LiteLLM investigates, so there is no newer clean version yet.
Yes. The malicious files sit at the top of site-packages and Python runs them at startup, before any application code. Running pip, pytest, a Jupyter kernel or any other Python program in that environment was enough. Downloading the wheel without installing it was not.
Do not rely on it. Running pip starts Python, which runs the malware again, and deleting the litellm folder leaves the startup files behind. Stop the background process, delete the three files from a shell, or better, rebuild the environment or image from scratch. Removing the files does not undo the theft, so rotate secrets as well.
Everything the affected machine or container could read. That includes cloud role and instance credentials, every AI provider key stored in a LiteLLM proxy along with its master and virtual keys, the proxy database password, environment variables, SSH and TLS keys, GitHub, npm and PyPI tokens, Kubernetes and Vault tokens, CI secrets, saved browser passwords, and logins for AI coding tools such as Claude Code, Codex, Gemini and Cursor.
Yes. Wiz reports that between 16:20 and 17:01 UTC on 21 October the attacker tested AWS role credentials taken from CI runners and Kubernetes nodes, then listed the AI models available in Amazon Bedrock. That pattern points to an attempt to run AI models on the victim's account, known as LLMjacking.
No. In March 2026 litellm 1.82.7 and 1.82.8 were briefly malicious, in an attack tied to the Trivy compromise. The October attack used a different payload, different infrastructure and a different way in, and no link between the two has been established. The two incidents share one GitHub and OSV advisory record, which adds to the confusion.
Not as of 22 October 2026. The AWS-managed image that AgentCore harness runs bundles its own copy of LiteLLM, at version 1.85.1, in both builds current on that date. Neither contains 1.107.0 or the malicious startup files, and neither was pushed during the malicious window. That copy does not appear in your own lockfiles or SBOMs, and you cannot pin it, so add it to your inventory and check it against future advisories.
No. A malicious release is not a code flaw, so no CVE has been assigned. It is tracked as GHSA-92x9-889m-jgmw in the GitHub Advisory Database and MAL-2026-2144 in OSV. The PyPA advisory PYSEC-2026-2 lists only the March versions, so scanners that rely on it alone may not flag 1.107.0.
Vulneron matches new vulnerabilities and public exploits against your live surface, confirms what is actually exploitable for you, and alerts in real time only when it is critical.