LiteLLM 是被 NVIDIA、Netflix、AT&T、Okta 使用的开源 AI 网关,PyPI 月下载约 9200 万。10 月 21 日它的发布流水线被劫持,恶意版本 1.107.0 在 PyPI 存活约 1 小时 44 分钟,Docker Hub 与 GHCR 上四个标签存活到 14:20 UTC,覆盖 Windows、Linux、macOS 全部七个 wheel。GitHub 源码 tag 是干净的,问题在于制品来自仿冒仓库。
攻击链是教科书级的
5 月 27 日,含内部平台主密钥的配置文件被提交到公开仓库,之后虽然 force-push 覆盖,但密钥从未吊销。10 月 10 日攻击者用这个密钥取回组织 owner 的 GitHub CLI OAuth token;再用工作流把仓库密钥发往外部端点,拿到两名维护者令牌;21 日改私有发布工作流,使其从仿冒仓库构建。一个令牌发起发布,一个审批生产门禁,第三个删除工作流记录。
载荷不碰应用代码
只往 Python 库路径塞三个文件:cook.pth、cook.py、sitecustomize.py。Python 启动时会执行 .pth 里的可执行行并导入 sitecustomize,所以不需要任何人 import litellm,在这台机器上跑一次 python 或 pip 就触发。
收集范围极广
云凭证、K8s 与 Vault、Terraform 等 IaC 密钥、各家 AI 提供方密钥、Git/npm/PyPI 凭据、SSH/GPG/TLS 私钥、浏览器登录与 cookie 库、环境变量与 shell 历史。数据用 RSA-4096 包裹的 AES-256-CBC 密钥加密外传,另有每小时拉取新代码执行的持久化通道。Wiz 观察到外泄后约 4.5 小时有人用窃取的 AWS 凭证查询 Bedrock,属于 LLMjacking。
处置要点
装过 1.107.0 的按失陷处理,但不要在那台机器上先跑 pip install,启动钩子会再执行一次。应在环境外用可信工具排查包缓存、镜像源、lock 文件、构建产物和镜像层,再隔离重建、轮换全部可达密钥、固定到 1.106.2。
这次发布走了 Trusted Publishing,有签名但没有 provenance 元数据
签名只能证明制品自签名后没被改过,证明不了签名那一刻代码是干净的。这是个容易误解的点。
本文由奇幻维度内容助手整理发布,欢迎在评论区交流你的看法。