适用对象:使用 LiteLLM 的开发者和运维人员。LiteLLM 是一个开源工具,可通过统一接口调用多种 LLM(大语言模型)API,既可作为 Python 库使用,也可作为在 Docker 中运行的代理(LLM 网关)使用。
本文基于 LiteLLM 背后的公司 BerriAI 的官方通知,以及该公司在 GitHub 上发布的状态更新。本文不涉及攻击手法、恶意软件的内容或具体的入侵指标(IoC)值。文件名和镜像摘要请查看公司的通知页面。
事件发展中:该机构公布更多信息后,本文将随之更新
截至 2026 年 10 月 24 日 11:00 UTC(日本时间 20:00)尚不清楚
- 防止再次发生的改进措施(公司称将在下周分享)
- 受影响的用户或环境数量
- 被窃取的数据是否已被使用
10 月 23 日(UTC),公司表示已完成对攻击链的调查,并发布了根因分析。公司称,其在调查期间发布的状态更新中,有些假设“不准确或不完整”,并称该分析是权威来源。公司保留了第一篇事件帖子的原样。
用户需要做的事情(受影响的版本和时间窗口、清理、需要轮换哪些密钥)自第一篇帖子以来没有变化。10 月 24 日(UTC),公司发布了 1.103.8、1.104.6、1.105.4 和 1.106.3,PyPI 上的最新版本现在是 1.106.3。从这些版本起,用于签名 Docker 镜像和 Helm chart 的 cosign 密钥已更换(见下文第 3 步)。
LiteLLM 用户今天该做什么
第 1 步适用于所有人。之后的步骤遵循公司对已安装或启动受影响版本或镜像的环境所给出的指引。
确认自己是否受影响:安装时间,以及使用的标签
公司列出了以下受影响的构建产物。所有时间均为 2026 年 10 月 21 日。
| 渠道 | 受影响内容 | 时间窗口(UTC) |
|---|---|---|
| PyPI | litellm==1.107.0(全部七个 wheel) | 11:39 至 13:23 |
| Docker Hub | v1.107.0、latest、main-latest、main-stable | 11:46 至 14:20 |
| GHCR(GitHub 的容器镜像仓库) | 同样的四个标签(litellm、litellm-database、litellm-non_root) | 11:46 至 13:51 前下架 |
公司称,如果你在该窗口内未固定版本就用 pip 安装了 LiteLLM,或在该窗口内用这些标签之一启动了容器,就属于受影响。如果 CI 在每次构建时都运行 pip install litellm,或者你的 Dockerfile 使用 FROM 指向 latest 标签构建,那么即使没有人做任何操作,也可能安装了受影响的版本。
- 如果某个环境可能受影响,不要启动 Python 或 pip 来检查其版本。先将其隔离,再在另一台干净的机器上查看部署记录或镜像摘要。如果无法排除暴露的可能,就按受影响处理,并继续进行下面的重建和凭据轮换(本站提示)。公司的版本检查命令同样会启动 Python,因此在清理之前不要运行
- 公司已公布需要查找的文件名和镜像摘要。找到它们可确认已暴露,但找不到并不能证明环境是干净的
- 如果你明确固定了 1.106.2 或更早版本,或 1.107.0rc1 或 rc2,则不受影响(公司称更早的版本不在此次入侵范围内)
- 从私有企业版镜像仓库拉取的客户未受影响(公司)
如果已安装:不要在该环境中先执行 pip install
根据公司通知中引用的报告者分析,该恶意软件以 Python 每次启动时自动加载的文件形式安装。对于任何 Python 进程,包括从不导入 litellm 的进程以及 pip 本身,它都会再次运行。
公司给出的清理顺序如下(文件名和位置见其通知页面):
- 在不启动 Python 的情况下,从 shell 中删除每个受影响 site-packages 目录里公司点名的恶意文件(及其缓存文件)
- 停止在后台遗留运行的 Python 进程
- 然后才重新安装,并固定到
litellm==1.106.2。公司称从头重建镜像和虚拟环境更好
如果你在容器中运行,通常最快的做法是停止由受影响镜像创建的容器,并用固定到干净版本的镜像重新创建(本站提示)。
固定版本,并用新的签名密钥验证
公司在第一篇帖子中请用户固定使用 1.106.2 或本次事件之前发布的任何明确版本。10 月 24 日(UTC),公司随后发布了 1.103.8、1.104.6、1.105.4 和 1.106.3。PyPI 上的最新版本是 1.106.3,1.107.0 仍处于移除状态。据发布说明,这些版本从 SDK、代理和 Docker 镜像信任的所有证书包中移除了 eMudhra 根证书颁发机构。eMudhra 问题见Python 用户针对 eMudhra 中间 CA 密钥需要做什么。
在 Docker 中,请用版本标签引用镜像,最好用摘要(根据镜像内容计算出的值),而不要使用 latest 或 main-stable 这类内容会变化的标签。这样,标签指向的内容发生变化时就不会影响到你。
据发布说明,从 10 月 24 日的版本起,Docker 镜像和 Helm chart 使用新的 cosign 密钥签名(cosign 是用于对容器镜像签名和验证的工具),用旧密钥验证会失败。如果你在 cosign verify 脚本、CI 检查或检查签名的 Kubernetes 策略(如 Kyverno)中固定了旧的 cosign.pub,请换成发布说明中所指提交里的新密钥。发布说明还列出了新密钥的 SHA-256,切换前请将你下载的密钥与之比对(本站提示)。
轮换密钥:该环境可触及的一切
公司称,如果 1.107.0 曾安装在可以访问外网的主机上,你应假定被窃取的数据已成功被发送出去。公司特别点名了以下内容:
- 附加在服务器或容器上的云角色(如 AWS 实例或任务的 IAM 角色)
- LiteLLM 代理数据库中保存的所有 LLM 提供商密钥
- 代理主密钥和你签发的所有虚拟密钥
- 数据库连接字符串(DATABASE_URL)中的密码
- 主机上运行的任何进程环境中的所有机密
在报告者的分析中,该恶意软件还被设计为收集 SSH 密钥、Git 和包发布凭据、Kubernetes 令牌、浏览器中保存的密码以及 AI 编码助手的设置。如果你在开发者笔记本电脑上运行过 1.107.0,该电脑上的凭据也需要轮换。
在各服务的控制台中签发新密钥,并吊销旧密钥(本站提示:先设置新密钥,再吊销旧密钥,以避免服务中断)。API 密钥的处理见.env 文件和 API 密钥为什么有风险。
检查是否被滥用:云审计日志和 LLM 用量
公司请你在 AWS 审计日志(CloudTrail)中,查找安装前后由实例角色发出的身份检查调用(GetCallerIdentity),然后查找该角色的凭据是否被从你自己的基础设施之外使用。
本站提示:还请在 LLM 提供商的控制台中,检查自 10 月 21 日 11:39 UTC(日本时间晚上)以来用量或费用是否有异常上升。被盗的 LLM 密钥被使用时,可能会反映在用量和账单上。被盗密钥的后果见被盗 API 密钥如何导致账号被封。
在时间窗口内安装了 1.107.0 或启动了受影响的标签
视为已被入侵
↓→
1. 不启动 Python 进行清理
更好:重建镜像和虚拟环境
主机可以访问外网
假定数据已被发送出去
↓→
2. 轮换其可触及的所有密钥
云角色、提供商密钥、主密钥、数据库
明确固定了 1.106.2 或更早版本
公司称更早的版本不在此次入侵范围内
↓→
3. 保持固定;对新版本验证签名
在 Docker 中使用版本标签或摘要。10 月 24 日的版本起使用新的 cosign 密钥
如果你运行 LiteLLM 代理
代理数据库中保存着你所连接的每个 LLM 提供商的密钥。在报告者的分析中,当设置了 DATABASE_URL 时,该恶意软件被设计为读取保存提供商密钥和模型设置的表。如果你的代理曾以 1.107.0 启动,请计划轮换其中登记的每一个提供商密钥,并在开始之前列出清单。你分发出去的虚拟密钥也需要重新签发,提前准备好给使用者的通知可以减少混乱。
发生了什么(据 BerriAI)
以下内容基于 BerriAI 的博客文章“Contained: Oct 21, 2026 LiteLLM release v1.107.0 Compromised”(2026 年 10 月 21 日发布,当天 20:30 UTC 更新)、其 10 月 23 日的根因分析“The attack chain behind the v1.107.0 LiteLLM release”,以及其安全负责人在 GitHub issue 中发布的状态更新。除非另有说明,所有时间均为 10 月 21 日的 UTC 时间。攻击者使用的地址和名称等指标值不在此复述。
5 月 27 日
一个包含某内部智能体平台主密钥的配置文件被误提交到公开仓库。该提交很快被覆盖,但主密钥没有被吊销(根因分析)。10 月 10 日
攻击者用该主密钥调用该平台的 API,获得了配置在其中的组织所有者的 GitHub CLI 令牌。约 45 分钟后,攻击者用该令牌在公司的仓库中运行 CI 并窃取 CI 机密,获得另外两位维护者的令牌(根因分析)。10 月 12 日
攻击者用所有者的令牌在多个私有仓库中运行 CI,并第二次窃取机密:CI 测试中使用的敏感度很低的机密和资金很少的 LLM 提供商密钥。公司称这些与投毒构建产物的路径无关,并已轮换相关令牌、审计了安全日志(根因分析)。10:08
分支保护拒绝了对私有发布工作流的一项修改。五秒后,一个与特权开发者账号绑定的凭据被用来绕过该保护并应用了这项修改。10:46
被修改的工作流启动了一次预发布运行,其构建来源是攻击者控制的仿冒仓库。11:11
攻击者使用其他被盗凭据,使被修改的发布获得批准并发布。11:39 至 11:40
七个恶意的 1.107.0 wheel 被上传到 PyPI。11:46
同一发布的 Docker 镜像被发布。12:06
一位外部研究人员在 GitHub issue 中报告了该问题。12:09 至 12:24
攻击者清除了工作流修改的痕迹(根因分析;组织审计日志保留了记录)。13:02
公司开始事件响应(根因分析)。13:23 前
PyPI 已移除 1.107.0。14:20
所有受影响的 Docker Hub 标签已被移除或重新指向干净的镜像。20:30
公司更新了通知,称相信已查明攻击链。23:37
公司报告称正在识别整个组织内的每一个认证令牌,并逐一吊销或轮换。镜像仓库仍锁定,不接受新发布,常规发布仍暂停。10 月 22 日 02:19(日本时间 11:19)
公司报告称自上次更新以来没有重大进展。镜像仓库仍锁定,常规发布仍暂停。更新频率从每两小时一次改为有重大进展时更新。10 月 23 日约 21:00 至 21:50(日本时间 10 月 24 日约 06:00 至 06:50)
约 21:00,公司发布了根因分析,并称其早先的一些假设不准确或不完整。21:50(日本时间 06:50)对第一篇帖子的更新指向该分析,称其为权威记录。10 月 24 日约 07:56 至 09:15(日本时间约 16:56 至 18:15)
公司向 PyPI 发布了 1.103.8、1.104.6、1.105.4 和 1.106.3。这些版本从受信任的证书包中移除了 eMudhra 根证书颁发机构,Docker 镜像和 Helm chart 改用新的 cosign 签名密钥(发布说明)。
- 受影响内容
- PyPI 上的 litellm==1.107.0(全部七个 wheel)。Docker Hub 和 GHCR 上的 v1.107.0、latest、main-latest 和 main-stable 标签(在 GHCR 上:litellm、litellm-database 和 litellm-non_root 镜像)
- 发生了什么
- 发布流水线遭到入侵,一个含有恶意软件的 1.107.0 被发布。GitHub 上官方的 v1.107.0 标签不含恶意文件;这些构建产物是由攻击者控制的仿冒仓库构建的
- 恶意软件的行为(据披露)
- 已编译的恶意软件,窃取凭据并加载远程代码执行工具。它在 Python 每次启动时运行,并在后台遗留一个进程
- 不在此次入侵范围内的版本
- 所有更早的版本都不在此次入侵范围内。目前请固定使用 1.106.2 或其他明确指定的版本
- 原因(10 月 23 日根因分析)
- 一个误提交到公开仓库、从未被吊销的内部智能体平台主密钥,被用来获取某位组织所有者的 GitHub CLI OAuth 令牌。该令牌没有绑定到服务账号,也没有缩小权限范围。攻击者借此窃取了 CI 机密,并获得两位维护者的令牌。所有者的令牌被用于关闭分支保护和修改工作流,其他被盗令牌被用于使被修改的发布通过审批
- 发布审批(根因分析)
- 通常,发布必须由一个锁定在公司办公室内某台物理设备上的专用账号批准。当周早些时候,为了支持更频繁的缺陷修复发布,这一要求被放宽,允许任意两名工程师触发并批准发布
- 对最初解释的更正
- 第一篇帖子怀疑令牌来自内部 LiteLLM 部署的日志。该分析称第一个令牌来自另一项服务
- 被窃取的其他凭据
- 其他几个内部系统的令牌也被窃取,攻击者的活动主要集中在上游推理 API 密钥(LLM 提供商密钥)上。10 月 12 日,从多个私有仓库窃取了敏感度很低的 CI 测试机密和资金很少的提供商密钥;公司称它们与投毒构建产物的路径无关。公司正在吊销所有内部系统和供应商平台的每一个令牌
- 公司的应对
- 从 PyPI、Docker Hub 和 GHCR 移除了这些构建产物。吊销了相关令牌,将其 GitHub 组织缩减为一名未受影响的成员,移除了其公开镜像仓库与该组织之间的信任关联,并正在吊销或轮换每一个令牌。10 月 24 日(UTC)发布了使用新签名密钥的 1.103.8、1.104.6、1.105.4 和 1.106.3
- 数量与滥用情况
- 未披露
已知与未知
以下是截至 2026 年 10 月 24 日的情况。有后续信息时,将更新状态列。
| 项目 | 通知所述内容 | 状态 |
|---|---|---|
| 受影响版本(PyPI) | litellm==1.107.0,全部七个 wheel | 已确认(公司) |
| 受影响的镜像和标签 | Docker Hub 和 GHCR 上的 v1.107.0、latest、main-latest、main-stable | 已确认(公司) |
| 时间窗口 | PyPI 11:39 至 13:23 UTC;Docker Hub 11:46 至 14:20 UTC;GHCR 于 13:51 UTC 前下架 | 已确认(公司) |
| 发布版本中的恶意软件 | 窃取凭据并加载远程代码执行工具 | 已确认(公司) |
| 受影响主机上的凭据 | 如果主机可访问外网,则假定数据已被发送出去 | 可能(公司) |
| 更早的版本 | 不在此次入侵范围内 | 未受影响(公司) |
| 私有企业版镜像仓库 | 未受影响 | 未受影响(公司) |
| GitHub 上的官方源码标签 | 不含恶意文件 | 未受影响(公司) |
| 令牌是如何被获取的 | 一个误提交到公开仓库、未被吊销的主密钥,被用来获取保存在内部智能体平台中的所有者令牌(10 月 23 日根因分析) | 已确认(公司) |
| 第一篇帖子中“从日志中获取”的解释 | 分析中已更正:第一个令牌来自另一项服务 | 已更正(公司) |
| 10 月 12 日的第二次窃取 | 来自私有仓库的 CI 测试机密和资金很少的提供商密钥;与投毒构建产物的路径无关 | 已确认(公司) |
| 修复版本和签名密钥 | 10 月 24 日发布了 1.103.8、1.104.6、1.105.4 和 1.106.3;Docker 镜像和 Helm chart 使用新的 cosign 密钥签名 | 已确认(公司) |
| 防止再次发生的改进措施 | 将于下周分享 | 已计划(公司) |
| 受影响的用户或环境数量 | 通知中未说明 | 未说明 |
| 被盗数据是否被滥用 | 通知中未说明 | 未说明 |
如何理解:即使时间窗口很短,也要以是否安装或启动过它来判断
该版本在 PyPI 上线了约两小时,但 CI 中未固定版本的安装或自动重建可能在这段时间内拉取到它。本站不对数字作猜测。请以你是否在时间窗口内安装了 1.107.0 或启动了受影响的标签来判断自己是否受影响。
公司的通知和分析提到了发现该问题的研究人员、一家独立调查的安全公司,以及第一篇帖子中提到的开发者工具。依照本站的政策,只点名披露该事件的机构;其他方以角色描述。
发布版本含有恶意软件时可能发生什么
以下内容是一般性说明,并不意味着本案中发生了这些情况。公司已披露的关于该恶意软件的信息见上文“发生了什么”。
Python 包以安装者的权限运行。在服务器或容器上,它可以访问该主机的环境变量、文件以及附加在其上的任何云角色。LLM 网关的作用就是把多个 LLM 提供商的密钥集中保存在一处,因此一旦它被入侵,它所连接的每个提供商的密钥都会同时面临风险。
它与仿冒包名(typosquatting,利用拼写相近的包名投毒)或利用旧版本漏洞的区别在于,恶意代码来自官方渠道,使用的是官方名称和版本号。同类事件包括 Trivy 供应链入侵、TanStack 和 Nx Console 事件,以及 WordPress 插件 Rank Math PRO 中的恶意软件。
LiteLLM 用户应检视什么:从已披露事实中得到的教训
本节不评判公司的应对。它从通知和根因分析中挑出用户可以据此行动的要点,以便为下一次事件做准备。
不要使用内容会变化的引用:固定版本并使用摘要
受影响的环境是那些未固定版本就用 pip 安装的环境,或使用 latest、main-latest 和 main-stable 这类内容会变化的标签的环境。固定了 1.106.2 并用摘要引用 Docker 镜像的环境,即使在该窗口内重建过,也未受影响。
第一步,请用包含哈希的锁定文件来固定生产环境和 CI 中使用的依赖(pip install --require-hashes,或 uv、Poetry 的锁定文件)。避免使用刚发布不久的版本的设置(如 uv 的 exclude-newer,它会忽略在给定时间之后发布的所有内容)也有助于应对几小时内就被撤下的发布。具体做法见用 OSV-Scanner 审计依赖。
拆分你交给 LLM 网关的密钥,并假定将来必须轮换
代理数据库中保存着你所连接的每个提供商的密钥。像现在这样必须轮换时,如果不知道哪个密钥属于哪个环境,你就只能在可能遗漏一些和全部停机之间做选择。
为开发、测试和生产使用各自独立的提供商密钥,并在提供商一侧设置支出上限和告警,可以缩小轮换范围,也能更早发现滥用。密钥泄露后怎么办,见AI 编写的代码中泄露的 API 密钥。
已暴露的密钥,即使覆盖了提交也要吊销
据根因分析,起点是 5 月被误提交到公开仓库的一个主密钥。该提交很快被覆盖,已暴露的密钥也被认定需要吊销,但主密钥没有被吊销,大约四个半月后它被用上了。公司称,这起事件有力地说明了不轮换可能已暴露的密钥有多大风险。
如果你把机密推送到了公开仓库,请先吊销并更换密钥,再去处理历史记录。轮换之后,请对照你已更换的密钥清单,确认没有遗漏(本站提示)。这一问题见仍然有效的泄露凭据。
不要把所有者的个人令牌交给自动化工具
据该分析,被窃取的第一个令牌是为了让智能体平台能够创建拉取请求而配置在其中的。它没有绑定到服务账号,也没有缩小权限范围:它是某位组织所有者的个人 GitHub CLI 令牌。公司指出,GitHub CLI 令牌是在双重认证之后签发的,不受 GitHub 在敏感操作前要求的重新认证约束。
请为智能体和机器人使用仅限其职责范围的专用令牌(GitHub App 或细粒度令牌),并把所有者权限与日常工作所用的账号分开(本站提示)。让 CI 机密只对需要它们的工作流和环境可用,也能限制被盗令牌的影响范围(本站提示)。保护 GitHub 账号的方法见设置 GitHub 双重认证。
不要让网关的日志和管理界面暴露在互联网上
事后证明这并不是原因,但公司的第一篇帖子指出,在特定情况下,AI 编码助手可能把用户的 GitHub CLI 令牌嵌入响应正文,而在记录响应正文的地方,这些令牌可能出现在 LiteLLM 日志中。
对于自己运行的网关,请检查三件事:管理界面和 API 不能从互联网直接访问;审查保留响应正文的日志设置;如果要保留,保留期应当较短。保护 GitHub 账号的方法见设置 GitHub 双重认证。
来源(公开记录)
本文中的事实来自以下公开信息。恶意软件的内容、其联系的地址和具体的入侵指标值不在此复述。
- BerriAI(LiteLLM),“Contained: Oct 21, 2026 LiteLLM release v1.107.0 Compromised”(2026 年 10 月 21 日发布,当天 20:30 UTC 更新)— docs.litellm.ai
- BerriAI(LiteLLM),“The attack chain behind the v1.107.0 LiteLLM release”(根因分析,2026 年 10 月 23 日发布)— docs.litellm.ai
- BerriAI/litellm GitHub issue #47826(外部研究人员的报告和公司的状态更新,已核对至 10 月 23 日 21:15 UTC 的更新)— github.com
- litellm 的 PyPI 项目页面(10 月 24 日 11:00 UTC 核对;最新版本为 1.106.3,未列出 1.107.0)— pypi.org
- BerriAI/litellm GitHub releases(2026 年 10 月 24 日发布的 v1.103.8、v1.104.6、v1.105.4 和 v1.106.3:签名密钥变更及 eMudhra 根 CA 的移除)— github.com
更新记录
2026-10-24(11:00 UTC):加入了公司在 10 月 24 日(UTC)发布 1.103.8、1.104.6、1.105.4 和 1.106.3 的信息,取代了此前“PyPI 上的最新版本仍为 1.106.2”的说法。在第 3 步和常见问题中补充了:这些版本的 Docker 镜像和 Helm chart 使用新密钥签名(旧密钥已无法验证),以及 eMudhra 根 CA 的移除。补充了根因分析中 10 月 12 日的第二次窃取(据公司称,与投毒构建产物的路径无关)。
2026-10-24:加入了公司 10 月 23 日发布的根因分析。将令牌被获取的方式,从第一篇帖子的判断(内部 LiteLLM 部署的日志)改写为:误提交到公开仓库且从未吊销的主密钥,然后是保存在内部智能体平台中的所有者令牌,再然后是 CI 机密。更新了时间线、常见问题、表格和面向用户的章节。10 月 22 日和 23 日的报道描述的是最初的判断(令牌通过 AI 工具或网关日志泄露),公司此后已更正。用户需要做的事情没有变化。不包含入侵指标值(IP 地址、名称、提交)。
2026-10-22(日本时间 13:30):加入了 10 月 22 日 02:19 UTC 的 GitHub 更新(没有重大进展;今后仅在有重大进展时更新)。通知仍是 20:30 UTC 的版本。明确了 GHCR 上哪些镜像受影响,并澄清了滥用检查的措辞。
2026-10-22:初版,基于 BerriAI 在 10 月 21 日 20:30 UTC 更新的通知以及当天 23:37 UTC 的 GitHub 更新。入侵路径或数字公布后将更新。
延伸阅读
- 相关:Railway 环境变量可能暴露(2026 年 10 月)
- 同类事件:Trivy 供应链入侵后,在 CI 中使用 Trivy 的人该怎么做 / TanStack、Nx Console 与 GitHub 的连锁事件
- 被盗令牌的吊销顺序:防御 npm 供应链蠕虫
- 机密存放在哪里:.env 文件和 API 密钥为什么有风险 / 仍然有效的泄露凭据
- 术语:什么是后门 / 什么是恶意软件
- 2026 年的其他事件:2026 年的数据泄露和网络攻击