发生了什么
10 月 21 日,开源 AI 网关 LiteLLM 的发布流水线被入侵。恶意版本 1.107.0 在 11:39 至 13:23 UTC 之间出现在 PyPI,七个平台的 wheel 全部带毒;容器仓库上的 v1.107.0、latest、main-latest、main-stable 四个标签到 14:20 UTC 才撤下。源码 tag 干净,恶意文件只存在于构建产物与被改动一行的 pyproject.toml 中。
攻击者用三组开发者 GitHub CLI OAuth 令牌越过控制:强推提交覆盖分支保护,借官方 staging 跑通构建,第二个账号通过生产审批门,第三个账号删除工作流记录。构建源指向仿冒仓库 Berri-AI/litellm(官方为 BerriAI/litellm)。
载荷:解释器一启动就执行
- cook.pth 只有一行 import cook,Python 启动即加载 cook.py,去混淆后运行 privcollect 窃取程序,无需真的调用 litellm。
- 目标是 SSH 私钥、云凭据、CI/CD 密钥、浏览器密码、AI 编程工具令牌,以及代理库里保存的各家模型 API Key。
- 数据打包后 POST 到仿冒域名 litellm[.]dev/healthcheck。
- sitecustomize.py 另起守护进程,每小时读 GitHub 上的 domain.txt 取地址并拉二阶段代码,锁文件为 /tmp/remote_code_loader.lock。
已被实际利用
Wiz 记录到,外泄约 4.5 小时后,攻击者自 168.100.8.57 与 165.227.201.8 对 CI runner 与 Kubernetes 节点上的 AWS 实例角色凭据调用 sts:GetCallerIdentity,随后是 bedrock:ListFoundationModels 与 ListModels,符合盗用算力跑模型的 LLMjacking 特征。部分凭据不只泄露,而已被验证可用。
根因:AI 编程助手把令牌写进网关日志
LiteLLM 复盘称,一套暴露在公网的内部部署出现来源不明的账号,攻击者疑经刚修补的漏洞进入并从日志取走令牌。更有普遍意义的细节是:Claude Code 会把用户的 GitHub CLI OAuth 令牌写进响应体,响应体被网关记录后,令牌就落到日志里。该项目三月已出过同类事件,此后做了私有仓库、不可变标签与镜像签名,但 10 月 19 日临时放开两名工程师的 backport 权限,恰好抵掉了这些约束。
企业侧怎么处置
- 判定:10 月 21 日 11:39 至 13:23 UTC 装过未锁定版本,或 11:46 至 14:20 UTC 拉过上述标签,即视为受影响。
- 不要用 pip 重装覆盖清理,.pth 会再次生效;应删除 cook.pth、cook.py、sitecustomize.py 及 pycache 副本,并结束持有锁文件的进程。
- 在干净机器上轮换全部云凭据、SSH 密钥、仓库令牌与模型 Key;环境与镜像按审阅过的 digest 重建,锁定 1.106.2 或更早。
- 网关日志记什么、谁有权读,应与生产凭据同等对待。
尚不确定:GitHub 撤下 domain.txt 前文件只有测试值,无法证明每台受感染主机都收到二阶段载荷。

