17611538698
info@21cto.com

危险来了!Python大模型调用库 LiteLLM 遭“投毒”

安全 1 25 18小时前
图片

21CTO导读:


月下载量高达9,700 万次的AI 开源套件LiteLLM,在 24 日爆出遭供应链攻击,两个受损版本(v1.82.7、v1.82.8)被植入恶意代码,能系统性窃取加密钱包、SSH密钥、云端帐户凭证等几乎所有敏感信息。

今天,软件开发界做了一个“究极恶梦”,发生了一件让所有 AI 开发者后背发凉的事。

LiteLLM,那个统一调用各家大模型 API 的 Python 库,GitHub 4 万星,月下载 9500 万次——被统一“投毒”了。

图片

只需要一行 pip install,你的 SSH 密钥、AWS/GCP/Azure 凭证、K8s Secrets、数据库密码、加密货币钱包、所有 .env 里的 API Key,全部被 AES-256 加密打包,POST 到攻击者的仿冒域名 http://models.litellm.cloud。如果检测到 K8s 环境,还会在每个节点部署特权 Pod 横向扩散。

最恐怖的是触发方,恶意攻击者在包里塞了一个 34KB 的 litellm_init.pth 文件。

Python 的 .pth 是其路径配置文件,由 site 模块在解释器启动时自动处理——如果某行以 import 开头,直接执行。

攻击者利用这个机制写了一行代码:

import os, subprocess, sys;subprocess.Popen([sys.executable"-c""import base64; exec(base64.b64decode('...'))"], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)

不需要你 import litellm,不需要你调用任何函数。你跑 pip、跑 python -c、IDE 启动语言服务器,甚至 pytest 跑测试——只要 Python 解释器启动,恶意代码就执行。装上就中招,完全静默。

其载入的是三层 base64 嵌套:

第一层 .pth 启动子进程;第二层是编排器,内嵌攻击者的 4096 位 RSA 公钥;第三层是凭证收割器,系统性搜刮 /home、/opt、/srv、/var/www、/app、/data、/tmp 下所有敏感文件。

收集完毕后用 openssl 生成随机 32 字节 AES 会话密钥加密数据,再用 RSA-OAEP 加密会话密钥,打包为 tpcp.tar.gz 文件后向外发送。

除了收割器之外还有持久化后门:

在 ~/.config/sysmon/sysmon.py 注册为 systemd 用户服务,每 50 分钟轮询 http://checkmarx.zone 获取新指令,下载到 /tmp/pglog 执行。启动有 5 分钟延迟来躲避沙箱分析。

这样即使你卸载了 LiteLLM,后门仍然保持存活。

而且用 pip install --require-hashes 也拦不住——恶意文件正常列入 wheel 的 RECORD,哈希完全匹配,因为包本身就是用被盗的合法 PyPI 令牌发布的。

你可能从没手动装过 LiteLLM,但 DSPy、MLflow、Open Interpreter 等 2000 多个包都把它当主要依赖。Mandiant 确认已有 1000+ SaaS 环境感染,预计扩展到 10,000个。

已经有很多人“中招”了。

图片

这次攻击几乎差点完美得逞——唯一的破绽是攻击者自己代码有 bug。

.pth 通过 subprocess.Popen 启动子进程,子进程初始化时 site 模块又扫描到同一个 .pth,再次触发,指数级递归形成 fork bomb,撑爆了一个 Cursor 用户的内存才被发现。

AI技术专家安德烈·卡帕西(Andrej Karpathy) 说:如果攻击者代码写得再好一点,这件事可能几周都不会被发现。

更荒诞的是攻击链的起点:安全扫描工具 Trivy 在 3月19 率先被攻陷,攻击组织 TeamPCP 用它窃取了 litellm 的 PyPI 发布令牌,3月24日直接往 PyPI 推送带毒版本——原本用来保护你的工具,变成了攻击你的入口。

社区在 GitHub 提 issue 报告后,攻击者 102 秒内用 73 个被盗账号发了 88 条垃圾评论淹没讨论,然后用被盗的维护者账号关闭了 issue。

以下方法,帮助你检查是否安装了恶意版本:

所有 Python 环境都查一遍(venv、conda、系统级)

pip show litellmpip3 show litellm

# 如果用 uv

find ~/.cache/uv -name "litellm_init.pth"

安全版本:litellm==1.82.6。若装了 1.82.7 或 1.82.8 的,假设所有凭证已泄露 → 中招。

如果不幸泄漏了,请立即做如下处理:

* 先立刻卸载:

pip uninstall litellm && pip cache purge

使用uv 的话,删除里面的缓存:

rm -rf ~/.cache/uv 

* 删后门文件:

rm -rf ~/.config/sysmon/ ~/.config/systemd/user/sysmon.service

* 轮换所有凭据:SSH key、AWS/GCP/Azure credentials、K8s kubeconfig、.env 里的 API key、数据库密码——全部视为已泄露。

* K8s 集群:审计所有 namespace 的 secrets 访问记录,清理 node-setup-* pod

还有一个自查脚本(覆盖版本检查、.pth 搜索、后门检测、可疑连接、K8s 扫描):

https://gist.github.com/sorrycc/30a765b9a82d0d8958e756b251828a19

图像

以上方法仅供参考。
可以说事件已经相当严重了,.pth 文件是 Python 生态的隐性攻击面 。不需要 import 就能执行代码,这种机制对大多数开发者来说根本是盲区。
有亲身使用和身边在接触此库的软件开发者们,请宣传和扩展本文。

作者:大雄

评论

我要赞赏作者

请扫描二维码,使用微信支付哦。

分享到微信