Mar 25, 2026·6 min read·66 visits
Malicious actors published LiteLLM versions 1.82.7 and 1.82.8 to PyPI after stealing publisher credentials via a compromised GitHub Action. The malware automatically executes on Python startup to steal cloud, developer, and AI credentials, while attempting lateral movement within Kubernetes clusters.
Threat actors compromised the CI/CD pipeline of the LiteLLM package by poisoning a dependency, allowing them to steal PyPI publisher credentials. These credentials were used to publish two malicious versions of LiteLLM that deploy a persistent credential harvester and Kubernetes worm via Python's .pth file mechanism.
The LiteLLM package, a widely used AI management library and gateway, was the target of a sophisticated supply chain attack on March 24, 2026. Threat actors successfully bypassed repository security controls to publish two malicious package versions, 1.82.7 and 1.82.8, directly to the Python Package Index (PyPI). This compromise did not stem from a vulnerability in the LiteLLM source code itself, but rather a targeted attack against its build environment and release pipeline.
The malicious packages functioned as multi-stage malware designed to harvest sensitive developer and infrastructure credentials. Because LiteLLM operates as an AI gateway, it naturally processes and has access to high-value AI provider API keys (such as OpenAI and Anthropic), making it a lucrative target for credential theft. The exposure window lasted approximately three hours before PyPI security teams quarantined and removed the affected artifacts.
This incident highlights the critical risk posed by implicit trust in CI/CD pipeline dependencies. By compromising a third-party security scanning action, the attackers gained the execution privileges necessary to extract deployment secrets, entirely circumventing branch protection rules and multi-factor authentication requirements enforced at the repository layer.
The initial access vector for this supply chain compromise was the poisoning of a third-party GitHub Action used within the LiteLLM continuous integration pipeline. On March 19, 2026, the threat actor group identified as TeamPCP compromised the release tags for aqua-security/trivy-action, an open-source container security scanner. This action was explicitly defined as a step in the LiteLLM build workflow.
When the LiteLLM CI/CD pipeline executed using the poisoned Trivy action tags, it unknowingly pulled down and executed malicious shell code embedded by the attackers. This code was specifically engineered to access the runner's environment variables and memory space during the build process, allowing it to capture the PyPI publisher API tokens provisioned for the release job.
Possessing the valid PyPI publisher credentials, the threat actors no longer needed access to the LiteLLM GitHub repository. On March 24, 2026, they authenticated directly to the PyPI registry API and published the backdoored versions. This sequence demonstrates a classic CI/CD pivot, where a compromised tertiary dependency (Trivy action) leads to the compromise of primary deployment credentials.
The malware embedded within the published LiteLLM packages utilized Python's Path Configuration (.pth) file mechanism to guarantee execution and maintain persistence. When a Python package is installed via pip, .pth files included in the distribution are placed directly into the environment's site-packages directory.
During the initialization phase of the Python interpreter, the site module automatically scans the site-packages directory for any files ending in .pth. If a .pth file contains an executable statement prefixed with import, the interpreter evaluates and executes that code before any user scripts are run. The attackers leveraged this feature by embedding their stage-one payload invocation within a .pth file distributed with the malicious LiteLLM wheels.
This mechanism ensures the malware executes every time the Python interpreter starts within the compromised environment. The victim does not need to explicitly import litellm in their code; merely having the malicious package installed in the active virtual environment or system path is sufficient to trigger the payload upon any Python execution.
The embedded malware executes a sophisticated three-stage payload focused on broad credential theft and lateral movement. Stage 1 is an exhaustive information collection phase. The script traverses standard directory locations to harvest cloud provider credentials (targeting ~/.aws/credentials, GCP, and Azure configurations), SSH private keys (~/.ssh/), local .env files, and local cryptocurrency wallet data. Given the context of LiteLLM, it also aggressively scans environment variables for AI provider API keys.
Stage 2 handles the exfiltration of the harvested data. To evade rudimentary network-based data loss prevention (DLP) systems, the malware locally encrypts the aggregated secrets before transmission. The encrypted payload is then exfiltrated via HTTPS to models.litellm.cloud, a domain registered by the threat actors on March 23, 2026, specifically to masquerade as legitimate LiteLLM telemetry or model-fetching traffic.
Stage 3 introduces significant operational risk to containerized environments by deploying a "Kubernetes worm" module. This component inspects the local file system for injected Kubernetes service account tokens, typically mounted at /var/run/secrets/kubernetes.io/serviceaccount/token. If found, the malware uses the token to interact with the Kubernetes API, attempting to enumerate the cluster and move laterally to other pods or nodes.
The installation of LiteLLM version 1.82.7 or 1.82.8 results in a total loss of confidentiality for all secrets accessible to the Python environment's user context. Organizations must treat any system, container, or CI runner that installed these specific versions as fundamentally compromised. The impact extends beyond the immediate host, as the exfiltrated cloud credentials and Kubernetes tokens enable attackers to pivot into the broader infrastructure.
Immediate remediation requires isolating the affected environments from the network to halt ongoing exfiltration and lateral movement attempts. The malicious packages must be uninstalled, and dependencies should be pinned to known safe versions, such as 1.82.6 or verified subsequent releases. Forensic analysis should inspect network logs for connections to models.litellm.cloud to confirm if exfiltration occurred.
The most critical remediation step is comprehensive secret rotation. Because the malware indiscriminately harvests local state, administrators must systematically revoke and reissue all AWS/GCP/Azure IAM keys, GitHub Personal Access Tokens, SSH private keys, and AI provider API keys that were present on the affected systems. Failure to rotate these credentials leaves the infrastructure vulnerable to subsequent access by the threat actors, even after the malware is removed.
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H| Product | Affected Versions | Fixed Version |
|---|---|---|
litellm LiteLLM | 1.82.7 - 1.82.8 | Removed from PyPI |
| Attribute | Detail |
|---|---|
| Attack Vector | Supply Chain / CI/CD Poisoning |
| Execution Mechanism | Python .pth File Initialization |
| CWE ID | CWE-506 (Embedded Malicious Code) |
| Impact | Credential Theft and Lateral Movement |
| Exploit Status | Active Exploitation (March 2026) |
| Malicious Domain | models.litellm.cloud |
The product contains embedded malicious code, such as a time bomb, logic bomb, or trojan horse.
An in-depth security audit of the skillctl command-line package manager revealed five critical and high-severity security vulnerabilities. The identified flaws span parameter-level command argument injection via the source_sha parameter, uncontrolled resource consumption (Denial of Service) through unnamed UNIX FIFOs and character devices, directory path traversal in the destination argument, commit-message trailer forgery via newline injection in skill names, and local credential exfiltration leveraging UNIX hardlinks. These vulnerabilities represent significant vectors for workstation compromise when executing agentic tasks in repositories containing untrusted files or pull requests. Remediation was introduced in version v0.1.3.
CVE-2026-48153 is a Server-Side Request Forgery (SSRF) vulnerability in the Budibase OAuth2 SDK prior to version 3.39.0. It allows authenticated low-privileged users to bypass outbound network security blacklists and send arbitrary requests to internal subnets or cloud metadata services.
The self-hosted Slack Nebula VPN control plane, nebula-mesh, stored high-privilege enrollment tokens in plaintext inside its SQLite database. This flaw allowed any adversary with read access to the database to retrieve pending tokens and enroll unauthorized hosts into the secure VPN mesh.
The devbridge-autocomplete package (jQuery-Autocomplete) fails to escape category headers and suggestion values when using default formatters formatGroup and formatResult. If suggestions contain untrusted input, arbitrary HTML and JavaScript execute directly in the victim's browser session.
OpenCTI versions prior to 6.1.9 fail to properly restrict GraphQL schema introspection queries due to a weak pattern-matching implementation. An unauthenticated attacker can bypass the introspection block list by stripping whitespace and carriage returns, enabling complete reconnaissance of the GraphQL schema.
An unrestricted file upload vulnerability in Paymenter's support ticket system (prior to version 1.2.11) allows authenticated users to upload arbitrary PHP scripts to a web-accessible directory. The application fails to validate file extensions or MIME types before storing the files, enabling remote code execution under the web server's privilege context.