GHSA-92x9-889m-jgmw恶意软件公告已包含 LiteLLM 1.107.0
跟踪条目同时包含 1.107.0 和 3 月的旧恶意版本;共用条目不能证明攻击者相同。
PyPI 和 Docker 上的 LiteLLM 1.107.0 是个带远程代码加载器的凭据窃取程序,构建自一个山寨仓库
LiteLLM 确认,5 月泄露后未吊销的 Agent Platform 密钥导致 GitHub 所有者令牌于 10月10日被盗。攻击者随后用被盗的维护者令牌在 10月21日发布恶意的 1.107.0 wheel 和镜像。应以锁定的 1.106.2 重建,并轮换暴露的凭据。
被劫持的发布工作流用攻击者复制的仓库构建了 LiteLLM。wheel 包会放下一个 .pth 文件,于是这台机器上的每个 Python 进程,连 pip 在内,都会运行一个窃取程序:把你的密钥发到假冒的 litellm.dev,再拉起一个能下载并执行更多代码的守护进程。
LiteLLM 是夹在应用和几十家 LLM 供应商之间的 Python SDK 兼代理,所以它手里往往攥着公司所有供应商的密钥。2026年10月21日 11:39 UTC,恶意的 litellm==1.107.0 出现在 PyPI 上;从 11:46 UTC 起,v1.107.0、latest、main-latest 和 main-stable 这几个官方 Docker 镜像标签也都指向了投毒构建。这是 LiteLLM 今年第二次发布流水线被攻破,上一次是 3 月的 1.82.7 和 1.82.8。JFrog 和 Datadog 表示,目前没有证据把两次事件联系起来。
根据 LiteLLM 自己的报告,攻击者手里有三名工程师的 GitHub CLI OAuth 令牌。其中一个属于组织所有者,被用来绕过私有发布工作流的分支保护,并把它指向 Berri-AI/litellm:一个和真仓库 BerriAI/litellm 只差一个连字符的山寨仓库。第二个令牌通过了生产发布的审批关卡,第三个事后删掉了工作流运行记录。真正的 v1.107.0 git 标签是干净的。这些制品是用攻击者的副本构建、再由真实流水线签名的。10月24日更正: LiteLLM 在 10月23日的正式报告中取代了此前关于内部部署日志泄露令牌的推测。5 月暴露后未吊销的 Agent Platform 主密钥,让攻击者在 10月10日通过该服务 API 取得所有者令牌,随后恶意 CI 工作流又提取了两个维护者令牌。
1.107.0 的七个 wheel 包都多了三个文件:cook.pth、cook.py 和 sitecustomize.py,源码包里没有。因为有 .pth 钩子,这个窃取程序会在该环境里每次 Python 启动时运行,哪怕根本没人 import LiteLLM,哪怕你只是在跑 pip。据 Socket 和 JFrog 分析,它会收集:
GetCallerIdentity 校验DATABASE_URL,还会拿走 LiteLLM 代理自己的 LiteLLM_CredentialsTable 和 LiteLLM_ProxyModelTable,你的供应商密钥就存在这两张表里数据加密后(AES-256,密钥用 RSA-4096 包裹)POST 到 www.litellm[.]dev/healthcheck。sitecustomize.py 还会 fork 出一个脱离终端的守护进程,每小时去 GitHub 上的一个 dead drop 查一次域名,然后从那里下载 Python 代码并直接 exec(),不做任何完整性校验。研究人员查看时这个 dead drop 是空的,之后也已被删除,但窃取部分并不依赖它。
有。Wiz 观察到,在数据外传约 4.5 小时后,被盗的 AWS 实例角色凭据从 168.100.8.57 和 165.227.201.8 被拿去验证,并在“少数”环境中出现了 IAM 枚举。Datadog 表示在野没有看到第二阶段载荷。没有任何来源给出 1.107.0 的下载量;唯一被引用的数字是 LiteLLM 总体每周约 2300 万次下载,这并不等于受影响范围。
一个按设计就握着所有 LLM 供应商密钥的包,一个只要 Python 启动就偷云和 AI 凭据的载荷,再加上已证实攻击者在使用被盗凭据:这就是正在发生的利用加大规模凭据窃取。没到 L5,是因为只涉及一个版本、在线约两小时、不会自我传播,也没有哪个核心运行时或信任根被攻破。
wiz-adv-2026-188 和 XRAY-955589 跟踪本次事件。11月1日更新(UTC): 厂商10月30日通知公布替代 cosign 公钥的指纹,并表示旧私钥可能已经泄露。轮换发生于10月23日,首批使用替代密钥签署的版本于10月24日发布。应同时验证固定提交中的公钥和镜像摘要。恶意镜像由真实发布流水线使用旧密钥签署,因此仅有有效签名不能排除此事件的影响。上述暴露主机重建及凭据轮换措施仍然适用。
GHSA-92x9-889m-jgmw跟踪条目同时包含 1.107.0 和 3 月的旧恶意版本;共用条目不能证明攻击者相同。
| 产品 | 安全版本 | 备注 |
|---|---|---|
| LiteLLM (PyPI) | 1.106.2 | 最后一个干净版本;1.107.0 已下架 |
| LiteLLM Docker 镜像 | v1.106.2 (pin by digest) | 浮动标签被重新指向过 |
| LiteLLM Enterprise(私有仓库) | not affected | 据 LiteLLM 所述 |
2026年5月27日
Agent Platform 主密钥出现在公开提交中
提交被替换,但密钥未吊销。
2026年10月10日
Agent Platform API 返回 GitHub 所有者令牌
随后仓库 CI 又泄露了两个维护者令牌。
2026年10月12日
更多仓库密钥通过 CI 外传
2026年10月13日
山寨域名 litellm.dev 被注册
依据 JFrog 查到的 WHOIS 数据。
2026年10月21日 08:56–10:46 UTC
恶意载荷被提交到山寨仓库 Berri-AI/litellm
Wiz 数到 10 次提交,前三次加入了 cook.pth、cook.py 和 sitecustomize.py。
2026年10月21日 10:08 UTC
私有发布工作流的分支保护被绕过
攻击者用一名组织所有者被盗的 GitHub CLI 令牌关闭了保护,并把工作流指向山寨仓库。
2026年10月21日 11:11 UTC
第二个被盗凭据批准了生产发布
2026年10月21日 11:39–11:40 UTC
七个恶意的 litellm 1.107.0 wheel 包上传到 PyPI
大约七分钟后,Socket 的扫描器发出告警。
2026年10月21日 11:46 UTC
恶意镜像发布到 GHCR 和 Docker Hub
v1.107.0、latest、main-latest 和 main-stable 全部指向同一个恶意镜像索引。
2026年10月21日 11:53 UTC
第三个被盗凭据删除了工作流运行记录
2026年10月21日 13:51–14:20 UTC
Docker 标签被撤下或重新指向干净镜像
据 LiteLLM 说,先处理 GHCR,Docker Hub 在 14:20 前清理完毕。Wiz 和 Datadog 给出的下架时间约为 13:53。
2026年10月22日
GitHub 恶意软件条目已包含 1.107.0
GHSA-92x9-889m-jgmw 也包含 3 月的旧版本,这不能证明共同归因。
2026年10月23日
LiteLLM 发布正式攻击链调查结论
厂商以已确认的密钥泄露和 Agent Platform API 路径,取代此前关于内部部署日志的推测。
2026年10月30日
厂商公布替代镜像签名公钥的指纹
10月23日轮换的密钥从 v1.103.8、v1.104.6、v1.105.4 和 v1.106.3 起签署发布。恶意镜像也带有有效的旧密钥签名。
2026年10月21日 ~13:20 UTC
PyPI 下架 1.107.0
Wiz 和 Datadog 说是 13:20,LiteLLM 的报告说是 13:23。
2026年10月21日 ~16:20–17:01 UTC
被盗的 AWS 实例角色凭据被攻击者 IP 使用
Wiz 在客户环境中观察到,距凭据外传约 4.5 小时。
我们列出每条说法和它的出处,并标出一手来源(厂商、研究人员、软件仓库)。各方说法不一致时,按最坏的可信情况定级。