The compromise boundary is artifact-specific, not repository-wide. Affected: every one of the seven wheel artifacts published as litellm==1.107.0; there is no safe platform or ABI wheel for that version. The official OCI tags reported as affected were v1.107.0, latest, main-latest, and main-stable on GHCR/Docker Hub—scope them by the manifest and layer digests resolved during the incident window, because current tag targets may differ. Not shown compromised: the legitimate GitHub v1.107.0 source tag, reportedly clean; that does not authenticate the PyPI or container artifacts. The available evidence does not provide the seven filenames, their SHA-256 values, the affected OCI digests, or a definitive status for any source distribution, so none of those should be declared clean without digest-level verification.
The execution threshold is:
- Wheel downloaded or image pulled: contaminated artifact present, but no demonstrated payload execution.
- Wheel installed: contaminated environment because
cook.pth, cook.py, and sitecustomize.py were placed in site-packages; installation alone is not proof that the newly installed startup hook ran.
- Any subsequent Python interpreter start in that environment: presume execution, even if LiteLLM was never imported, because
.pth/sitecustomize startup processing activates the payload.
- Affected container started: presume execution if its normal entrypoint or startup script launched Python. A pull-only event, or a container started with an overridden non-Python entrypoint, is not by itself proof—but verify runtime telemetry rather than relying on configuration intent.
- CI startup hooks: any later Python-bearing step on the same runner or virtual environment crosses the execution boundary. The reported hourly loader also means a long-lived process can acquire additional attacker code after initial execution.
The minimum purge must cover more than production: local pip caches, centralized PyPI proxies, wheelhouses, dependency caches, CI workspaces and virtual environments, Docker build caches, registry mirrors, node image stores, and cached OCI layers matching the affected digests. Rebuild every downstream wheel, container, function layer, appliance image, or deployment bundle produced after consuming 1.107.0—even if LiteLLM was only a build-time dependency. Rebuild from a known-good base, use 1.106.2 or another verified release, and pin the wheel and image by cryptographic digest rather than version or tag.
Credential rotation is execution-dependent. Pull-only—and installation followed by demonstrably no Python startup—does not automatically require rotation. Once Python ran, revoke and replace every secret accessible to that process or runner: cloud and registry credentials, CI job tokens, GitHub OAuth/PAT credentials, PyPI tokens, signing keys, SSH/GPG material, LLM-provider keys, environment secrets, and mounted service credentials. Investigate package-resolution and proxy logs, exact wheel hashes, OCI pull and runtime events, GitHub audit/workflow approvals, the reported GitHub CLI OAuth tokens associated with three engineers, registry pushes, build provenance, and secret access. Initial access through the publicly exposed internal deployment remains reported but unconfirmed, so the CI investigation must not assume that root-cause chain is complete.