跳转到内容
Guide

LiteLLM 被后门:本周审核您的 AI 工具链

| 8 min read

TeamPCP 在 LiteLLM 版本中发送了窃取凭据的恶意软件,并从开发计算机中耗尽了 AWS、GCP 和 SSH 密钥。 在下次 pip 安装之前运行五项检查。

Server rack representing supply chain infrastructure and credential exposure
Photo by Taylor Vick on Unsplash

2026 年 3 月,一个自称 TeamPCP 的威胁参与者发布了一份被篡改的版本 litellm,Python 库将 100 多个 LLM 提供者包装在一个单一的 OpenAI 兼容接口。 该版本将一个信息窃取器连接到安装后路径中。 凡是跑过的人 pip install litellm 在交出 SSH 私钥的窗口期间, AWS 凭证、Azure 令牌、GCP 服务帐户 JSON 和 Docker config.json 文件发送到攻击者控制的端点。 黑客新闻、Ardan 实验室和安全大道 每个人都确认了归属和泄露的文物列表。

LiteLLM 并不晦涩难懂。 它位于代理框架内部、路由 eval 的 CI 管道内部 数据科学家笔记本电脑上的 Jupyter 笔记本内跨提供商的流量 长期的云凭证。 一个受感染的版本给了攻击者一个提供商的钱包 密钥、一组云角色以及将这些密钥横向移动到每个存储库的 SSH 材料 可以达到。

您无法阻止维护者的 PyPI 令牌被盗。 你可以缩小爆炸半径 这样当下一个人工智能库受到攻击时; 它会的; 一台笔记本电脑不会变成一台 跨云事件。 以下是本周值得对整个人工智能运行的五项检查 工具链:LiteLLM、LangChain、LlamaIndex、Ollama 包装器、Claude SDK、MCP 客户端等 您在生产中拥有的代理框架。

TeamPCP 实际采取了什么

有效负载在里面运行 setup.py 和一个安装后挂钩。 导入或安装时 从开发人员的主目录和 CI 运行程序文件系统中读取以下内容:

  • ~/.ssh/id_rsa, id_ed25519, 和 known_hosts
  • ~/.aws/credentials~/.aws/config 简介
  • ~/.azure/ 令牌和刷新凭证
  • GCP application_default_credentials.json 和服务帐户 JSON 文件
  • ~/.docker/config.json 包括注册表身份验证令牌
  • 环境变量开头为 AWS_, GCP_, OPENAI_, ANTHROPIC_, GITHUB_

exfil 通道是发送到攻击者域的普通 HTTPS POST,每周轮换一次。 拆除 几天之内就发生了,但是这个窗口就足够了; 泄露的凭证无法被泄露。 继续检查。

检查 1:固定精确版本,而不是范围

^1.14.0~=1.48 中的模式 requirements.txt, pyproject.toml, 和 package.json 让任何新的次要版本或补丁发布 滚入干净的环境过夜。 这就是三小时恶意窗口如何成为 长达一个月的暴露; 你的锁文件从未重新生成,但你的 CI 缓存拉出了坏的 下一个冷构建版本。

固定精确版本。 当生态系统支持时通过哈希固定。

--require-hashes, pip 拒绝安装 SHA-256 不匹配的任何内容 您在锁定时生成的内容。 具有相同版本字符串但具有相同版本字符串的受损版本 不同的 tarball 哈希使安装失败。 一对 pip-compile --generate-hashes 与一个 CI 作业仅在显式依赖项更新时重新生成哈希文件,而不会在普通依赖项上重新生成哈希文件 安装。

诗歌用户通过锁文件获得相同的安全网。 问题是插入符号语法 pyproject.toml; 用精确的引脚替换它:

poetry install --sync 删除任何不在锁定文件中的包,从而停止 部署之间隐藏的杂散依赖。 对于 npm 端 AI 工具,请使用 npm ci (不是 npm install) 在每次 CI 运行和提交时 package-lock.json

检查 2:将凭证与开发 shell 隔离

一个开发外壳有 ~/.aws/credentials 具有长期访问密钥的是已加载的 枪指着你的云账单和你的客户数据。 LiteLLM 不需要这些凭据 做好它的工作; 它们位于磁盘上,因为开发人员曾经运行过 aws configure 和 从来没有清理过。

