LiteLLM 表示,恶意的 1.107.0 于北京时间 10 月 21 日 19:40 左右发布到 PyPI、Docker Hub 和 GHCR,团队在 21:32 发现。恶意版本和镜像现已撤下。只从 LiteLLM 私有仓库拉取镜像的企业部署不受影响。装过或运行过 1.107.0 的,要把这些部署能访问到的凭证都当作已泄露。应固定使用的干净版本是 1.106.2。

恶意包做了什么

根据 SafeDep 的分析,1.107.0 的 wheel 会往 site-packages 里多放三个文件,其中两个在这台机器上每次启动 Python 都会运行,哪怕进程根本没有 import litellm。一个是凭证窃取程序,另一个是能下载并执行后续代码的后门。

SafeDep 列出的窃取对象包括:SSH 密钥,云凭证(AWS、Azure、gcloud、Kubernetes、Docker),CI/CD 密钥,AI 编程工具的 token,浏览器保存的密码,其他进程的环境变量;如果配置了 LiteLLM 代理数据库,还会导出里面存的各家大模型 API key。LiteLLM 网关往往存着团队所有 provider 的 key,一台中招的代理就可能把它们全部泄露。网关在团队和模型厂商之间的位置,可以参考OpenAI 要求模型路由和 AI 网关先获批准的新规。

怎么自查、怎么处理

先确认有没有哪台机器、哪个虚拟环境、容器镜像或 CI 任务装过 litellm 1.107.0,或者在事件期间拉过标签为 v1.107.0、latest、main-latest、main-stable 的 LiteLLM Docker 镜像。GitHub issue 的处置说明列出了这个包会放进 site-packages 的文件:cook.pth、cook.py 和 sitecustomize.py。

如果装过 1.107.0,issue 给出的处置步骤是:

  1. 不要一上来就在受影响的环境里运行 pip install。在那里启动任何 Python,包括 pip,都会再次运行恶意代码。
  2. 在 shell 里,从每个受影响的 site-packages 删除 cook.pth、cook.py、sitecustomize.py 以及对应的 .pyc 缓存文件。
  3. 结束后门启动的那个脱离父进程的 Python 后台进程。
  4. 固定到 litellm 1.106.2 重新安装,最好把镜像和虚拟环境从头重建。Docker 部署改用 v1.106.2 重新部署。
  5. 如果这台机器能访问外网,就当作凭证已被偷走,把它能访问到的全部轮换:模型 API key(包括 LiteLLM 代理数据库里存的所有 key,以及代理的 master key 和 virtual key)、云凭证和实例角色、SSH 密钥、CI 密钥、数据库密码,以及这台机器上任何进程环境变量里的密钥。

LiteLLM 官方给开源版用户的建议是:固定到 1.106.2,或事件之前发布的某个明确版本。近期另一起开发工具安全事件,可以看OpenCode Console 安全事件。防守一侧的例子,见AI 帮忙找出 PHP 严重漏洞,网站运营者该检查什么。

来源

  • LiteLLM security statement on X (https://x.com/LiteLLM/status/2112945728565993864)
  • LiteLLM GitHub issue #47826 (https://github.com/BerriAI/litellm/issues/47826)
  • SafeDep analysis (https://safedep.io/litellm-pypi-compromise-credential-stealer-backdoor/)