LIVE LOG · entries last verified against sources October 14, 2026 · site updated Oct 21, 2026, 12:49 PM ET

← All incidents

LiteLLM 1.107.0 on PyPI and Docker shipped a credential stealer that also takes Claude Code, Cursor, Codex and Copilot logins

Incident · LiteLLM (BerriAI's Python SDK and AI gateway proxy): PyPI package litellm 1.107.0 and the official v1.107.0 Docker images · CRITICAL

Incident dateOct 21, 2026. Malicious wheels on PyPI from 11:39 UTC until removed (gone by 13:23 UTC per Upwind); infected Docker images under v1.107.0 and the latest, main-latest and main-stable tags from about 11:48 UTC until BerriAI confirmed removal at 14:32 UTC. Attacker commits pushed from 08:56 UTC.
DisclosedOct 21, 2026, 12:06 UTC (Upwind report in BerriAI/litellm issue #47826; AISLE says its firewall flagged the first wheel at 11:43 UTC). BerriAI confirmed at 13:50 UTC.
Added hereOct 21, 12:40 PM ET
Last verifiedOct 21, 2026

Summary

On Oct 21, 2026, litellm 1.107.0, the Python library and proxy that many teams and AI tools use to talk to OpenAI, Anthropic and other model providers, was published to PyPI with malware inside it. The same payload shipped in the official v1.107.0 Docker images, and for a few hours the latest, main-latest and main-stable tags pointed at the infected image. Upwind's security research team, which reported it in LiteLLM's GitHub issue #47826, says all 7 wheels drop three extra files into site-packages so the code runs every time Python starts in that environment, even if nothing imports litellm. Upwind, StepSecurity and Aikido say the stealer collects SSH keys, cloud and CI credentials, browser passwords, the environment variables of running processes, the provider keys stored in a LiteLLM proxy database, and the logins and configs of AI coding tools including Claude Code, Cursor, Codex, GitHub Copilot, Gemini CLI and Windsurf, then sends them encrypted to the lookalike domain litellm.dev. A second file starts a background loader that can fetch and run new code from the attacker every hour; researchers say it had nothing to run yet. BerriAI, which maintains LiteLLM, is treating it as a SEV-0: PyPI quarantined 1.107.0, BerriAI removed the malicious Docker images and tells users to pin 1.106.2. In its 12:32 PM ET update BerriAI said the malicious actions came through three of its engineers' GitHub accounts, apparently via stolen GitHub CLI OAuth tokens, which it has revoked. It says it does not yet know how those tokens were taken.

Severity

CRITICAL Critical. The malware came through LiteLLM's official channels (PyPI and the official Docker images, including the default latest tag), runs on every Python start without any import, and goes after nearly every secret a developer machine, CI runner or AI gateway holds, including AI coding agent logins and the upstream provider keys stored by the LiteLLM proxy. Researchers say the data is encrypted before it leaves, so defenders can't tell from network logs what was taken, and a second-stage loader can run new attacker code. BerriAI has confirmed the compromise and the removals; the exposure window was a few hours, which limits but does not remove the impact.

Timeline

  1. Oct 13, 2026
    The lookalike domain litellm.dev is registered and the GitHub account letters9813 is created, per StepSecurity and Upwind.
  2. Oct 18, 2026
    The attacker's dead-drop repository letters9813/pythonclient-test is created, per StepSecurity and AISLE.
  3. Oct 21, 2026, 08:56–10:46 UTC
    Ten commits that add the payload are pushed to a lookalike repository, Berri-AI/litellm (with a hyphen), on top of the real v1.107.0 code, per Upwind and StepSecurity.
  4. Oct 21, 2026, 10:51 UTC
    BerriAI's release workflow (project-releaser) starts a run that, according to the image build records Upwind examined, builds from the lookalike repository instead of BerriAI/litellm.
  5. Oct 21, 2026, 11:39–11:48 UTC
    The 1.107.0 files are uploaded to PyPI (11:39–11:40 UTC). AISLE says its dependency firewall flags the first wheel at 11:43 UTC. The infected image is pushed to Docker Hub at 11:48 UTC and the latest, main-latest and main-stable tags point to it, per Upwind and StepSecurity. The GitHub release v1.107.0 is published at 11:50 UTC.
  6. Oct 21, 2026, 12:06 UTC
    Upwind's research team reports the compromise in BerriAI/litellm issue #47826 with file hashes, a decoded payload and indicators of compromise.
  7. Oct 21, 2026, 13:23–13:50 UTC
    Upwind reports 1.107.0 is gone from PyPI and that the Docker tags still point to the infected image. At 13:50 UTC BerriAI replies that it is treating the incident as SEV-0 and that PyPI quarantined 1.107.0.
  8. Oct 21, 2026, 14:32 UTC
    BerriAI says the malicious Docker images have been removed, that it has not yet identified or locked down how the attacker published the release, and that open-source users should pin 1.106.2 or another version published earlier. It says its private enterprise registry is not affected.
  9. Oct 21, 2026, 16:32 UTC
    BerriAI says the malicious actions were taken through three engineers' GitHub accounts, apparently with stolen GitHub CLI OAuth tokens: one account triggered the release run and another approved it. It has revoked the tokens, removed all but one unaffected user from its GitHub organization, and removed trusted publishing links from its registries. It says it has not found the original attack vector and plans its next update at 18:30 UTC.

How it happened

According to Upwind, the 1.107.0 wheels were built by LiteLLM's normal build tooling, but from a source tree with extra attacker commits stacked on top of the release: one line added to pyproject.toml (data = "cook") tells the build to copy three files, cook.pth, cook.py and sitecustomize.py, straight into site-packages. Python runs .pth files and sitecustomize.py automatically at startup, which is why the payload fires on any Python start in that environment, including running pip. The git tag v1.107.0 itself is clean, and Upwind says the source tarball holds the edited pyproject.toml but not the payload files. cook.py is a stealer that calls itself privcollect. Upwind's decode lists what it gathers: host and network details, Chromium and Firefox saved passwords and cookies, SSH keys and shell histories, AWS, Azure, gcloud, Kubernetes, Docker and GitHub CLI credentials, package-registry tokens (.npmrc, .pypirc and others), .env files and private keys, CI and Vault secrets, cloud instance credentials, GPG and TLS keys, the environment variables of every process it can read, and the credentials and configs of AI tools including Claude, Codex, Gemini, Qwen, Cursor, Windsurf, Kiro, VS Code MCP settings and Copilot. StepSecurity's list adds Codex's auth.json, Gemini CLI OAuth credentials, Continue, Aider, Goose, opencode and others. If a DATABASE_URL is set, as on a LiteLLM proxy with a database, Upwind says it dumps the tables where the proxy stores every upstream provider key. The bundle is encrypted with an embedded public key and posted to http://www.litellm.dev/healthcheck. sitecustomize.py forks a background process that checks a file in the attacker's GitHub repository every hour and, if it names a domain, downloads and runs Python code from it. Upwind and AISLE say that file was empty when they looked, and Aikido says GitHub has since taken the repository down. On Windows, Upwind says the loader fails silently but the stealer still runs. On how the attacker got in: BerriAI says the release run was triggered and approved through three engineers' GitHub accounts using what appear to be stolen GitHub CLI OAuth tokens, and that it does not yet know how those tokens were obtained or whether the attacker still has other access. Credit where due: BerriAI answered the report within two hours, removed the images, revoked the tokens and has posted regular updates in the open. StepSecurity notes this is LiteLLM's second PyPI compromise this year; PyPI published an incident report on the first one in April.

How to check your app

Related on VibeIncidents

Sources

Corrections and updates

None. Re-checked against every source on Oct 21, 2026.

This subscribes you to our weekly email newsletter. Your address goes to Kit, our email provider, only to send it, and every issue has an unsubscribe link. This site sets no cookies. See our privacy policy.

Cite this entry
Title
LiteLLM 1.107.0 on PyPI and Docker shipped a credential stealer that also takes Claude Code, Cursor, Codex and Copilot logins
Added
Oct 21, 2026
URL
https://vibeincidents.com/incidents/litellm-1-107-0-pypi-docker-credential-stealer/
Suggested citation
VibeIncidents. "LiteLLM 1.107.0 on PyPI and Docker shipped a credential stealer that also takes Claude Code, Cursor, Codex and Copilot logins." Oct 21, 2026. https://vibeincidents.com/incidents/litellm-1-107-0-pypi-docker-credential-stealer/
This stealer went after the keys in your coding tools and cloud accounts. If you need to rotate a lot of them at once, LockedVibe has a free guide to rotating exposed API keys. LockedVibe is our sister company (same owner) and has no say over this entry. Disclosure.