Litellm再次被投毒,恶意代码窃取大量敏感信息
墨菲安全实验室
墨菲安全实验室
墨菲安全实验室
2026年10月22日 01:06
北京
去阅读
一、事件概述
1
事件简述
2026年10月21日,墨菲安全实验室检测到开源AI网关组件Litellm发生第二次供应链投毒事件。恶意版本 1.107.0 被上传至PyPI、Dockerhub,安装后植入持久化恶意载荷,窃取本机各类密钥、AI服务商API凭证、云账号凭据,加密后外传至攻击者控制的C2域名www.litellm.dev。
历史攻击:2026-03-24 litellm 曾遭遇同类投毒(1.82.7/1.82.8),攻击手法一致,均利用 .pth 实现 Python 解释器启动即执行恶意代码。
2
关键基础信息
| 项目 | 内容 |
| 受影响包 | litellm(PyPI) |
| 恶意版本 | 1.107.0(全部wheel包) |
| 安全版本 | 1.106.2 |
| 恶意载体 | cook.pth、cook.py、sitecustomize.py |
| C2外传域名 | www.litellm.dev(非官方域名,官方域为litellm.ai) |
| 持久化方式 | Python .pth机制,卸载包不会自动清除恶意文件 |
| 泄露数据类型 | LLM服务商API Key、SSH密钥、云凭据、数据库URL、Docker配置、环境变量密钥、GitHub配置、本地各类token |
| 加密方式 | AES‑256‑CBC + RSA‑OAEP加密窃取数据外传 |
| 投毒者基础设施 | GitHub账号:letters9813; 仓库:pythonclient‑test(domain.txt作为动态C2配置文件) |
二、攻击技术链路分析
攻击前置:制品伪造与二次封包。
攻击者基于该版本官方源码基线,抢先伪造出并不存在的正式版本号 1.107.0;在正常的 maturin 构建完成 wheel 之后,对包进行二次注入并重新封包:
-
向 wheel 的 litellm-1.107.0.data/purelib/ 目录植入三件恶意文件 cook.pth、cook.py、sitecustomize.py;
-
篡改 wheel 内的 RECORD 清单,不登记新增的恶意文件,同时破坏全部条目的哈希校验,使包完整性校验失效,为后续“卸载后恶意文件无法清除”埋下伏笔;
-
同步污染多组官方 Docker 镜像,覆盖浮动标签 latest / main-latest / main-stable 与固定标签 v1.107.0,未锁定 Digest 的部署会在镜像重建、调度时自动拉取被污染的镜像。
1
阶段1:安装落盘,植入持久化触发载体
受害者执行 pip install litellm==1.107.0 或拉取对应被污染的 Docker 镜像后,恶意文件便会直接写入 Python 环境的 site-packages 目录。
该攻击不依赖 setup.py 安装钩子,而是依托 Python 原生的两个自动加载通道实现冗余部署:
通道A:cook.pth,内容仅一行 import cook;Python 解释器启动时,site.py 会自动扫描并解析 .pth 文件,识别 import 语句后立即执行;
通道B:sitecustomize.py,Python 的 site 模块在解释器启动时默认自动加载该文件,作为备用触发入口。
关键风险:恶意文件不在 RECORD 清单内,pip uninstall litellm 不会将其删除;触发逻辑与业务是否导入、是否运行 litellm 代码完全解耦,任意 Python 进程(pip、业务服务、定时任务、CI 任务)启动时均可触发载荷。
2
阶段2:载荷自解压,释放主窃取器框架
载荷采用双层混淆封装:
- 外层装载器(cook.py / sitecustomize.py,混淆后约 22KB)的核心执行逻辑仅一行:exec(zlib.decompress(base64.b64decode(xxx))),无外联、无反分析代码,仅负责解码;
- 解码后释放内层主窃取器(61KB,基于 Python 标准库与 cryptography 实现),读取内置的硬编码配置:C2 地址 http://www.litellm.dev/healthcheck、批次标识 PC\_TOKEN、RSA-4096 公钥 PC\_PUBKEY;
- 根据内置模块列表 PC\_MODULES,启动多维度敏感信息采集。
3
阶段3:多维度敏感资产采集
窃取器共启用 16 个采集模块,分为通用信息采集与定向专项采集两类:
通用采集:系统信息、网络信息、浏览器存储的账号密码、浏览器历史、Shell 历史、SSH 私钥、GPG 密钥、TLS 私钥、环境变量、容器凭据、CI/CD 密钥,并访问 169.254.169.254 IMDS 拉取云实例临时角色凭证;其中浏览器密码模块采用双重兜底,优先使用 cryptography 解密,失败后自动调用 openssl 子进程解密,提升兼容成功率;
定向专项采集:db\_litellm 模块,专门读取 litellm 代理数据库,批量导出租户配置下的全部 LLM 服务商 API 密钥,是本次攻击的核心目标。
4
阶段4:数据加密上传
载荷通过以下步骤将数据上传:
-
将全部采集结果打包为 tar 包;
-
使用内置 RSA-4096 公钥加密数据包;
-
构造 HTTP POST 请求,上报至 http://www.litellm.dev/healthcheck;
-
C2 服务特征:仅允许 POST 方法,GET/HEAD 请求返回 405,该服务专门用于接收窃取数据。
5
阶段5:驻留持续威胁
载荷无 TTL、无自清理逻辑,只要三件恶意文件仍保留在 site-packages 中,每次 Python 进程启动都会重复执行全套采集与外传流程;即使受害者后续升级或卸载 litellm 包,残留文件依旧持续生效。
三、受影响范围评估
直接受影响:环境中执行过 pip install litellm==1.107.0;拉取过 Digest 匹配的 litellm/litellm v1.107.0 Docker 镜像;
间接风险:项目将 litellm 作为间接依赖,构建/CI 环境触发安装;波及开发者本地开发环境、容器、K8s Pod、CI 流水线;
业务危害:litellm 作为 AI 网关,其运行环境通常存放大量大模型服务商密钥;一旦沦陷,攻击者可直接调用付费 AI 接口、接管云资源、访问业务数据库。
⚠️ 风险提示:即便已经卸载该包,残留的 .pth 文件依旧会持续执行恶意代码。
四、应急处置方案
1
排查步骤
- 检查 pip 历史记录、requirements 与 lock 文件,确认是否引入版本 1.107.0;
- 扫描所有 Python 环境的 site-packages 目录,查找:cook.pth、cook.py、sitecustomize.py(非业务自带的陌生文件);
- 检查主机是否存在锁文件 /tmp/remote\_code\_loader.lock,若存在,说明主机曾触发过恶意载荷;
- 检查 Docker 镜像历史,确认是否拉取过被污染的 v1.107.0 镜像。
2
清除操作
- 卸载恶意版本:pip uninstall litellm;
-
手动删除上述 3 个恶意文件及其对应\\_pycache\\_缓存目录;
-
终止持有 /tmp/remote\_code\_loader.lock 的相关进程;
- 升级至安全版本:litellm==1.106.2。
3
密钥轮换
只要确认环境运行过恶意版本,必须立即全部轮换以下密钥:
OpenAI、Anthropic 等全部 LLM 服务商 API Key;
AWS/Azure/GCP 云账号密钥、IAM 临时凭证;
SSH 私钥、数据库连接密码、DATABASE\_URL;
GitHub/Gitlab 个人 token、CI 流水线密钥;
Docker Registry 凭证、各类业务系统 token。
4
网络层面处置
在边界防火墙/安全组阻断对域名 www.litellm.dev 的出站访问。
持续监控 IOC:letters9813/pythonclient-test 仓库的变化,该仓库可动态更新 C2 地址。
五、安全启示与防御建议
-
重视二进制投毒风险:开源仓库源码干净 ≠ 发布包安全,攻击者可直接篡改 wheel 包而无需改动 Git 仓库;
-
警惕 .pth 机制风险:PyPI 包写入 .pth 文件可实现无导入自动执行,卸载包无法清理残留,是供应链攻击的高频利用点。
六、IOC清单
1
文件IOC
cook.pth;
cook.py;
sitecustomize.py;
/tmp/remote\_code\_loader.lock;
2
网络IOC
www.litellm.dev
七、墨菲安全产品与能力支撑
墨菲安全针对投毒的感知-检测-阻断提供体系化的治理解决方案,已第一时间提供对应感知和识别能力。
客户可通过投毒情报预警服务快速感知当前正在发生的投毒风险,基于私有源安全网关对内部制品库中的投毒组件进行阻断,基于软件成分分析工具可对项目中引入的投毒组件进行识别检测。
墨菲安全部分典型客户
墨菲安全七大产品矩阵
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。








评论