文章总结: 本报告详述了litellm1.82.7版本的PyPI供应链投毒事件。攻击者上传含三层混淆后门的伪造包,后门藏于proxy_server.py,可窃取SSH密钥、云凭证等敏感信息并经RSA+AES混合加密外发至伪装域名models.litellm.cloud。该版本为短时投毒,因项目未导入相关模块且外发域名无解析,后门未触发。根本原因是requirements.txt使用宽松版本约束>=,建议锁定精确版本、启用hash校验、集成pip-audit至CI/CD并限制出站网络。报告提供了完整IOC清单和排查修复步骤。 综合评分: 86 文章分类: 供应链安全,应急响应,漏洞分析,恶意软件,安全大事件
安全事件报告:litellm 供应链投毒事件(完整版)
面粉 面粉
Kn19ht杂谈随记
2026年3月27日 07:15 北京
🚨 安全事件报告
litellm 供应链投毒事件
| | | | — | — | | 事件编号 | SEC-2026-0324-001 | | 事件等级 | 严重(Critical) | | 事件类型 | 供应链攻击 / PyPI 包投毒 | | 投毒时间 | 2026-03-24 10:39 UTC | | 感染时间 | 2026-03-24 10:47 UTC | | 修复时间 | 2026-03-25 12:30 CST | | 当前状态 | ✅ 已修复 |
◆ 事件概述
2026-03-25 在安全排查时发现环境安装的 litellm 1.82.7 为伪造版本,内含三层混淆后门代码。
⚠️ 该版本在 PyPI 官方仓库中不存在(已被删除),属于典型的 PyPI 短时投毒攻击(upload-and-yank)。
后门位置:litellm/proxy/proxy_server.py
后门功能:收集主机敏感凭证(SSH密钥、云平台凭证、环境变量等),使用 RSA+AES 混合加密后外发至攻击者服务器。
◆ 影响范围与评估
受感染环境
| 环境路径 | 感染版本 | 修复版本 | | — | — | — | | /code/code_audit/venv/ | 1.82.7 | 1.82.6 | | /opt/code-audit/code_audit/venv/ | 1.82.7 | 1.82.6 |
后门触发评估
✅ 项目代码未导入 litellm.proxy — 仅使用 litellm.acompletion() API ✅ litellm proxy 进程从未运行 ✅ 无 systemd/crontab 注册 ✅ 外发域名 models.litellm.cloud 无 DNS 解析记录 ✅ /tmp 中无残留文件 ✅ /var/log 中无网络痕迹
✅ 结论:后门未被触发
后门代码仅在 import litellm.proxy.proxy_server 时执行,而本项目从未导入该模块。
◆ 攻击链分析
攻击时间线
10:39 UTC 攻击者上传伪造版本至 PyPI 10:47 UTC 本环境安装该版本(~8分钟后) ?? UTC PyPI 删除/撤回 1.82.7 版本 xx CST 安全排查发现后门 12:30 CST 完成修复
攻击入口
项目 requirements.txt 中使用宽松版本约束:
litellm>=1.40.0
当攻击者上传 1.82.7(高于当时最新的 1.82.6)时,pip 自动安装被投毒版本。
投毒来源验证
HTTP 响应头证实下载来源为 PyPI 官方渠道:AmazonS3 + Fastly CDN,x-pypi-file-version: 1.82.7
◆ 后门技术分析
三层混淆结构
第1层 (proxy_server.py) ├─ import subprocess, base64… ├─ 解码大段 base64_payload └─ 写入临时文件 → subprocess 执行
第2层 (解码后的Python脚本) ├─ RSA-4096 公钥 ├─ 解码第3层 base64 ├─ AES-256-CBC 加密收集结果 └─ RSA 加密 session key → tar 打包
第3层 (信息窃取脚本) └─ 执行全量敏感信息收集
窃取目标清单
| 类别 | 具体目标 | | — | — | | 环境变量 | os.environ 全量导出 | | SSH密钥 | ~/.ssh/* | | AWS凭证 | ~/.aws/credentials | | GCP凭证 | ~/.config/gcloud/ | | K8s | ~/.kube/config | | Docker | ~/.docker/config.json | | 应用密钥 | .env / .env.local / .env.production | | 系统密码 | /etc/shadow |
数据外发机制
收集数据 → AES-256-CBC → RSA-4096加密session key → tar打包 → POST https://models.litellm.cloud/
外发域名:models.litellm.cloud(伪装为litellm官方域名)
◆ 排查过程
阶段一:包完整性验证 — RECORD校验,1707个文件完整但内容有毒 阶段二:代码模式扫描 — 发现subprocess+base64组合(proxy_server.py后门点) 阶段三:遥测审计 — 确认无自动回调发送敏感数据 阶段四:安装钩子检查 — 无非正常post_install或cmdclass 阶段五:来源追溯 — 确认PyPI官方渠道,wheel ETag已记录 阶段六:Proxy痕迹排查 — 确认项目从未导入litellm.proxy
◆ 修复措施
已完成
✅ 卸载所有环境中的 litellm 1.82.7 ✅ 安装官方 litellm 1.82.6(SHA256已验证) ✅ 锁定 requirements.txt 版本为 litellm==1.82.6 ✅ 清除 pip 缓存中的恶意 wheel
建议后续措施
| 优先级 | 措施 | | — | — | | 高 | 向PyPI安全团队报告 ([email protected]) | | 高 | 若曾运行litellm proxy,立即轮换所有凭证 | | 中 | 启用hash校验:pip install –require-hashes | | 中 | 部署依赖监控:pip-audit / safety |
◆ 经验教训
根本原因:requirements.txt中使用>=宽松版本约束,攻击者可通过发布更高版本号劫持依赖安装。
防御建议:
- 锁定依赖版本:使用 == 精确版本或生成 requirements.lock
- 启用hash校验:pip install –require-hashes
- 定期审计依赖:集成 pip-audit、safety 到 CI/CD
- 最小权限原则:限制 CI/CD 和生产环境出站网络
- 监控异常版本:对关键依赖设置版本发布通知
◆ IOC(入侵指标)
| 类型 | 值 | | — | — | | 恶意包 | litellm==1.82.7 (PyPI, 已删除) | | 外发域名 | models.litellm.cloud | | 外发文件名 | tpcp.tar.gz | | 加密方式 | AES-256-CBC + RSA-4096 | | wheel ETag | 87ebdaa5ff65d864eb6833b15b2b931f-2 |
报告生成时间:2026-03-25
排查工具:Claude Code 自动化安全审计
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:Kn19ht杂谈随记 面粉 面粉《安全事件报告:litellm 供应链投毒事件(完整版)》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。








评论