Forcepoint X-Labs 5 月 18 日披露了一起针对 LiteLLM 的供应链攻击。LiteLLM 是一个开源 Python gateway,作为 100+ LLM 提供方的统一接口。威胁组 TeamPCP 毒化了 PyPI 上的 1.82.7 和 1.82.8 两个 release。攻击链没有直接攻破 LiteLLM 的源码仓库 —— 相反,TeamPCP 毒化了 Trivy(LiteLLM 在构建流水线里用的漏洞扫描器),冒充 Trivy 维护者,触发自动化的 release 流程,从而分发被植入后门的 Trivy 二进制。当 LiteLLM 的 CI/CD 拉取了被污染的 Trivy 构建,这个后门从 runner 内存里抓取并外传了一个 PYPI_PUBLISH token。攻击者用这个 token 直接发布了恶意的 LiteLLM release。披露者是 Forcepoint X-Labs 的 Prashant Kumar。

两个版本的 payload 行为不一样。1.82.7 在 proxy_server.py 里用 Base64 编码的 payload,在 proxy 启动时执行 —— 谁去 diff 一下文件就比较容易发现。1.82.8 更隐蔽:它在 site-packages 里放了一个 litelllm_init.pth 文件,「在每一个后续的 Python 解释器启动时激活,不管 LiteLLM 有没有被显式 import 过」。这是关键升级 —— 一旦装上,在那个环境里任何 Python 解释器一开,后门就会跑,不一定要用到 LiteLLM。被针对的凭据:OpenAI、Anthropic、Microsoft Azure 的 API key;AWS、Google Cloud、Azure SDK 的凭据;以及用户家目录里的 kubeconfig 和 AWS credential 文件。外传走的是 AES-256-CBC 加密,32 字节 session key,通过 curl 发到 models.litellm.cloud。一个叫 Sysmon.py 的持久化模块每 50 分钟向 checkmarx.zone 轮询新指令。

架构层面的教训是「信任链劫持」。TeamPCP 没去攻击防得很严的 LiteLLM 仓库;他们攻击的是 Trivy —— LiteLLM 构建流程默认信任的东西。这跟 xz-utils(那场差点搞掉 systemd 的 maintainer 冒充)和今年早些时候的 npm tj-actions 攻击是同一类供应链攻击。你构建流程里的任何工具 —— 扫描器、formatter、依赖解析器、linter —— 都是一个潜在的攻击面,哪怕它的本职工作就是安全。LiteLLM 这次的被搞特别严重,因为 LiteLLM 的整个 value proposition 就是「每一个主流 LLM 提供方的统一 gateway」。Prashant Kumar 的原话:「LiteLLM 作为主流 AI 提供方的统一 gateway,意味着一次被搞,攻击者就同时拿到 OpenAI、Anthropic 和 Azure 的凭据。」如果你装过 1.82.7 或 1.82.8,那个环境碰过的每一个 provider 凭据,都可能已经在 TeamPCP 手里。

周一上手:如果你有任何环境跑过 LiteLLM 1.82.7 或 1.82.8,把那个环境碰过的每一个 API key 都当作已经被泄露 —— 立刻轮换 OpenAI、Anthropic、Azure、AWS、GCP 的 key,审计用量日志看有没有陌生请求。检查 site-packages 里有没有 litelllm_init.pth 文件,以及 Sysmon.py 持久化模块。在网络层屏蔽到 models.litellm.cloud 和 checkmarx.zone 的出站,直到你把 host 清干净。从此往后构建流水线上:把 Trivy 和其它每一个构建工具的依赖pin 到已验证的 hash(不只是版本),对安全相邻类的 tooling 要求签名 release,隔离 PyPI publish token 让构建期的扫描器拿不到。Forcepoint 的 writeup 没披露确切时间线、下载次数、或者 BerriAI 的回应 —— 这些空白让人没法精确估暴露面。在 BerriAI 出一份协调披露之前,按最坏情况处理。