LiteLLM 被植入后门:当被污染的 CI 扫描器接管 LLM 网关
2026 年 3 月,攻击者通过攻陷 LiteLLM CI 流水线中的 Trivy,窃取其 PyPI 发布令牌,随后发布了两个带后门的版本。这条攻击链揭示了 LLM 网关为何是高价值的供应链目标。
发生了什么
2026 年 3 月 24 日,一个被追踪为 TeamPCP 的威胁行为者向 PyPI 发布了 Python 软件包 litellm 的两个恶意版本——1.82.7 和 1.82.8。LiteLLM 是位于 CrewAI、DSPy、MLflow、OpenHands 以及数十个其他智能体框架底层的模型网关库,每天被下载数百万次。根据 Snyk 的分析 和 Help Net Security,这些软件包在被 PyPI 隔离前上线了约 三个小时。
攻击者从未利用 LiteLLM 自身代码中的漏洞。他们先攻陷了在 LiteLLM CI 流水线中运行的开源扫描器 Trivy,从而获取了该项目的 PYPI_PUBLISH 令牌。这是工具链攻击的典型案例:污染一个受信任的构建依赖,窃取它能读取的密钥,然后发布一个被合法签名的恶意版本。
攻击原理
整条攻击链历时五天,每一跳都复用了相同的外泄基础设施(一个共享 RSA 密钥和一个 tpcp.tar.gz 归档文件名,已由 Wiz 和 Unit 42 在各次行动中确认):
- 3 月 19 日 —— 在通过
pull_request_target(“Pwn Request”)工作流窃取了 Aqua 的自动化凭证后,TeamPCP 改写了trivy-action仓库中的 Git 标签,使某个版本标签指向恶意版本。该工作流会检出并执行不受信任的 fork 代码。 - 3 月 23 日 —— 同样的套路命中了 Checkmarx KICS;攻击者注册了 C2 域名
checkmarx.zone和外泄域名models.litellm.cloud。 - 3 月 24 日 —— LiteLLM 的 CI 从
apt运行了被污染的 Trivy,且未固定版本。被攻陷的 action 从 runner 环境中读取了PYPI_PUBLISH令牌,攻击者用它发布了那两个带后门的版本。
载荷本身是一个三阶段凭证窃取程序:收集密钥(SSH 私钥、.env 文件、云和 Kubernetes 凭证、钱包助记词),加密后以 POST 方式发送至外泄域名,然后安装一个 systemd 用户服务实现持久化,并尝试在 Kubernetes 命名空间之间横向移动。1.82.8 版本通过 .pth 启动钩子强化了投递——这是放在 site-packages/ 中的一个文件,会在每次 Python 解释器启动时执行,包括 pip install 本身,无需任何 import。由于该软件包是用合法但被盗的凭证签名的,它顺利通过了 pip 的哈希校验。我们刻意省略载荷的内部细节;下文的防御要点并不需要它们。
一个值得注意的细节:本次行动的部分目标选择由一个自主攻击机器人驱动。StepSecurity 记录了 hackerbot-claw——一个 GitHub 账户,自称为”自主安全研究智能体”,在十天的窗口内扫描仓库并针对 Microsoft、DataDog 和 CNCF 的项目提交利用性 pull request——这是已观测到的最早一批由 AI 智能体在实战中驱动供应链入侵的案例之一。
为何重要
LLM 网关正在成为 AI 技术栈中最集中的密钥存储点。像 LiteLLM 这样的路由器,在设计上被托付了它所代理的每一个模型供应商的 API 密钥,外加运行它的主机环境。攻陷这一个位置,就能拦截整个集群的密钥,而无需攻破任何上游供应商——这正是 TeamPCP 所追求的杠杆。Help Net Security 和 Unit 42 都指出了更宏观的规律:该行动有意瞄准安全工具(Trivy、Checkmarx),因为扫描器对其运行所在的流水线拥有广泛的读取权限。你的防御工具本身就是攻击面的一部分。
防御措施
- 按摘要而非标签固定每一个 CI 依赖。 Git 标签是可变的;将 GitHub Actions 和命令行工具固定到 commit SHA 或内容哈希,使被改写的标签无法悄悄替换为恶意版本。
- 锁死
pull_request_target。 切勿在特权工作流中检出并执行不受信任的 fork 代码。对 fork 的 CI 使用pull_request,让特权作业需经人工批准,并将GITHUB_TOKEN限定为只读。 - 约束发布凭证。 相比长期有效的
PYPI_PUBLISH令牌,优先使用基于 OIDC、短期有效的 PyPI Trusted Publishing,并将发布步骤与运行第三方工具的步骤隔离。 - 监控构建时的网络出站流量。 对 runner 的出站目的地设置白名单,使指向未知域名的意外
curl被阻断并告警,而非被静默执行。 - 检测
.pth启动钩子。 仅靠哈希校验无法识别一个被恶意发布但签名有效的软件包。对任何安装了包含exec、subprocess或base64的.pth文件的依赖发出告警。 - 如果你运行过 1.82.7 或 1.82.8: 将主机视为已被攻陷,固定到
<=1.82.6(或之后的干净版本),轮换所有可触及的凭证,并排查持久化服务以及名为node-setup-*的 Kubernetes pod。
状态
| 项目 | 状态 |
|---|---|
受影响的 litellm 版本 | 1.82.7、1.82.8 —— 已被隔离并从 PyPI 移除 |
| 安全版本 | ≤ 1.82.6,以及密钥轮换后(3 月 24 日)的干净版本 |
| 根因 | 通过 CI 中被污染的 Trivy 窃取 PYPI_PUBLISH 令牌 |
| 披露 | FutureSearch 于 2026 年 3 月 24 日发出警报;当天即轮换密钥 |
| 更大范围的行动 | TeamPCP 还命中了 Trivy(3 月 19 日)和 Checkmarx KICS(3 月 23 日) |
日期与技术细节引自 Snyk(2026 年 3 月 24 日)、Help Net Security(2026 年 3 月 25 日)、Palo Alto Unit 42 与 StepSecurity。版本号与基础设施指标反映上述厂商已发布的研究结论。