If your
#AI stack talks to
#LLMs through
#LiteLLM — and a lot of them do — check your version. 1.82.7 and 1.82.8 on PyPI were
#backdoored with a payload that vacuums up every secret it can find and, if you're on K8s, deploys privileged pods to every node in the cluster.
Stage1 (25,844 bytes):
• Harvests ~/.ssh/*, AWS/GCP/Azure/K8s creds, crypto wallets, .env, shell history, SSL keys, CI/CD secrets
• AES-256-CBC hardcoded 4096-bit RSA pubkey → POST to models.litellm[.]cloud
• Installs ~/.config/sysmon/sysmon.py systemd user service ("System Telemetry Service")
• Backdoor polls checkmarx[.]zone/raw every ~50min for next-stage URL → /tmp/pglog
• If K8s SA token exists: reads all cluster secrets, spawns privileged alpine pods (node-setup-*) in kube-system on every node, mounts host FS, installs backdoor on each
Attacker left two commented-out earlier iterations in the source — went from RC4 string obfuscation (51KB) to plain base64 (25KB). Lazy or confident.
JARM: 27d40d40d00040d00042d43d000000d2e61cae37a985f75ecafb81b33ca523
Both C2s on AS205759 (🇳🇱 NL), Let's Encrypt E7 certs
IoCs:
models.litellm[.]cloud — 46.151.182[.]203
checkmarx[.]zone — 83.142.209[.]11
71e35aef03099cd1f2d6446734273025a163597de93912df321ef118bf135238 (.pth)
d6fc0ff06978742a2ef789304bcdbe69a731693ad066a457db0878279830d6a9 (stage1)
8395c3268d5c5dbae1c7c6d4bb3c318c752ba4608cfcd90eb97ffb94a910eac2 (1.82.7 .whl)
d2a0d5f564628773b6af7b9c11f6b86531a875bd2d186d7081ab62748a800ebb (1.82.8 .whl)
Discovered by
futuresearch.ai/blog/litellm…
#SupplyChain #PyPI #InfoStealer #Kubernetes #litellm #Python