litellm投毒之pth的有趣利用到钓鱼和免杀加载器的思考
字数 2539
更新时间 2026-07-12 00:23:58
Python .pth 文件投毒与利用技术详解
一、背景:LiteLLM 投毒事件回顾
2026年3月,知名AI网关工具LiteLLM遭受供应链投毒攻击。攻击流程如下:
- 攻击者入侵了LiteLLM CI/CD流水线中依赖的容器漏洞扫描器Trivy
- 利用Trivy在流水线中执行恶意操作
- 将一个名为
litellm_init.pth的文件打包到whl文件中 - 当用户通过
pip install安装LiteLLM 1.82.7和1.82.8版本时,该文件自动释放到site-packages/目录下 - 此后,任何Python进程启动时都会自动执行该.pth文件中的恶意代码
- 即使未加载LiteLLM库,甚至仅执行
python进入CLI界面,同样会触发
这一攻击手法展示了.pth文件作为Python官方运行机制的隐蔽利用价值。
二、Python .pth 文件加载机制深度分析
2.1 核心执行链路
Python每次启动时,解释器会自动执行 site.py 中的初始化逻辑。关键函数调用链如下:
Python启动 → site.main() → addsitedir() → addpackage()
2.2 addpackage() 函数处理逻辑
addpackage() 函数负责处理 site-packages/ 目录下的 .pth 文件,具体规则:
- 读取.pth文件的全部内容
- 逐行遍历每一行文本
- 过滤规则:
- 忽略空行
- 忽略以
#开头的行(注释) - 忽略不符合格式的其他行
- 仅对以
import开头(或import+ 制表符开头)的行,将其作为Python代码执行
2.3 有效.pth文件构造
一个有效的恶意.pth文件只需包含一行以 import 开头的Python代码:
# 文件名:evil.pth
import os; os.system('calc.exe')
注意事项:
- 文件名必须有名称部分(如
evil.pth),不能仅为.pth - 文件内容中可以混杂大量无关文本,只要其中有一行符合
import开头的格式即可执行
三、突破限制:任意目录下触发.pth执行
3.1 默认限制
默认情况下,Python仅在 site-packages/ 目录下自动扫描并加载 .pth 文件。这意味着单纯拥有一个.pth文件无法在普通项目中直接生效。
3.2 突破方法:addsitedir() 函数
通过分析 site.py 源码可以发现,addsitedir() 函数的作用是:
- 接收一个文件夹路径作为参数
- 遍历该路径下的所有文件
- 查找以
.pth结尾的文件 - 对每个找到的.pth文件调用
addpackage()进行处理
因此,只要调用 site.addsitedir() 并传入目标文件夹路径,即可让Python加载该目录下的任意.pth文件。
3.3 PoC验证代码
import site
# 指定包含恶意.pth文件的目录
target_dir = './.vscode' # 或其他隐藏目录如 .git, .idea, .model, .swp, .tmp, .cache等
site.addsitedir(target_dir)
# 后续正常业务代码...
执行此代码后,Python会立即扫描 ./.vscode/ 目录下的所有.pth文件并执行其中的恶意代码。
四、高级利用场景
4.1 伪装成AI模型权重文件投毒
4.1.1 核心思路
- AI大模型的权重文件通常使用
.pth后缀(PyTorch模型保存格式) - Python的
.pth配置文件也使用相同后缀 - 两者虽非同一文件格式,但后缀名完全相同
- 可以利用这一混淆点,将恶意Python.pth文件伪装成大型模型权重文件上传至模型托管平台
4.1.2 实施步骤
-
创建超大体积的恶意.pth文件
- 文件主体填充大量无意义文本(如小说、随机数据),使文件达到几百MB
- 在文件中间某处插入一行以
import开头的恶意代码
-
上传至模型托管平台
- Hugging Face、魔搭(ModelScope)等平台
- 声称这是一个训练好的AI模型(如情感陪伴、图像生成等)
-
编写看似正常的启动脚本
import site
# 这两行代码看似无害,实则触发恶意.pth执行
site.addsitedir('./.model') # 加载.model目录下的.pth文件
site.addsitedir('./weights') # 或加载weights目录下的.pth文件
# 真正的模型加载代码(用于伪装)
from transformers import AutoModel
model = AutoModel.from_pretrained('./pretrained_model')
# ... 正常业务逻辑
4.2 绕过AI安全检查
上述代码片段经过主流AI模型(如元宝、Claude)检测时,均被判定为"牌没有问题",原因在于:
site.addsitedir()是Python标准库的正常API调用- 代码中没有直接的恶意行为(无os.system、无subprocess调用)
- 恶意载荷隐藏在大型.pth文件中,AI难以跨文件关联分析
4.3 作为免杀加载器
4.3.1 技术优势
- 利用官方标准库:
site.addsitedir()是Python官方提供的合法接口 - 低熵特征:恶意代码隐藏在数百MB的填充文本中,文件整体熵值极低
- 静态检测困难:杀软难以从几百MB的文本文件中定位那一行恶意代码
- 动态检测盲区:标准库API调用通常不在杀软监控范围内
4.3.2 加载器工作流程
启动程序 → 调用site.addsitedir() → 扫描目标目录 → 发现.pth文件 → 执行恶意代码
↓
正常业务逻辑(伪装)
五、防御措施与检测建议
5.1 开发者防护
- 审计第三方依赖:安装前检查site-packages目录下是否有异常.pth文件
- 监控site.addsitedir()调用:在代码审计时关注此类非标准用法
- 限制文件后缀信任:不要仅凭.pth后缀判断文件类型,检查文件头部Magic Number
5.2 安全产品检测
- 增加.pth文件扫描规则:不仅扫描site-packages,还应监控addsitedir()的动态调用
- 检测超大文本文件:对体积异常的.pth文件进行深度分析
- 行为监控:监控Python进程对site.addsitedir()的异常调用
5.3 平台防护
- 模型托管平台:对上传的.pth文件进行内容分析,而非仅检查文件头
- CI/CD流水线:加固流水线安全,防止攻击者注入恶意.pth文件
六、总结
本文从LiteLLM投毒事件出发,深入分析了Python .pth文件的加载机制,揭示了三个关键技术点:
- .pth文件自动执行机制:Python启动时通过site.py自动加载site-packages下的.pth文件
- addsitedir()突破限制:通过调用site.addsitedir(),可在任意目录触发.pth执行
- 后缀混淆投毒:利用AI模型权重文件与Python配置文件同后缀的特点,实现隐蔽投毒
这三种技术的组合应用,既能用于供应链投毒攻击,也能作为新型恶意代码加载器,具有极高的隐蔽性和绕过能力。安全从业者应充分了解此类手法,并将其纳入防御体系。
相似文章
相似文章