一行 pip install,你的 SSH 密钥、云服务凭证、加密货币钱包、所有 .env 里的 API Key……全被加密打包送走了。


昨天刚发现上报,AI 开发者圈炸了。一个被广泛使用的核心 Python 包 litellm 被投毒了!

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

你没有看错。一个几乎每个 AI 项目都可能间接依赖的“基础设施”,被人塞进了后门。而且这后门藏得极其阴险:你甚至不需要 import 它,只要装了,就中招


发生了什么?

据大佬 3 月 24 日发现上报,攻击者利用从安全扫描工具 Trivy 那里窃取的 PyPI 发布令牌,往 PyPI 上传了两个带毒版本:1.82.71.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,但如果你装了 DSPyMLflowOpen 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. 立即自查

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

扩散周知,让更多人自查。