一行
pip install,你的 SSH 密钥、云服务凭证、加密货币钱包、所有 .env 里的 API Key……全被加密打包送走了。
昨天刚发现上报,AI 开发者圈炸了。一个被广泛使用的核心 Python 包 litellm 被投毒了!
LiteLLM——那个帮你统一调用各家大模型 API 的 Python 库,GitHub 上有 4 万星、月下载量 9500 万次——被投毒了。
你没有看错。一个几乎每个 AI 项目都可能间接依赖的“基础设施”,被人塞进了后门。而且这后门藏得极其阴险:你甚至不需要 import 它,只要装了,就中招。
发生了什么?
据大佬 3 月 24 日发现上报,攻击者利用从安全扫描工具 Trivy 那里窃取的 PyPI 发布令牌,往 PyPI 上传了两个带毒版本:1.82.7 和 1.82.8。
一旦你运行:
pip install litellm==1.82.7 # 或 1.82.8
你的机器就不再是你的了。
怎么做到的?一个 .pth 文件就够了
攻击者在包里塞了一个 34KB 的文件:litellm_init.pth。
Python 的 .pth 文件本是用来添加模块搜索路径的,但它有一个“隐藏功能”:如果某一行以 import 开头,Python 解释器会在启动时直接执行那一行代码。
攻击者写的是:
import os, subprocess, sys; subprocess.Popen([sys.executable, "-c", "import base64; exec(base64.b64decode('...'))"], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
只要你启动 Python 解释器——不管是跑 pip、跑 python -c、IDE 启动语言服务器,还是 pytest 跑测试——这行代码就会立刻执行,在后台静默运行。
不需要 import,不需要调用任何函数。装上就中招。
被偷走的远比你想象的更多
恶意代码会执行三层嵌套的 base64 载荷,最终跑起一个凭证收割器。它会系统性搜刮:
- SSH 私钥(
~/.ssh/id_rsa等) - AWS/GCP/Azure 凭证
- Kubernetes 配置文件(
~/.kube/config) - Git 凭证
- 所有
.env文件里的 API Key - 数据库密码
- 加密货币钱包
- SSL 私钥
- CI/CD 机密
- shell 历史
收集完后,数据被 AES-256 加密,打包成 tpcp.tar.gz,发往攻击者的仿冒域名 http://models.litellm.cloud。
更狠的是,如果检测到 K8s 环境,它还会在每个节点部署特权 Pod 横向扩散。
持久化后门:卸载也没用
你以为把 litellm 删了就没事了?
恶意代码还会在 ~/.config/sysmon/sysmon.py 注册一个 systemd 用户服务,每 50 分钟轮询 http://checkmarx.zone 获取新指令,下载到 /tmp/pglog 执行。
而且启动时有 5 分钟延迟,就是为了躲避沙箱分析。
即使你卸载了 litellm,后门依然活在系统里。
传播链比你想的恐怖
你可能从没手动装过 litellm,但如果你装了 DSPy、MLflow、Open Interpreter 这类包,它们都依赖 litellm。而依赖链可以深不可测——总共有 2000 多个包 间接依赖它。
也就是说,你装一个看似无害的工具,可能就把整个地雷搬回了家。
更麻烦的是,pip install --require-hashes 也拦不住——因为恶意文件被正常列入了 wheel 的 RECORD,哈希完全匹配。毕竟包本身就是用被盗的合法 PyPI 令牌发布的。
差点成为“完美犯罪”
攻击几乎得逞,唯一的破绽是攻击者自己代码有 bug。
.pth 通过 subprocess.Popen 启动了子进程,而子进程初始化时,site 模块又扫描到了同一个 .pth 文件,再次触发……形成了 fork bomb(递归爆炸),把一位 Cursor 用户的内存撑爆了,机器直接崩溃,才被发现。
Andrej Karpathy 感叹:如果攻击者代码写得再好一点,这件事可能几周都不会被发现。
攻击链的起点更荒诞
这次投毒的起点,是攻击组织 TeamPCP 先攻陷了安全扫描工具 Trivy,用它窃取了 litellm 的 PyPI 发布令牌。
用来保护你的工具,变成了攻击你的入口。
当社区在 GitHub 上提 issue 报告后,攻击者 102 秒内用 73 个被盗账号发了 88 条垃圾评论淹没讨论,然后用被盗的维护者账号直接关闭了 issue。
你现在该做什么?
1. 立即自查
- 检查是否安装了
litellm==1.82.7或1.82.8。如果你最近装过 litellm 或任何依赖它的包,假设所有凭证已泄露。 - 运行 @chenchengpro 大佬分享的自查脚本,它会检查版本、搜索
.pth文件、检测后门和可疑连接:
https://gist.github.com/sorrycc/30a765b9a82d0d8958e756b251828a19
2. 立即轮换所有凭证
- SSH 密钥、云服务 Access Key、K8s token、数据库密码、API Key……全部重新生成。
- 尤其是你存过
.env里的任何密钥,都假设已经外泄。
3. 安全版本
- 目前确认安全的是 1.82.6。用这个版本可以暂时避开风险。
最后
Karpathy 说:“经典软件工程让我们相信依赖是好的——我们是在用砖块建金字塔。但我越来越厌恶依赖,能用 LLM ‘yoink’ 功能时就自己实现。”
这句话现在听起来格外扎心。
依赖链就是信任链。当你用一行 pip install 拉下整个森林时,你永远不知道里面藏着什么。
这次是 LiteLLM,下次会是谁?
自查脚本(含版本检查、.pth 搜索、后门检测、可疑连接、K8s 扫描):
https://gist.github.com/sorrycc/30a765b9a82d0d8958e756b251828a19
扩散周知,让更多人自查。