Science1 distinct publisher3 min readUpdated
GitGuardian says the TeamPCP campaign poisoned two LiteLLM releases on PyPI to harvest SSH keys, cloud credentials and API tokens. Detection is the cheap part of this job.
The Scientist · Science desk
Compiled by The ScientistSomething wrong?How this is made
Two releases of LiteLLM, versions 1.82.7 and 1.82.8, were published to PyPI carrying infostealer malware attributed by GitGuardian to a threat actor it calls TeamPCP [1][2]. PyPI maintainers pulled the packages quickly, but GitGuardian says the damage window was still significant, and its cybersecurity researcher Guillaume Valadon said LiteLLM "is downloaded millions of times a day, and it is highly likely that the blast radius is significant, despite PyPI's quick response in removing the malicious package" [3][4].
What the malware collected sets the scope of the cleanup. According to GitGuardian, it harvested SSH keys used to reach production servers, cloud credentials for AWS, Azure and GCP, Docker configurations, and information tied to crypto wallets [5]. That is not a list of things you monitor. It is a list of things you replace.
The detection guidance is worth running anyway. GitGuardian lists outbound connections from Python to scan.aquasecurtiy.org (45.148.10.212), checkmarx.zone (83.142.209.11), models.litellm.cloud and litellm.cloud as indicators, along with Python spawning curl, kubectl, find and xargs, or openssl [6][7]. Note that two of those hostnames are misspelled or off-brand lookalikes of security vendor names, which is a reasonable way to slip past an analyst skimming egress logs [8]. On disk, the checks are a backdoor at ~/.config/sysmon/sysmon.py, a user-level sysmon.service unit, and a litellm_init.pth file that GitGuardian says executes on Python startup [9]. A .pth file means the payload does not wait for anyone to import LiteLLM. There is also a Kubernetes check for worm pods whose names begin with node-setup- [10].
The important thing about that list is what a clean result proves, which is not much. None of those artifacts being present today rules out that a developer ran pip install once, shipped their key material, and the process exited. If a machine or a build runner installed 1.82.7 or 1.82.8, the credentials it held are burned, and the work is enumerating them: SSH keys, cloud access keys and roles, registry tokens, API keys in dotfiles and environment files, and anything those credentials could mint downstream.
Build systems are where this gets expensive. GitGuardian recommends auditing GitHub Actions, GitLab CI, CircleCI, Jenkins and similar automation for the two versions, checking requirements.txt, Pipfile and pyproject.toml, workflow configuration, container image definitions and Dockerfiles, and build and deployment scripts, with a manual review of every active branch and CI configuration [11][12]. Chainguard chief executive Dan Lorenc raised concern on LinkedIn about CI/CD systems in the context of this attack [13]. A pipeline credential typically has broader rights than a laptop credential and is rotated less often, which inverts the usual triage order.
Two caveats on sourcing. All of this comes from a single vendor account, published by a company that sells secrets detection, and GitGuardian says the same infostealer was used in the earlier Trivy campaign, which is its attribution rather than an independently confirmed link [14][15]. The report dates its own disclosure to a Tuesday without giving a calendar date [2].
What to watch: whether anyone publishes install counts for the two versions during the window, which would turn Valadon's estimate into a number; whether the sysmon persistence shows up on machines that never installed LiteLLM, which would indicate lateral movement; and whether the node-setup- pods appear in clusters, since that is the difference between a laptop cleanup and a production incident [3][9][10].
Follow any of these and your For You feed starts watching them — no settings page required.
Ranked by verification strength, evidence, and original report placement.
The TeamPCP supply chain attack compromised LiteLLM packages versions 1.82.7 and 1.82.8 on the PyPI software registry.
GitGuardian reported on Tuesday that the TeamPCP threat actor had poisoned LiteLLM packages with infostealer malware; no calendar date is given in the post.
The infostealer harvested SSH keys for accessing production servers, cloud credentials for AWS, Azure and GCP, Docker configurations, and information tied to crypto wallets, from developer machines.
Indicators of compromise include network access from Python to scan.aquasecurtiy.org / 45.148.10.212, checkmarx.zone / 83.142.209.11, models.litellm.cloud and litellm.cloud.
Indicators also include process execution from Python of curl, kubectl, find and xargs, and openssl.
GitGuardian's on-host checks are: a sysmon backdoor at ~/.config/sysmon/sysmon.py, a user systemd service sysmon.service, and a malicious litellm_init.pth file that executes on Python startup.
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
Specific artifacts, single vendor source
The technical core is unusually concrete for a one-source story: named package versions, four exfiltration hostnames with two IPs, process-execution patterns, three persistence artifacts and a cluster hunt command. Against that, every fact comes from one vendor blog with no CVE, PyPI advisory, maintainer statement, malware hashes or second publisher, and the disclosure is dated only as 'Tuesday'.
Real incident, unmeasured exposure
Two adoption facts are documented: the poisoned versions actually shipped through PyPI before removal, and GitGuardian shipped a response script on GitHub. What is absent is scale, and it matters here: the only exposure figure in the source is a single confirmed developer machine, with download volume and victim counts left as assertions. Real but essentially unquantified uptake of both the malicious artifact and the response tooling.
Severity framing outruns disclosed impact
Modestly overstated. The detection content is sober and checkable, but the framing (significant blast radius 'highly likely', keys to your entire infrastructure, days of manual work compressed into minutes) is louder than the single confirmed machine and the absent download or victim numbers justify, and it comes from the vendor whose product is the recommended remedy. The gap is in interpretation and urgency, not in the indicator list.
Vendor-authored response marketing
Strongly incentivised reporting. The only source is a secrets-detection vendor documenting a secrets-theft incident, closing with its ggshield CLI, a GitHub script that feeds files into its detection engine, and its incident management dashboard as the fast path to remediation. A supplier-adjacent executive quote (Chainguard's CEO on CI/CD exposure) reinforces the same market thesis. This does not invalidate the indicators, but it shapes emphasis and urgency.
Actionable specifics, one interested voice
Confidence is split. The falsifiable parts (version numbers, hostnames, IPs, file paths, kubectl and systemctl checks) are precise enough to verify locally within minutes, so acting on them is low-regret. The interpretive parts (blast radius, Trivy malware reuse, containment to development environments) rest on a single commercially interested publisher with no date, no corroboration and no aggregate telemetry, so overall confidence in the story's scale stays below the midpoint.
security
The 2,500-org compromise was a Trivy problem. LiteLLM was the closing act.1 distinct publisher
science
LiteLLM's 40 minutes on PyPI: 153GB of loot, 2,488 named orgs, and the victims nobody can name1 distinct publisher
build
Flux moves GitOps' source of truth into registries you own, and mirroring becomes the prerequisite1 distinct publisher
leadership
VECT 2.0 shreds anything over 128 KB, which makes paying its ransom pointless1 distinct publisher
Distinct publishers with included, body-backed reporting in this cluster.
1 article · August 19, 2026