安全事件报告:litellm供应链投毒事件(完整版)

admin 2026-03-29 23:42:23 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本报告详述了litellm1.82.7版本的PyPI供应链投毒事件。攻击者上传含三层混淆后门的伪造包,后门藏于proxy_server.py,可窃取SSH密钥、云凭证等敏感信息并经RSA+AES混合加密外发至伪装域名models.litellm.cloud。该版本为短时投毒,因项目未导入相关模块且外发域名无解析,后门未触发。根本原因是requirements.txt使用宽松版本约束>=,建议锁定精确版本、启用hash校验、集成pip-audit至CI/CD并限制出站网络。报告提供了完整IOC清单和排查修复步骤。 综合评分: 86 文章分类: 供应链安全,应急响应,漏洞分析,恶意软件,安全大事件


cover_image

安全事件报告: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中使用>=宽松版本约束,攻击者可通过发布更高版本号劫持依赖安装。

防御建议:

  1. 锁定依赖版本:使用 == 精确版本或生成 requirements.lock
  2. 启用hash校验:pip install –require-hashes
  3. 定期审计依赖:集成 pip-audit、safety 到 CI/CD
  4. 最小权限原则:限制 CI/CD 和生产环境出站网络
  5. 监控异常版本:对关键依赖设置版本发布通知

◆ 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 供应链投毒事件(完整版)》

解密大模型中的Token 网络安全文章

解密大模型中的Token

文章总结: 文章阐述了大模型中Token的定义与核心作用,Token是文本离散化后的最小处理单位,通过Tokenizer完成分词与向量化。文章讲解了子词切分策略
评论:0   参与:  0