litellm投毒之pth的有趣利用到钓鱼和免杀加载器的思考
字数 2539
更新时间 2026-07-12 00:23:58

Python .pth 文件投毒与利用技术详解

一、背景:LiteLLM 投毒事件回顾

2026年3月,知名AI网关工具LiteLLM遭受供应链投毒攻击。攻击流程如下:

  1. 攻击者入侵了LiteLLM CI/CD流水线中依赖的容器漏洞扫描器Trivy
  2. 利用Trivy在流水线中执行恶意操作
  3. 将一个名为 litellm_init.pth 的文件打包到whl文件中
  4. 当用户通过 pip install 安装LiteLLM 1.82.7和1.82.8版本时,该文件自动释放到 site-packages/ 目录下
  5. 此后,任何Python进程启动时都会自动执行该.pth文件中的恶意代码
  6. 即使未加载LiteLLM库,甚至仅执行 python 进入CLI界面,同样会触发

这一攻击手法展示了.pth文件作为Python官方运行机制的隐蔽利用价值。


二、Python .pth 文件加载机制深度分析

2.1 核心执行链路

Python每次启动时,解释器会自动执行 site.py 中的初始化逻辑。关键函数调用链如下:

Python启动 → site.main() → addsitedir() → addpackage()

2.2 addpackage() 函数处理逻辑

addpackage() 函数负责处理 site-packages/ 目录下的 .pth 文件,具体规则:

  1. 读取.pth文件的全部内容
  2. 逐行遍历每一行文本
  3. 过滤规则:
    • 忽略空行
    • 忽略以 # 开头的行(注释)
    • 忽略不符合格式的其他行
  4. 仅对以 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() 函数的作用是:

  1. 接收一个文件夹路径作为参数
  2. 遍历该路径下的所有文件
  3. 查找以 .pth 结尾的文件
  4. 对每个找到的.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 实施步骤

  1. 创建超大体积的恶意.pth文件

    • 文件主体填充大量无意义文本(如小说、随机数据),使文件达到几百MB
    • 在文件中间某处插入一行以 import 开头的恶意代码
  2. 上传至模型托管平台

    • Hugging Face、魔搭(ModelScope)等平台
    • 声称这是一个训练好的AI模型(如情感陪伴、图像生成等)
  3. 编写看似正常的启动脚本

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 技术优势

  1. 利用官方标准库site.addsitedir() 是Python官方提供的合法接口
  2. 低熵特征:恶意代码隐藏在数百MB的填充文本中,文件整体熵值极低
  3. 静态检测困难:杀软难以从几百MB的文本文件中定位那一行恶意代码
  4. 动态检测盲区:标准库API调用通常不在杀软监控范围内

4.3.2 加载器工作流程

启动程序 → 调用site.addsitedir() → 扫描目标目录 → 发现.pth文件 → 执行恶意代码
         ↓
    正常业务逻辑(伪装)

五、防御措施与检测建议

5.1 开发者防护

  1. 审计第三方依赖:安装前检查site-packages目录下是否有异常.pth文件
  2. 监控site.addsitedir()调用:在代码审计时关注此类非标准用法
  3. 限制文件后缀信任:不要仅凭.pth后缀判断文件类型,检查文件头部Magic Number

5.2 安全产品检测

  1. 增加.pth文件扫描规则:不仅扫描site-packages,还应监控addsitedir()的动态调用
  2. 检测超大文本文件:对体积异常的.pth文件进行深度分析
  3. 行为监控:监控Python进程对site.addsitedir()的异常调用

5.3 平台防护

  1. 模型托管平台:对上传的.pth文件进行内容分析,而非仅检查文件头
  2. CI/CD流水线:加固流水线安全,防止攻击者注入恶意.pth文件

六、总结

本文从LiteLLM投毒事件出发,深入分析了Python .pth文件的加载机制,揭示了三个关键技术点:

  1. .pth文件自动执行机制:Python启动时通过site.py自动加载site-packages下的.pth文件
  2. addsitedir()突破限制:通过调用site.addsitedir(),可在任意目录触发.pth执行
  3. 后缀混淆投毒:利用AI模型权重文件与Python配置文件同后缀的特点,实现隐蔽投毒

这三种技术的组合应用,既能用于供应链投毒攻击,也能作为新型恶意代码加载器,具有极高的隐蔽性和绕过能力。安全从业者应充分了解此类手法,并将其纳入防御体系。

相似文章
相似文章
 全屏