De hackergroep TeamPCP heeft twee kwaadaardige versies van de populaire Python-libraries LiteLLM op PyPI geplaatst. Via een eerder gecompromitteerde versie van vulnerability scanner Trivy stalen de aanvallers de publicatietokens van LiteLLM. Daarna exfiltreerden ze AI-sleutels, cloudcredentials en SSH-sleutels van getroffen systemen.
De supply chain-aanval op LiteLLM begon niet bij LiteLLM zelf. TeamPCP compromitteerde eerst Trivy, een veelgebruikte open-source vulnerability scanner, door commits te spoofen van legitieme maintainers. Daarna pushten de aanvallers een kwaadaardige versie naar de Trivy-repository, die via een geautomatiseerde release-pipeline werd verspreid naar GitHub Releases, Docker Hub en Amazon ECR.
LiteLLM gebruikte Trivy in zijn CI/CD-pipeline. Omdat de geïnfecteerde binary toegang had tot het geheugen van de CI/CD-runner, konden de aanvallers het PYPI_PUBLISH-token stelen. Met dat token publiceerden ze twee kwaadaardige versies van LiteLLM — 1.82.7 en 1.82.8 — rechtstreeks op PyPI, buiten de officiële broncode-repository om.
LiteLLM fungeert als unified gateway naar meer dan honderd LLM-providers, waaronder OpenAI, Anthropic en Azure. Dat maakt het een bijzonder aantrekkelijk doelwit. Een compromittering geeft toegang tot API-sleutels voor al die providers tegelijk. Uit onderzoek van Hunt.io bleek dat er op dat moment ruim 33.000 internet-facing LiteLLM-instanties actief waren. De aanval kreeg CVE-nummer CVE-2026-33634 met een CVSS-score van 9.4.
Twee injectiemethoden, drie aanvalsfasen
De twee versies gebruikten verschillende technieken. Versie 1.82.7 injecteerde een Base64-gecodeerde payload direct in proxy_server.py, die werd uitgevoerd zodra de LiteLLM-proxy startte. Versie 1.82.8 was subtieler: het voegde een .pth-bestand toe aan site-packages, waardoor de malware bij iedere Python-interpreterstart actief werd, ongeacht of LiteLLM expliciet werd geïmporteerd. Een eenvoudig commando volstond om de payload te activeren op alle daaropvolgende Python-processen.
De payload werkte in drie fasen. Eerst verzamelde de malware omgevingsvariabelen en configuratiebestanden van cloudproviders en AI-diensten: OpenAI-, Anthropic- en Azure-sleutels, AWS/GCP/Azure-credentials en lokale bestanden zoals ~/.kube/config en ~/.aws/credentials. Daarna versleutelde de code de buitgemaakte data met AES-256-CBC en stuurde alles als tpcp.tar.gz naar een C2-server via curl. Ten slotte installeerde de malware via een PERSIST_B64-payload een backdoor die elke 50 minuten instructies ophaalde van een extern domein om nieuwe code uit te voeren.
Tip: Checkmarx Jenkins-plugin besmet in nieuwe supply chain-aanval