将凭据移出磁盘。 按需加载它们,缩短它们的范围,并撤销持久化 层:

  • 亚马逊AWS: aws sso login 会话持续时间上限为 8 至 12 小时。 删除 ~/.aws/credentials。 一切都应该经历 ~/.aws/sso 自己过期的缓存。
  • 通用控制点: gcloud auth application-default login--lifetime=43200。 撤销笔记本电脑上长期存在的服务帐户 JSON; 使用 CI 中的工作负载身份联合。
  • 天蓝色: az login 具有强制 MFA 的条件访问; 杀 存储时间超过 12 小时的刷新令牌。
  • API 密钥: 将它们保存在 1Password、Vault 或多普勒中。 在进程启动时注入 通过 op run 或者 vault read。 切勿将它们导出到 ~/.zshrc

如果 TeamPCP 仅发现过期的 STS 会话令牌,则爆炸半径将在几个小时内停止 的访问权限。 该事件的发生是因为长寿命密钥以明文形式保存在磁盘上,随时可以使用 阅读。

检查 3:使用沙箱扫描每个安装

在您信任新的 AI 库或升级现有的 AI 库之前,请将其安装在某个位置 无法获取您的凭据。 一个一次性的 Docker 容器,其功能已被删除,并且 网络隔离会告诉您安装时代码是否执行任何可疑操作:

两步模式很重要。 第一步需要网络访问才能到达 PyPI,因此安装后 脚本仍然可能泄露。 在没有机密和 DNS 出口规则的干净虚拟机上运行第一步 记录每个出站主机名。 第二步运行 --network=none; 如果你的 图书馆在导入时尝试打电话回家,导入失败,你知道。

更好:使用像 Firecracker 这样的一次性 microVM 或 orb 在 macOS 上也有同样的效果 没有 Docker 共享内核的形状。 对于 JavaScript,Deno 的权限模型为您提供了 没有容器的相同隔离: deno run --allow-net=api.openai.com,api.anthropic.com agent.ts

检查 4:轮换前验证违规暴露情况

如果您的钥匙位于接触不良释放的机器上,请旋转它们。 没有辩论。 但也 检查与这些密钥相关的身份是否已经出现在已知的转储中; 一台笔记本电脑 上个月运行了受感染的 LiteLLM 版本的笔记本电脑可能是其所有者重复使用了密码 来自 2019 Collection1 转储。 这两个问题都需要解决,检查 4 会告诉您哪些帐户 需要最紧急的关注。

波托伊的 /v1/breach/check 大多数企业 IAM 端点包含相同的数据源 工具按每个席位付费,并且在免费套餐中无需任何费用:

遍历每封服务帐户电子邮件、每封机器用户电子邮件以及每一位使用笔记本电脑的人类开发人员 触摸了窗户。 任何带有以下内容的电子邮件 password_exposed: true 需要旋转和 在继续之前强制重置 MFA。 将输出通过管道传输到事件响应操作手册中; 一 对于一个 50 人的工程组织,每个身份卷曲一次需要 10 分钟。

检查 5:监视您的出站出口

安装后的恶意软件必须以某种方式打电话回家。 大多数开发人员都不记得上次是什么时候 他们查看了笔记本电脑实际上正在与什么对象进行通信; 这就是 TeamPCP 所指望的差距。

在可疑机器上,单个命令可以告诉您每个 Python 和 Node 进程是什么 连接到:

在车队级别,推动每台开发人员笔记本电脑和 CI 运行程序通过零信任出口 允许名单。 Cloudflare WARP、Tailscale ACL 和 Little Snitch 都为您提供相同的形状: 列出您实际需要的主机名,阻止其余的主机名,并在阻止时发出警报。

如此严格的允许名单在第一周让人感觉很艰难。 到第二周,您看到的唯一警报是 真实:图书馆试图到达它没有业务到达的目的地。 这正是 信号 TeamPCP 的 infostealer 在安装时会被绊倒。

五项检查一览

查看 努力 爆炸半径减小
使用哈希值固定确切版本 单个 repo 1 小时; monorepo 需要 1 天 停止静默推出受损版本
将凭据移至短期会话 每位开发人员一次性 2 至 4 小时 将访问时间限制为 8 至 12 小时,而不是几个月
每次安装都使用沙箱 每个新库评估 15 分钟 安装时代码无法看到真正的秘密或产品网络
与暴露的密钥相关的违规检查身份 对于 50 人的组织,需要 10 分钟 根据已知曝光优先考虑轮换和 MFA 重置
在开发和 CI 上强制执行出口允许名单 1天配置,持续维护 阻止泄露被盗数据的回拨通道

