{"id":11595,"date":"2026-03-25T10:03:41","date_gmt":"2026-03-25T10:03:41","guid":{"rendered":"https:\/\/serisec.com\/index.php\/2026\/03\/25\/litellm-python-package-with-95-million-downloads-compromised-by-teampcp-hackers\/"},"modified":"2026-03-25T10:03:41","modified_gmt":"2026-03-25T10:03:41","slug":"litellm-python-package-with-95-million-downloads-compromised-by-teampcp-hackers","status":"publish","type":"post","link":"https:\/\/serisec.com\/index.php\/2026\/03\/25\/litellm-python-package-with-95-million-downloads-compromised-by-teampcp-hackers\/","title":{"rendered":"LiteLLM Python Package With 95 Million Downloads Compromised by TeamPCP Hackers"},"content":{"rendered":"<p>    LiteLLM Python Package With 95 Million Downloads Compromised by TeamPCP Hackers<br \/>\n \t<BR><br \/>\n<BR><\/BR><br \/>\n    <!-- no image --><br \/>\n \t<BR><br \/>\n<BR><\/BR><\/p>\n<div>\n<p>A widely used open-source Python library was compromised on the Python Package Index (PyPI). Versions 1.82.7 and 1.82.8 of the package, which route requests across various LLM providers and have over 95 million monthly downloads, were found to contain a sophisticated backdoor by security vendors Endor Labs\u00a0and\u00a0JFrog.<\/p>\n<p>The malicious code was injected directly into the PyPI distribution, bypassing the clean upstream GitHub repository. This <a href=\"https:\/\/cybersecuritynews.com\/supply-chain-attack-abused-notepad-update-infrastructure\/\" target=\"_blank\" rel=\"noreferrer noopener\">supply chain attack<\/a> is attributed to TeamPCP, a threat actor known for targeting highly privileged developer and security tools.<\/p>\n<p>The infection chain relies on malicious code execution disguised within legitimate library functions. In version 1.82.7, attackers injected a 12-line base64-encoded payload into the <code>litellm\/proxy\/proxy_server.py<\/code> file. This code triggers silently upon module import.<\/p>\n<p>Version 1.82.8 escalates the threat by introducing a <code>litellm_init.pth<\/code> file into the root of the wheel. Because Python automatically processes <code>.pth<\/code> files placed in <code>site-packages<\/code> at startup, this secondary vector ensures the payload executes as a background process during any Python invocation in the compromised environment. This means the payload triggers even if <code>litellm<\/code> is never explicitly imported by the developer\u2019s code.<\/p>\n<h2 class=\"wp-block-heading\" id=\"affected-package-versions\"><strong>Affected Package Versions<\/strong><\/h2>\n<figure class=\"wp-block-table\">\n<table class=\"has-fixed-layout\">\n<thead>\n<tr>\n<th class=\"has-text-align-left\" data-align=\"left\">Package Name<\/th>\n<th class=\"has-text-align-left\" data-align=\"left\">Version<\/th>\n<th class=\"has-text-align-left\" data-align=\"left\">Publication Date<\/th>\n<th class=\"has-text-align-left\" data-align=\"left\">Injection Vector<\/th>\n<th class=\"has-text-align-left\" data-align=\"left\">Status<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td class=\"has-text-align-left\" data-align=\"left\">litellm<\/td>\n<td class=\"has-text-align-left\" data-align=\"left\">1.82.7<\/td>\n<td class=\"has-text-align-left\" data-align=\"left\">2026-03-24<\/td>\n<td class=\"has-text-align-left\" data-align=\"left\">\n<code>proxy_server.py<\/code> (import-time)<\/td>\n<td class=\"has-text-align-left\" data-align=\"left\">Removed<\/td>\n<\/tr>\n<tr>\n<td class=\"has-text-align-left\" data-align=\"left\">litellm<\/td>\n<td class=\"has-text-align-left\" data-align=\"left\">1.82.8<\/td>\n<td class=\"has-text-align-left\" data-align=\"left\">2026-03-24<\/td>\n<td class=\"has-text-align-left\" data-align=\"left\">\n<code>proxy_server.py<\/code> + <code>litellm_init.pth<\/code> (interpreter startup)<\/td>\n<td class=\"has-text-align-left\" data-align=\"left\">Removed<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p><em>Note: The last known-clean version is <code>litellm<\/code> 1.82.6.<\/em><\/p>\n<p>Upon execution, the payload initiates an aggressive three-stage attack sequence. The initial orchestrator script unpacks a comprehensive credential harvester designed to systematically sweep the host system.<\/p>\n<p>It targets SSH keys, cloud provider tokens for AWS, GCP, and Azure, database credentials, and cryptocurrency wallets. Extracted secrets are encrypted using a hybrid AES-256-CBC and RSA-4096 scheme and bundled into an archive named <code>tpcp.tar.gz<\/code> before being exfiltrated to an attacker-controlled domain masquerading as a legitimate project resource.<\/p>\n<p>Beyond credential theft, the malware attempts lateral movement within Kubernetes environments. If the harvester detects a Kubernetes service account token, it rapidly enumerates all cluster nodes and deploys privileged alpine containers to each node using host-level access.<\/p>\n<p>Finally, the malware establishes persistent access by dropping a systemd user service disguised as a system telemetry process. This backdoor continuously polls a secondary command-and-control server to fetch and execute additional binaries.<\/p>\n<p>This breach represents the latest escalation in a sprawling supply chain campaign orchestrated by TeamPCP. Over the past month, the group has successfully compromised five separate ecosystems, including GitHub Actions, Docker Hub, npm, and OpenVSX.<\/p>\n<p>By deliberately targeting infrastructure and security-focused tools such as <a href=\"https:\/\/cybersecuritynews.com\/trivy-scanner-compromised\/\" target=\"_blank\" rel=\"noreferrer noopener\">Aqua Security\u2019s Trivy<\/a> and Checkmarx\u2019s KICS, the attackers ensure their payloads execute in highly privileged environments rich with production secrets.<\/p>\n<h2 class=\"wp-block-heading\" id=\"key-indicators-of-compromise-iocs\"><strong>Key Indicators of Compromise (IoCs)<\/strong><\/h2>\n<figure class=\"wp-block-table\">\n<table class=\"has-fixed-layout\">\n<thead>\n<tr>\n<th class=\"has-text-align-left\" data-align=\"left\">Indicator<\/th>\n<th class=\"has-text-align-left\" data-align=\"left\">Type<\/th>\n<th class=\"has-text-align-left\" data-align=\"left\">Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td class=\"has-text-align-left\" data-align=\"left\"><code>models.litellm.cloud<\/code><\/td>\n<td class=\"has-text-align-left\" data-align=\"left\">C2 Domain<\/td>\n<td class=\"has-text-align-left\" data-align=\"left\">Exfiltration endpoint for encrypted credential archives<\/td>\n<\/tr>\n<tr>\n<td class=\"has-text-align-left\" data-align=\"left\"><code>checkmarx.zone\/raw<\/code><\/td>\n<td class=\"has-text-align-left\" data-align=\"left\">C2 Endpoint<\/td>\n<td class=\"has-text-align-left\" data-align=\"left\">Payload delivery domain for the persistent backdoor<\/td>\n<\/tr>\n<tr>\n<td class=\"has-text-align-left\" data-align=\"left\"><code>~\/.config\/systemd\/user\/sysmon.service<\/code><\/td>\n<td class=\"has-text-align-left\" data-align=\"left\">Filesystem<\/td>\n<td class=\"has-text-align-left\" data-align=\"left\">Persistent systemd unit hiding the backdoor<\/td>\n<\/tr>\n<tr>\n<td class=\"has-text-align-left\" data-align=\"left\"><code>tpcp.tar.gz<\/code><\/td>\n<td class=\"has-text-align-left\" data-align=\"left\">Archive<\/td>\n<td class=\"has-text-align-left\" data-align=\"left\">Named archive containing exfiltrated host data<\/td>\n<\/tr>\n<tr>\n<td class=\"has-text-align-left\" data-align=\"left\"><code>node-setup-*<\/code><\/td>\n<td class=\"has-text-align-left\" data-align=\"left\">Kubernetes<\/td>\n<td class=\"has-text-align-left\" data-align=\"left\">Privileged attacker pods deployed in the <code>kube-system<\/code> namespace<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>Organizations utilizing <code>litellm<\/code> should immediately audit their environments. If the compromised versions are detected, security teams must treat the environment as fully breached and initiate a comprehensive credential rotation protocol.<\/p>\n<p class=\"has-text-align-center has-background\" style=\"background:linear-gradient(180deg,rgb(238,238,238) 94%,rgb(169,184,195) 100%)\"><strong>Follow us on <a href=\"https:\/\/news.google.com\/publications\/CAAqMggKIixDQklTR3dnTWFoY0tGV041WW1WeWMyVmpkWEpwZEhsdVpYZHpMbU52YlNnQVAB?hl=en-IN&amp;gl=IN&amp;ceid=IN:en\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">Google News<\/a>, <a href=\"https:\/\/www.linkedin.com\/company\/cybersecurity-news\/\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">LinkedIn<\/a>, and <a href=\"https:\/\/x.com\/cyber_press_org\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">X<\/a> for daily cybersecurity updates. <a href=\"https:\/\/cybersecuritynews.com\/contact-us\/\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">Contact us<\/a> to feature your stories.<\/strong><\/p>\n<p>The post <a href=\"https:\/\/cybersecuritynews.com\/litellm-package-compromised\/\">LiteLLM Python Package With 95 Million Downloads Compromised by TeamPCP Hackers<\/a> appeared first on <a href=\"https:\/\/cybersecuritynews.com\/\">Cyber Security News<\/a>.<\/p>\n<\/div>\n<p> \t<BR><br \/>\n <BR><\/BR><br \/>\n    Guru Baran<br \/>\n \t<BR><br \/>\n<BR><\/BR><br \/>\n<a href=\"https:\/\/cybersecuritynews.com\/litellm-package-compromised\/\">Go to cyber-security-news<\/a><br \/>\n \t<BR><br \/>\n <BR><\/BR><\/p>\n","protected":false},"excerpt":{"rendered":"<p>LiteLLM Python Package With 95 Million Downloads Compromised by TeamPCP Hackers A widely used open-source Python library was compromised on the Python Package Index (PyPI). Versions 1.82.7 and 1.82.8 of the package, which route requests across various LLM providers and have over 95 million monthly downloads, were found to contain a sophisticated backdoor by security [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[129,63,1112,937],"tags":[130],"class_list":["post-11595","post","type-post","status-publish","format-standard","hentry","category-cyber-security","category-cyber-security-news","category-hacking-news","category-python","tag-cyber-security-news"],"_links":{"self":[{"href":"https:\/\/serisec.com\/index.php\/wp-json\/wp\/v2\/posts\/11595"}],"collection":[{"href":"https:\/\/serisec.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/serisec.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/serisec.com\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/serisec.com\/index.php\/wp-json\/wp\/v2\/comments?post=11595"}],"version-history":[{"count":0,"href":"https:\/\/serisec.com\/index.php\/wp-json\/wp\/v2\/posts\/11595\/revisions"}],"wp:attachment":[{"href":"https:\/\/serisec.com\/index.php\/wp-json\/wp\/v2\/media?parent=11595"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/serisec.com\/index.php\/wp-json\/wp\/v2\/categories?post=11595"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/serisec.com\/index.php\/wp-json\/wp\/v2\/tags?post=11595"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}