Skip to content

Response, New York. Noah Park: Check Point Patches Actively Exploited Management Server Path Traversal. Detection, Dallas. Ava Okello: Report Finds Nearly Half of Deployed Detections Need Attention Before SOCs Can Trust Them.

SOCtember

Always First. Fast SOC News.

Wiz Threat Update graphic reading LiteLLM PyPI Package Compromised, Supply Chain Operation Steals Cloud and AI Creds.
Image: Wiz Research, LiteLLM Compromised, Steals Credentials, Oct 21, 2026 (fair use).

Response

LiteLLM Release Pipeline Hijacked With Stolen GitHub Tokens Shipped a Credential Stealer in Version 1.107.0, and Wiz Saw Stolen AWS Keys Tested for Bedrock Access Within Hours

The maintainers of the popular open-source AI gateway say attackers used three engineers' GitHub accounts to build a poisoned release from a lookalike repository. Any environment that installed litellm 1.107.0 from PyPI between 11:39 and 13:23 UTC, or ran the affected Docker tags, should be treated as compromised and every reachable secret rotated.

Noah Park, ResponseNew York6 min read

NEW YORK - Attackers hijacked the release pipeline of LiteLLM, an open-source gateway that many companies use to route traffic to OpenAI, Anthropic and other model providers, and on Wednesday pushed a version that quietly harvested cloud, browser and AI credentials from every machine that installed it, the project's maintainers said.

The poisoned build, version 1.107.0, was live on the Python Package Index from 11:39 to 13:23 UTC, according to an incident post by LiteLLM. Docker images tagged v1.107.0, latest, main-latest and main-stable pointed to the compromised build on Docker Hub from 11:46 to 14:20 UTC, and on the GitHub Container Registry from 11:46 UTC until they were made unavailable by 13:51 UTC. The project told open-source users to pin version 1.106.2 and said customers on its private enterprise registry were not affected.

LiteLLM incident post titled Contained: Oct 21, 2026 LiteLLM release v1.107.0 Compromised, with a summary of the compromised PyPI and Docker windows.
Screenshot: LiteLLM, Contained: Oct 21, 2026 LiteLLM release v1.107.0 Compromised, docs.litellm.ai, Oct 21, 2026 (fair use).

Three accounts, one lookalike repository

LiteLLM said the malicious actions were taken through three engineers' GitHub accounts, "appearing to be by way of stolen GitHub CLI OAuth tokens." The attacker used one account to change the release pipeline and trigger its project-releaser run, and a second account to approve it. All of the tokens involved have been revoked, the company said, and as a temporary measure it removed all but one unaffected user from its GitHub organization and cut trusted links between its public registries and that organization.

The official v1.107.0 source tag does not contain the malicious files, LiteLLM said; the artifacts were built from an attacker-controlled repository. Researchers at Wiz traced that repository to Berri-AI/litellm, a hyphenated variant of the legitimate BerriAI organization. Between 08:56 and 10:46 UTC, Wiz said, the attacker pushed 10 commits there that added the payload files, bumped the version number and added a single line to the build configuration, data = "cook", that told the build tool to bundle the malware into the wheel.

In an 18:30 UTC update on GitHub, the maintainers said they had identified a potential vector through which one of the tokens leaked but had not yet determined how the attacker moved to the other engineers' accounts. Ordinary releases are paused until the registries can be safely reopened. OX Security noted that this is the second compromise of LiteLLM this year, after versions 1.82.7 and 1.82.8 were poisoned in March.

GitHub issue 47826 on the BerriAI/litellm repository, titled litellm 1.107.0 compromised, listing PyPI removal, Docker tag removal and the SHA-256 hashes of all affected wheels.
Screenshot: GitHub, BerriAI/litellm issue 47826, security report on litellm 1.107.0, Oct 21, 2026 (fair use).

What the payload does

Installing the package drops three files into the root of site-packages: cook.pth, cook.py and sitecustomize.py. Because Python processes .pth files and sitecustomize.py at startup, the code runs whenever the interpreter starts, whether or not a project ever imports LiteLLM. Wiz said the combination of the two techniques appears to be the first documented case in the wild.

The stealer, which names itself privcollect, gathers browser passwords and cookies, SSH and GPG keys, shell histories, AWS, Google Cloud and Azure credentials including instance metadata tokens, and API keys for model providers, according to Wiz and the public GitHub security report. On a LiteLLM proxy it queries the proxy's own database for the LiteLLM_CredentialsTable, which holds the upstream provider keys. The haul is encrypted with AES-256-CBC, the key wrapped with RSA-4096, and posted to www.litellm[.]dev/healthcheck, a lookalike domain, with a hardcoded X-Token header.

The second file starts a background loop that checks a GitHub dead drop every hour for the address of a second-stage server. Wiz said the dead drop never held more than test values and GitHub had taken the repository down. Wiz also said the code shows "strong indications of LLM-aided development," including a dead code module and platform-specific code paths that fail silently on untested platforms such as Windows.

Wiz Research diagram titled LiteLLM 1.107.0 Payload Execution Flow, showing install, startup via cook.pth and sitecustomize.py, the 16-module credential stealer, encryption and exfiltration, and the remote code execution path.
Diagram: Wiz Research, LiteLLM 1.107.0 Payload Execution Flow, Oct 21, 2026 (fair use).

Stolen keys, tested for Bedrock

Wiz said it saw the stolen credentials put to use roughly four and a half hours after exfiltration. Between 16:20 and 17:01 UTC, the attacker validated AWS instance role credentials taken from compromised CI runners and Kubernetes nodes across multiple environments, connecting from 168.100.8[.]57 and 165.227.201[.]8. Each credential was checked with sts:GetCallerIdentity, followed by bedrock:ListFoundationModels and a ListModels call, a pattern Wiz described as consistent with LLMjacking, the theft of paid model access. In a small number of environments the attacker also enumerated IAM roles, users and access keys and ran discovery calls such as DescribeTrails.

What response teams should do now

  • Find every environment, CI runner, notebook and container that ran litellm 1.107.0 (pip show litellm) or the image index sha256:1bbcb1443bc962e45f5aad53fe3d2c30600e0379715fb6c664cdd3ac126c339e, and treat it as compromised, as LiteLLM advises.
  • Search hosts for cook.pth or sitecustomize.py in site-packages, the marker file /tmp/.pc_once_72129118c59f5636c0bb and the environment variable PRIVCOLLECT_ACTIVE=1.
  • Search DNS, proxy and egress logs for litellm[.]dev and the X-Token header XWiA8gZNa7NcX2XRoAEb.
  • Rotate every secret those machines could reach: model provider keys, including those stored in a LiteLLM proxy database, cloud credentials, SSH keys, GitHub and package registry tokens.
  • Review CloudTrail for sts:GetCallerIdentity followed by Bedrock model listing from 168.100.8[.]57 or 165.227.201[.]8, and for IAM enumeration by instance roles that never call those APIs.
  • Pin LiteLLM to 1.106.2 or another explicit earlier version, by digest for containers, and avoid floating tags until the project reopens its registries.

Sources:


Noah Park covers incident response and blue-team operations for SOCtember from New York.

Related stories

Response desk