要点

  • 固定精确版本,而不是范围。 锁定文件中的插入符号或波形符是一个承诺 明天的发布是安全的。 TeamPCP 违背了这一承诺。
  • 云凭证不属于开发 shell。 短暂的 SSO 会话会导致 凭证被盗属于轮换事件,而不是违规事件。
  • 沙盒会在您信任它们之前安装。 Docker 带有大写字母和 --network=none 只需 15 分钟即可捕获安装时恶意软件。
  • 旋转加缺口检查。 如果机器接触到不良释放装置,则每隔 它看到并运行每封电子邮件的身份 /v1/breach/check 找到那些 需要紧急重置 MFA。
  • 出口许可名单捕获回拨。 笔记本电脑和 CI 上的零信任规则变成了 无声地渗透到一个响亮的、记录的、可封锁的事件中。

Botoi 为您提供用于违规检查、哈希验证、SSL 检查、HTTP 的 HTTP 端点 标头审核和 npm 元数据查找; 审核供应链所需的原语 事件没有安装另一个库。 一个 API 密钥,免费套餐上每分钟 5 个请求,无 安装挂钩。 浏览 交互式文档 或接线 MCP服务器 进入 Claude Code 或 Cursor 在您工作时从编辑器调用相同的端点 清单。

FAQ

哪些 LiteLLM 版本受到影响以及如何确认我没有受到影响?
这些恶意版本于 2026 年 3 月出现,并在 PyPI 上停留了足够长的时间,并进入了全球的 CI 缓存和开发人员笔记本电脑。 运行 pip show litellm 打印您安装的版本,然后对照 LiteLLM 安全公告和 PyPI 发布历史记录交叉引用该版本并上传时间戳。 如果计算机在该窗口期间运行 pip install litellm,请将其视为已受到威胁:轮换位于该 shell 中的每个云密钥,从干净的映像重新部署,并擦除轮换之前的 ~/.aws、~/.config/gcloud 和 ~/.ssh 令牌。
这是 PyPI 错误还是 LiteLLM 错误?
两者都是,这就是教训。 LiteLLM 是一个合法的库,有真正的维护者; 攻击者利用了受损的发布渠道,而不是仿冒域名。 PyPI 仍然不需要每个项目的签名版本或强制 2FA 令牌,因此被盗的上传凭证在几分钟内就会变成恶意软件。 通过 Sigstore 和维护者范围的令牌进行包签名将在上传时切断攻击。
我是否需要轮换每个 AWS 密钥,还是仅轮换受影响计算机上接触过的密钥?
将它们全部旋转。 攻击者一旦拥有单个长期密钥,就会通过 STS、假设角色链和跨账户信任策略进行攻击。 如果看到错误版本的笔记本电脑或 CI 运行程序在内存或磁盘上有任何 IAM 凭证,则将从该身份可访问的整个主图视为热图。 GCP 服务帐户和 Azure 服务主体的逻辑相同。
Bun 或 Deno 是否会改变 JavaScript AI 工具的这一点?
一点点,不是很多。 Deno 使用显式权限(--allow-net、--allow-env)运行代码,因此突然尝试读取 ~/.aws/credentials 的库会被拒绝,除非您授予文件系统访问权限。 Bun 有一个 --frozen-lockfile 标志,并且在最近的版本中默认不运行安装脚本。 两者都是对 npm 默认值的改进,但一旦应用程序代码在运行时将凭据交给库,它们都不会阻止库泄露数据。
AI 工具链供应链风险与常规 npm 或 PyPI 风险有何不同?
人工智能图书馆异常接近秘密。 像 LiteLLM 这样的 LLM 包装器需要在一个 env 文件中提供 10 多个提供商的 API 密钥。 LangChain 代理读取 AWS 凭证,以便它可以调用 S3 作为工具。 Claude SDK 接触 GITHUB_TOKEN 因为您要求它打开 PR。 每次安装的爆炸半径高于典型的实用程序库; 一个受感染的版本可以一次性为您提供一个包含提供商密钥的钱包、云凭证以及源代码访问权限。

开始使用 botoi 构建

150+ 个 API 端点,涵盖查询、文本处理、图片生成和开发者工具。免费套餐,无需信用卡。