LiteLLM 被投毒的那个版本
1.107.0 这个版本里塞了窃密脚本和定时后门,装完就随任何 Python 进程启动。讲清它偷什么、怎么自查中招、以及处置的先后顺序。
你只是在 CI 里装了一个新版本。三天后你发现,那台机器上的云密钥、SSH 私钥、Claude 和 Cursor 的登录凭证,都被打包发走了。
一、发生了什么
安全公司 SafeDep 在 10 月 21 日披露:PyPI 上的 LiteLLM 1.107.0 里被塞了窃密程序和远程执行后门,该版本事后已被删除。
时间线按 UTC:当天 11:39 上传,13:40 就已消失。七个平台的安装包都带着那三个文件,源码仓库里没有。
注入方式很省事:打包配置多了一行,把源码包外的一个目录塞进安装产物。发布标签指向的提交里写的版本号是 1.108.0,和上传的 1.107.0 对不上;构建也没走公开流水线,PyPI 上没有来源证明。
干净的是 1.106.2 和 1.107.0 的两个候选版,它绑定的两个配套包也没问题。
二、它偷了什么
装进 site-packages 的是三个文件。其中一个路径配置会在解释器启动时被读取,于是一个从未 import 过 litellm 的 Python 进程,也会执行那段代码。
它收集 SSH 私钥、云厂商凭证、kube 配置与 Docker 登录信息、浏览器保存的密码、shell 命令历史、CI 流水线密钥,还有 Claude Code、Cursor、Copilot 这批 AI 工具的登录态。对 LiteLLM 用户最要命的是读代理的数据库连接串,把存着各家模型 API key 的那张表整张导出。
数据加密后发往一个伪装成官方域名的地址。
另一个文件是后门:每小时去一个 GitHub 仓库读服务器地址,再下载代码执行。那个账号在上传约两小时后被删,但在删之前,中招的机器可能已经跑过一轮。
三、怎么自查和处置
读到这儿,可以顺路看 之前没人攻成的 PHP 漏洞,这次连美国政府关联防火墙都沦陷了 安全公司 Dream 披露首例 PHP2Shell 实际入侵:攻击者组合两个漏洞,15 分钟内拿到防火墙最高权限,25 台服务器沦陷,其中含美国政府关联机构。暴露在公网的管理接口是最大软肋。自查,按这个顺序:
- 查版本。依赖锁定文件里有没有 1.107.0,镜像缓存也算。
- 查文件。site-packages 里找三个名字:cook.pth、cook.py、sitecustomize.py。第三方包自带 sitecustomize 极不正常。
- 查进程。有没有父进程是 1、脱离终端、工作目录为根目录的 Python 进程。
- 查环境变量。进程环境里出现 PRIVCOLLECT_ACTIVE,说明窃密程序已经跑过。
- 查网络和临时文件。有没有访问 litellm.dev 这个域名,两个固定路径的标记文件在不在。
处置,顺序不能乱:
- 先隔离,不要先删。 拔网线或摘安全组,保留现场。删文件会毁掉「跑没跑过」的证据。
- 做快照。 整机镜像,至少留下那三个文件、进程列表和网络记录。
- 全量轮换凭证。 按「这台机器上的一切都已泄露」处理:云密钥、SSH key、CI token、数据库密码、模型供应商 key。只换一部分等于没换。
- 再清包。 卸载只是第一步,还要确认残留文件被删,镜像重新构建。
- 查二阶段,然后重建。 后门拿到地址时会执行任意代码,要假设可能落了别的东西:查新增定时任务、新用户、异常出站。被拿过 root 的机器,修不如重装。
四、三个别信的说法
「只有 import 了 litellm 的进程才受影响。」 路径配置和站点初始化都在解释器启动阶段执行。批处理脚本、IDE 的语言服务、CI 里的每一步,都会触发。
「卸载包就干净了。」 凭证已经出去了。清理只解决「不再继续偷」,解决不了「已经被偷」。
「我们走内部镜像,不直连 PyPI。」 镜像同步上游,同步那一刻就带进来了。要查的是镜像缓存里的 1.107.0。
五、一句话结论
这次不是漏洞,是有人拿到了发布权限。你能控制的只有两件事:装之前锁版本,装之后查得出。
信息来源
- Compromised LiteLLM 1.107.0 on PyPI Installs a Credential Stealer and Backdoor - SafeDep,2026 年 10 月 21 日
功能与价格以官方公告为准。本文写于 2026 年 10 月 22 日。
每周一封,只发新教程和可复制模板。不发广告,随时退订。