{"id":377,"date":"2026-03-24T20:19:21","date_gmt":"2026-03-24T20:19:21","guid":{"rendered":"https:\/\/thedigitalfortress.us\/?p=377"},"modified":"2026-03-24T20:19:21","modified_gmt":"2026-03-24T20:19:21","slug":"teampcp-backdoors-litellm-versions-1-82-7-1-82-8-likely-via-trivy-ci-cd-compromise","status":"publish","type":"post","link":"https:\/\/thedigitalfortress.us\/?p=377","title":{"rendered":"TeamPCP Backdoors LiteLLM Versions 1.82.7\u20131.82.8 Likely via Trivy CI\/CD Compromise"},"content":{"rendered":"<div id=\"articlebody\">\n<div class=\"separator\" style=\"clear: both;\"><a href=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEhmubYXPf6QmmyAgoyu58-O141BOTc-D3aKKUtKXg1IFX6pn4Wav7yspHRPiWKScygEd1vsHmeH5zQLjwG38pOlDggYgjBN7MzUTrb_3jQv_lXum7s7PXGo8aqvSws4QEkrC587wgBhgF5tmPEmhK_OCeTLm8YlcWxyw2-nQMiM9VS8VdC22-tDkVM5MEsb\/s1700-e365\/lite.jpg\" style=\"clear: left; display: block; float: left;  text-align: center;\"><\/a><\/div>\n<p>TeamPCP, the threat actor behind the recent compromises of Trivy and KICS, has now compromised a popular Python package named <a href=\"https:\/\/pypi.org\/project\/litellm\/\" rel=\"noopener\" target=\"_blank\">litellm<\/a>, pushing two malicious versions containing a credential harvester, a Kubernetes lateral movement toolkit, and a persistent backdoor.<\/p>\n<p>Multiple security vendors, including <a href=\"https:\/\/www.endorlabs.com\/learn\/teampcp-isnt-done\" rel=\"noopener\" target=\"_blank\">Endor Labs<\/a> and <a href=\"https:\/\/research.jfrog.com\/post\/litellm-compromised-teampcp\/\" rel=\"noopener\" target=\"_blank\">JFrog<\/a>, revealed that litellm versions 1.82.7 and 1.82.8 were <a href=\"https:\/\/futuresearch.ai\/blog\/litellm-pypi-supply-chain-attack\/\" rel=\"noopener\" target=\"_blank\">published<\/a> on March 24, 2026, likely stemming from the <a href=\"https:\/\/github.com\/BerriAI\/litellm\/blob\/9343aeefca37aa49a6ea54397d7615adae5c72c9\/ci_cd\/security_scans.sh#L80\" rel=\"noopener\" target=\"_blank\">package&#8217;s use of Trivy<\/a> in their CI\/CD workflow. Both the backdoored versions have since been removed from PyPI.<\/p>\n<p>\u00abThe payload is a three-stage attack: a credential harvester sweeping SSH keys, cloud credentials, Kubernetes secrets, cryptocurrency wallets, and .env files; a Kubernetes lateral movement toolkit deploying privileged pods to every node; and a persistent systemd backdoor (sysmon.service) polling &#8216;checkmarx[.]zone\/raw&#8217; for additional binaries,\u00bb Endor Labs researcher Kiran Raj said.<\/p>\n<div class=\"dog_two clear\">\n<div class=\"cf\"><a href=\"https:\/\/thehackernews.uk\/not-fast-enough-d\" rel=\"nofollow noopener sponsored\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\"lazyload\" alt=\"Cybersecurity\" src=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEhlXM830ruQd2xT6M7JNeNRjaFa1onD12WjSCHihTFMTzbyfT9h-irPmXy_h3E1HGSs6sdv7FTmnyNVTM5kmSb7BuUtZe8gKoTQt99P1sSzRcqqXpOJP6eoAOhR3DGb6qHx9kOZ_HBZUMmVnsnd0DM7QfUp81bgzTvvgLww6oqB-EhnDfWXH5pWCYhAsyLs\/s728-e100\/tl-d.jpg\" width=\"729\" height=\"91\"\/><\/a><\/div>\n<\/div>\n<p>As observed in previous cases, the harvested data is exfiltrated as an encrypted archive (\u00abtpcp.tar.gz\u00bb) to a command-and-control domain named \u00abmodels.litellm[.]cloud\u00bb via an HTTPS POST request.<\/p>\n<p>In the case of 1.82.7, the malicious code is embedded in the \u00ablitellm\/proxy\/proxy_server.py\u00bb file, with the injection performed during or after the wheel build process. The code is engineered to be executed at module import time, such that any process that imports \u00ablitellm.proxy.proxy_server\u00bb triggers the payload without requiring any user interaction.<\/p>\n<p>The next iteration of the package adds a \u00abmore aggressive vector\u00bb by incorporating a malicious \u00ablitellm_init.pth\u00bb at the wheel root, causing the logic to be executed automatically on every Python process startup in the environment, not just when litellm is imported.<\/p>\n<p>Another aspect that makes 1.82.8 more dangerous is the fact that the .pth launcher spawns a child Python process via <a href=\"https:\/\/docs.python.org\/3\/library\/subprocess.html#popen-constructor\" rel=\"noopener\" target=\"_blank\">subprocess.Popen<\/a>, which allows the payload to be run in the background.<\/p>\n<p>\u00abPython .pth files placed in site-packages are processed automatically by site.py at interpreter startup,\u00bb Endor Labs said. \u00abThe file contains a single line that imports a subprocess and launches a detached Python process to decode and execute the same Base64 payload.\u00bb<\/p>\n<p>The payload decodes to an orchestrator that unpacks a credential harvester and a persistence dropper. The harvester also leverages the Kubernetes service account token (if present) to enumerate all nodes in the cluster and deploy a privileged pod to each one of them. The pod then <a href=\"https:\/\/en.wikipedia.org\/wiki\/Chroot\" rel=\"noopener\" target=\"_blank\">chroots<\/a> into the host file system and installs the persistence dropper as a systemd user service on every node.<\/p>\n<p>The systemd service is configured to launch a Python script (\u00ab~\/.config\/sysmon\/sysmon.py\u00bb) \u2013 the same name used in the Trivy compromise \u2013 that reaches out to \u00abcheckmarx[.]zone\/raw\u00bb every 50 minutes to fetch a URL pointing to the next-stage payload. If the URL contains youtube[.]com, the script aborts execution \u2013 a kill switch pattern common to all the incidents observed so far.<\/p>\n<p>\u00abThis campaign is almost certainly not over,\u00bb Endor Labs said. \u00abTeamPCP has demonstrated a consistent pattern: each compromised environment yields credentials that unlock the next target. The pivot from CI\/CD (GitHub Actions runners) to production (PyPI packages running in Kubernetes clusters) is a deliberate escalation.\u00bb<\/p>\n<p>With the latest development, TeamPCP has waged a relentless supply chain attack campaign that has spawned five ecosystems, including GitHub Actions, Docker Hub, npm, Open VSX, and PyPI, to expand its targeting footprint and bring more and more systems into its control.<\/p>\n<div class=\"separator\" style=\"clear: both;\"><a href=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEj2MLE-4dZUVruezq6H1P8KknTiMCxU1F6FA_JERQY6dlH44l4gmecsbB3WAW4njsQJvmN_7WIm62kDgQi3fG2w9UFQVfYE5WZGBd5UPYsxvD7GPT1JzUjD6U9bJOQ5bnZmhmYq4C9uSH5_m0cQb1vReiTAfa3_jLvRv_yaPq9FfRwSl2KNkizaUQ2wgTVQ\/s1700-e365\/telegram.jpg\" style=\"display: block;  text-align: center; clear: left; float: left;\"><img decoding=\"async\" src=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEj2MLE-4dZUVruezq6H1P8KknTiMCxU1F6FA_JERQY6dlH44l4gmecsbB3WAW4njsQJvmN_7WIm62kDgQi3fG2w9UFQVfYE5WZGBd5UPYsxvD7GPT1JzUjD6U9bJOQ5bnZmhmYq4C9uSH5_m0cQb1vReiTAfa3_jLvRv_yaPq9FfRwSl2KNkizaUQ2wgTVQ\/s1700-e365\/telegram.jpg\" alt=\"\" border=\"0\" data-original-height=\"919\" data-original-width=\"1004\"\/><\/a><\/div>\n<p>\u00abTeamPCP is escalating a coordinated campaign targeting security tools and open source developer infrastructure, and is now openly taking credit for multiple follow-on attacks across ecosystems,\u00bb Socket <a href=\"https:\/\/socket.dev\/blog\/teampcp-targeting-security-tools-across-oss-ecosystem\" rel=\"noopener\" target=\"_blank\">said<\/a>. \u00abThis is a sustained operation targeting high-leverage points in the software supply chain.\u00bb<\/p>\n<p>In a message <a href=\"https:\/\/t.me\/team_pcp\/98\" rel=\"noopener\" target=\"_blank\">posted<\/a> on their Telegram channel, TeamPCP said: \u00abThese companies were built to protect your supply chains yet they can&#8217;t even protect their own, the state of modern security research is a joke, as a result we&#8217;re gonna be around for a long time stealing terrabytes [sic] of trade secrets with our new partners.\u00bb<\/p>\n<p>\u00abThe snowball effect from this will be massive, we are already partnering with other teams to perpetuate the chaos, many of your favourite security tools and open-source projects will be targeted in the months to come so stay tuned,\u00bb the threat actor <a href=\"https:\/\/t.me\/team_pcp\/94\" rel=\"noopener\" target=\"_blank\">added<\/a>.<\/p>\n<div class=\"dog_two clear\">\n<div class=\"cf\"><a href=\"https:\/\/thehackernews.uk\/attack-stories-xmcyber-d\" rel=\"nofollow noopener sponsored\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\"lazyload\" alt=\"Cybersecurity\" src=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEi10JhdzuuQKeU6vIJGPRAeffB5FYR9ajRiOfpp6hmgsP5GCmDcMdEKpiEEUZjkua9Y9R__l-63FpqNwAFgZzIdNR5lPIJcvvyBKIAu_nN7Z1TJoVUXrEvfQcWlJ0QhqMshOARvU3_B94NJNDbp-SiKAVfPFPibh_jcBpTfSPmCFxxJkPqL44kIFXL1WGEo\/s728-e100\/fs-d.png\" width=\"729\" height=\"91\"\/><\/a><\/div>\n<\/div>\n<p>Users are advised to perform the following actions to contain the threat &#8211;<\/p>\n<ul>\n<li>Audit all environments for litellm versions 1.82.7 or 1.82.8, and if found, revert to a clean version<\/li>\n<li>Isolate affected hosts<\/li>\n<li>Check for the presence of rogue pods in Kubernetes clusters<\/li>\n<li>Review network logs for egress traffic to \u00abmodels.litellm[.]cloud\u00bb and \u00abcheckmarx[.]zone\u00bb<\/li>\n<li>Remove the persistence mechanisms<\/li>\n<li>Audit CI\/CD pipelines for usage of tools like Trivy and KICS during the compromise windows<\/li>\n<li>Revoke and rotate all exposed credentials<\/li>\n<\/ul>\n<p>\u00abThe open source supply chain is collapsing in on itself,\u00bb Gal Nagli, head of threat exposure at Google-owned Wiz, <a href=\"https:\/\/x.com\/galnagli\/status\/2036434999998836856\" rel=\"noopener\" target=\"_blank\">said<\/a> in a post on X. \u00abTrivy gets compromised \u2192 LiteLLM gets compromised \u2192 credentials from tens of thousands of environments end up in attacker hands \u2192 and those credentials lead to the next compromise. We are stuck in a loop.\u00bb<\/p>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>TeamPCP, the threat actor behind the recent compromises of Trivy and KICS, has now compromised a popular Python package named litellm, pushing two malicious versions containing a credential harvester, a&hellip;<\/p>\n","protected":false},"author":1,"featured_media":378,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[868,104,576,869,866,855,800,867],"class_list":["post-377","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-1-82-71-82-8","tag-backdoors","tag-cicd","tag-compromise","tag-litellm","tag-teampcp","tag-trivy","tag-versions"],"_links":{"self":[{"href":"https:\/\/thedigitalfortress.us\/index.php?rest_route=\/wp\/v2\/posts\/377","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/thedigitalfortress.us\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/thedigitalfortress.us\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/thedigitalfortress.us\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/thedigitalfortress.us\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=377"}],"version-history":[{"count":0,"href":"https:\/\/thedigitalfortress.us\/index.php?rest_route=\/wp\/v2\/posts\/377\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/thedigitalfortress.us\/index.php?rest_route=\/wp\/v2\/media\/378"}],"wp:attachment":[{"href":"https:\/\/thedigitalfortress.us\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=377"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/thedigitalfortress.us\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=377"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/thedigitalfortress.us\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=377"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}