Shedding The Lite: Unfolding The Dramatic Turn of Events with the LiteLLM Compromise

user profileexternal writer image
Security Developer, Software Engineer

Key Highlights

  • What Happened: On March 24, 2026, the self-proclaimed “TeamPCP” threat actor compromised the PyPI publishing credentials for LiteLLM, a highly popular open-source library used to route requests across various LLM providers. They published two backdoored versions (1.82.7 and 1.82.8), with malicious code injected directly into the distributed wheels. When triggered, it orchestrated a three-stage attack: Harvesting credentials, attempting lateral movement across Kubernetes clusters, and installing a persistent systemd backdoor that polls for additional payloads.
  • What’s The Blast Radius: LiteLLM is an extremely popular library, boasting an impressive 95 million monthly downloads (according to https://pypistats.org/packages/litellm). Version 1.82.6 is the most recent release known to be free of issues.
  • What Is The Immediate Action: Check every development environment, be it local or in a CI/CD pipeline for the following installed packages: litellm:1.82.7, litellm:1.82.8, and work through the mitigation guidelines detailed below.

The blast radius of the supply chain attacks that started in late February 2026 has reached PyPI.

Following the intricate Github Actions supply chain attacks on Aquasec’s Trivy and Checkmarx’ `kics-github-action`, the threat actor ventures deep into a core library used as a gateway for AI models. One of the maintainers of LiteLLM notes that the breach originates from trivy used in their CI/CD pipelines. (https://news.ycombinator.com/item?id=47502858)

Breach Timeline:

Pre-incident (March 19–23): The threat actor group TeamPCP compromised the Trivy security scanner. LiteLLM’s CI/CD pipeline, which used Trivy, inadvertently exfiltrated the project’s PyPI publishing tokens to the attackers.

10:39 AM: The attackers use the stolen tokens to publish v1.82.7 of litellm to PyPI. This version contains a malicious payload hidden in proxy_server.py.

10:52 AM: A second malicious version, v1.82.8, is published. It introduces a more aggressive delivery method using a .pth file (litellm_init.pth), which executes as soon as the Python interpreter starts.

11:48 AM: Security researcher Callum McMahon (FutureSearch) opens GitHub Issue #24512 after his development machine crashes due to a “fork bomb” side effect caused by the malicious .pth file.

12:44 PM: The attacker, still possessing maintainer access, attempts to suppress the discovery by closing the GitHub issue and flooding the thread with bot-generated comments.

1:38 PM: PyPI admins take emergency action and quarantine the entire litellm package, blocking all new downloads and removing the malicious versions.

Filling the Gap: From CI/CD to the Developer

What differentiates this attack from the earlier ones noted, is that instead of being executed in the CI/CD pipeline itself, it has reached into the developers’ machines and production environments. That means that the breach is no longer contained within the build process; it has successfully transitioned into a downstream execution attack. By poisoning a trusted library like LiteLLM, the threat actor shifted from attacking the factory to poisoning the product delivered to millions of users.

Unfolding the Attack: A Three-Stage Payload

Once a developer or a production server runs pip install litellm (grabbing versions 1.82.7 or 1.82.8), the malicious code hidden within the wheel’s distribution files executes automatically. The analysis of the backdoor reveals a sophisticated, multi-stage execution flow:

Stage 1: Credential Theft

The primary objective upon execution is environment discovery. The script immediately scans for environment variables and configuration files associated with cloud providers and AI services. This includes:

  • AI Provider Keys: OpenAI, Anthropic, and Azure secrets stored in ENV variables.
  • Cloud Metadata: AWS/GCP/Azure credentials used by the SDKs.
  • Local Files: Extraction of .kube/config and .aws/credentials from the home directory.

Stage 2: Lateral Movement (K8S Exploitation)

If the infected library is running within a Kubernetes cluster, the code attempts to utilize the local service account token. It probes the internal K8s API to identify other pods, services, and secrets. The goal is to find a path to a more privileged node or a sensitive database within the cluster.

Stage 3: Backdoor Persistence

In this stage, the malware attempts to gain root or sudo privileges to install a persistent systemd unit. This service is designed to masquerade as a legitimate system process. Once active, it begins a “beaconing” process, reaching out to a Command & Control (C2) server controlled by TeamPCP to receive further instructions or secondary payloads.

Indicators of Compromise:

Category Indicator Description
Affected Versions litellm: 1.82.7, 1.82.8 Malicious versions published to PyPI by TeamPCP.
Malicious Files litellm_init.pth Located in site-packages/. Triggers execution on any Python startup (v1.82.8).
Malicious Files litellm/proxy/proxy_server.py Contains obfuscated Base64 injection (v1.82.7).
Persistence ~/.config/sysmon/sysmon.py The core backdoor script installed for local persistence.
Persistence sysmon.service Systemd unit located in ~/.config/systemd/user/.
Service Name System Telemetry Service The display name used by the malicious systemd unit.
Exfiltration Domain models.litellm.cloud Primary C2/Exfiltration endpoint for the LiteLLM phase.
C2 Domain checkmarx.zone Legacy C2 used in v1.82.7 and previous KICS attacks.
Exfiltration Archive tpcp.tar.gz The temporary local filename used to bundle stolen secrets.
K8s Workload node-setup-* Pods deployed to the kube-system namespace for lateral movement.
K8s Images alpine:latest Used by the attacker to mount the host filesystem via privileged pods.
Dead-Drop C2 github.com/tpcp-docs-* Attacker-controlled repositories used as fallback data drops.

Conducting an Investigation:

Beyond IoCs, general developer awareness is a powerful shortcut to mitigation. A defining characteristic of this attack is the massive RAM consumption caused by the litellm_init.pth launcher. Because it spawns a child process on every interpreter startup, it creates an exponential fork loop that can quickly freeze a machine. This is caused by a bug in the malware. If your team reports sudden, extreme system lag or memory exhaustion while working with LiteLLM, consider it a primary indicator of compromise. Recognizing this behavioral indicator early can save hours of investigation and help you roll back to version 1.82.6 immediately.

Moreover, it is highly advised to check if you’ve upgraded or installed litellm on, or after the 24th of March. Run `pip show litellm` and check for the version, and also check for related uv caches.

Next up, to get a wider view of the entire organization’s stance on the specific malicious pinned versions, we’ll demonstrate utilizing the Context Intelligence Graph to pin down developers in the organization that were potentially compromised.

First up, we can query all the users that cloned the specific repository that was associated with the malicious dependencies:

A Context Intelligence Graph query showing us users that are related to the repository that had malicious litellm versions in it.

This gives us visibility to who cloned or comthe repository which is related to the pinned malicious dependency. The power and control this query gives us is immensely important, as it doesn’t matter when the user cloned the repository that contained the malicious package, even if it was remotely mitigated to another version, since as soon as they execute a command like `poetry install` the execution mechanism described earlier will start exfiltrating secrets.

The results of a graph query showing the findings of a user related to a repository contaminated with the compromised package

To pinpoint potentially compromised accounts, security teams should pivot to their logging platforms (e.g., CrowdStrike) and hunt for outbound requests to models.litellm.cloud and checkmarx.zone. This step further helps isolate which specific users were exposed to these indicators.

Moreover, search for K8S pods in your environment that have been deployed with the metadata name containing “node-setup-*”, as in the malware code itself, it is assigned “node-setup-{node_name[:35]}”, and the namespace assigned is “kube-system”

A Context Intelligence Graph query searching for Kubernetes pods that have been exploited by the script’s lateral movement deployment attempts (matching by name and namespace)

Mitigation Guidelines: Securing Your Environment

If you’ve recently interacted with LiteLLM, speed is of the essence. Follow these steps to secure your infrastructure:

1. Immediate Version Rollback

Force a downgrade to the last known safe version. Do not simply uninstall; ensure your requirements.txt or pyproject.toml is strictly pinned to the latest known safe version.

pip install litellm==1.82.6

2. Audit and Purge

  • CI/CD Pipelines: Clear all build caches in GitHub Actions, GitLab CI, or Jenkins. If you use self-hosted runners, consider them compromised and rebuild the underlying images.
  • Local Environments: Search for the persistence unit. Check for any suspicious services in /etc/systemd/system/ or ~/.config/systemd/user/.

3. Rotate Every Secret

Assume any secret accessible to your LiteLLM environment is compromised. This is the most labor-intensive but critical step:

  • Rotate all LLM API keys (OpenAI, Anthropic, etc.).
  • Invalidate and reissue AWS/GCP/Azure IAM keys.
  • Rotate Kubernetes service account tokens.

4. Network Egress Filtering

The TeamPCP backdoor relies on reaching out to a C2 server. Implement strict egress filtering on your production clusters and developer VPCs. If a pod doesn’t need to talk to the open internet, it shouldn’t be able to.

Where Cycode Comes In: Neutralizing Supply Chain Threats with Cimon

The LiteLLM compromise proves a sobering point: traditional security perimeters are no longer enough. When a trusted library is subverted, the attack moves faster than most manual response teams can react. This is exactly why we developed Cimon, Cycode’s innovative solution for software supply chain security.

Runtime Prevention and “Learning Mode”

While the backdoor relies on reaching out to Command & Control (C2) servers to receive instructions, Cimon provides a critical line of defense at the execution level. By integrating into your CI/CD pipelines and build environments, Cimon monitors the network behavior of every process.

  • Runtime Blocking: Cimon can automatically prevent access to malicious or unauthorized endpoints in real-time during the build process. Even if a poisoned version of LiteLLM is installed, its attempt to exfiltrate data would be instantly blocked.
  • Behavioral Detection: Using its advanced Learning Mode, Cimon establishes a baseline of “normal” behavior for your builds. When a library suddenly deviates from that baseline, such as LiteLLM attempting to communicate with an unknown IP address or a host name in a different jurisdiction – Cimon flags the anomaly immediately, giving you visibility on anomalous behavior.

Cimon can be easily configured to run in your CI/CD pipelines (Github, Gitlab, Harness, and more) and provide the build hardening required. 

Example using Github Actions:

jobs:
  build-and-push:
    runs-on: ubuntu-latest
    steps:
      - uses: cycodelabs/cimon-action@v0
        with:
          client-id: ${{ secrets.CIMON_CLIENT_ID }}
          secret: ${{ secrets.CIMON_SECRET }}
          prevent: true
          allowed-hosts: >
            objects.githubusercontent.com
            proxy.golang.org
            storage.googleapis.com
          allowed-ips: >
            34.121.34.97

When the run finishes, the following report is generated and sent to the Cycode platform, where it can be conveniently shown in the Inventory page, or the Context Intelligence Graph itself.

Information card displayed by the Build Report generated by Cimon and ingested into the platform, showcasing blocked malicious endpoints.

Followed by the data of the network connections attempted by the build itself:

Specific view of the blocked endpoints in the “Network” tab from the information card.

These build reports are also sent to the Cycode platform for a centralized location to query for finding in the graph:

A Context Intelligence Graph query to search for build reports sent from Cimon that might have contained malicious hosts in its network events. This serves as a strong indicator to the blast radius in the organization, if Cimon is applied to all pipelines.

Continuous Visibility and Threat Intelligence with Context Intelligence Graph

Securing the present is only half the battle, and visibility on the state of existing code is critical. Cycode runs constant Threat Intelligence feeds that are updated moments after a breach like the LiteLLM incident is confirmed.

Threat Intelligence updates from the Cycode dashboard following the LiteLLM compromise

Our Context Intelligence Graph allows queries throughout your entire codebase and dependency tree for the specific pinned malicious versions (1.82.7 and 1.82.8). Instead of manually auditing hundreds of repositories, Cycode gives you a “single pane of glass” view of exactly where the risk lives, who introduced it, and its impact across the organization. 

In an era where the tools we use to secure our code are being turned against us, Cimon and the Cycode platform provide the visibility and automated enforcement needed to restore trust in the software supply chain.