2026年6月19日 2 分钟阅读

AI 模型供应链安全完全指南:Model Due Diligence 静态审查实战

tinyash 0 条评论

从 Hugging Face 下载一个 GGUF 模型,导入 Ollama 或 llama.cpp 跑起来——这个过程如今已经简单到一条命令。但这条命令背后隐藏着一个正在快速增长的攻击面:AI 模型供应链安全。

2026 年 6 月 Miasma 蠕虫事件已经清楚表明,恶意 AI 模型文件可以绕过传统安全扫描,在开发者毫不知情的情况下执行恶意代码。更麻烦的是,大多数安全团队的工具栈(SAST、DAST、SCA)完全不知道如何处理 .gguf.safetensors.pth 这些 AI 模型格式。

Model Due Diligence(mdd,Apache 2.0)正是为解决这个问题而生的开源工具:在模型被加载到任何运行时之前,对本地模型文件做一次完整的静态供应链审查,生成可追溯的审计报告。

核心问题:传统安全工具看不见 AI 模型

传统的软件供应链安全(SCA)工具扫描的是 package.jsonrequirements.txtpom.xml 这些依赖清单。但当开发者从 Hugging Face 下载一个 4GB 的 GGUF 模型时:

  • 这个文件里混入了 pickle 序列化的恶意载荷吗?
  • 有隐藏的 eval()exec() 调用吗?
  • Git 历史是否可疑?有没有失窃的 API 密钥嵌入其中?
  • 模型的元数据被篡改过吗?

这些问题没有一个能被 pip auditnpm audit 回答。模型文件本身就是新的攻击载体,而 AI 运行时的安全工具覆盖远远落后于威胁演进速度。

什么是 Model Due Diligence?

model-due-diligence 是一个 Python CLI 静态分析工具,专为 AI 模型供应链审查设计。它的核心设计哲学有两条:

  1. 静态优先:绝不加载模型权重、不执行模型代码、不做推理——只分析文件本身
  2. 证据导向:不自动判断「安全」或「不安全」,而是生成可人工审查的审计报告

安装也非常简单:

pip install model-due-diligence

如果需要完整的外部扫描器集成:

pip install "model-due-diligence[scanners,semgrep]"

或者带本地仪表盘:

pip install "model-due-diligence[ui]"
mdd-ui
open http://127.0.0.1:8765/

四层静态扫描架构

mdd 的扫描引擎分四层,每层覆盖不同的攻击面:

1. 文件清单与哈希层

扫描从枚举目标路径的全部文件开始:计算每个文件的 SHA-256、记录权限和符号链接、识别模型文件的格式类型(GGUF、safetensors、pickle 等)。这是所有后续分析的基础。

mdd ~/models/qwen3-8b-q4_k_m.gguf --out ./audit-qwen

2. 原生静态扫描层

内置扫描器直接检查以下内容:

检查项检测内容
高风险序列化pickle、.pt.pth.bin.joblib、H5
Python ASTevalexeccompilepickle.loadsos.system
可疑字符串二进制中的恶意操作码、混淆代码
高熵检测非模型文件中的加密/编码数据
Git 溯源remote origin、commit hash、dirty worktree、LFS
GGUF 元数据magic bytes、版本、架构标识
密钥泄露内置启发式 + detect-secrets

3. 外部扫描器适配层

可选的第三方集成覆盖更广泛的攻击面:

  • ModelScan:针对 ML 模型的专用安全扫描
  • Semgrep:自定义代码模式匹配
  • Bandit:Python 安全静态分析
  • pip-audit:Python 依赖漏洞检查
  • detect-secrets:密钥/凭证泄露检测

使用 --skip-external 可以跳过这一层,适合快速把关:

mdd ./downloaded-model --out ./audit --skip-external --fail-on critical

4. 风险评分与报告

所有发现被统一归一化为 INFO/LOW/MEDIUM/HIGH/CRITICAL 五个等级,生成 0-100 的风险分:

mdd ./downloaded-model --out ./audit
风险等级分数范围建议操作
LOW0-29可在沙箱中首次运行
MEDIUM30-69理解所有发现后再导入
HIGH70-89除非每个发现都被确认无害,否则不要加载
CRITICAL90-100默认视为不安全

报告生成三种格式:Markdown(人类可读)、JSON(自动化处理)、SARIF(集成到 CI/CD 代码扫描)。

三种使用场景

场景 1:审计 Hugging Face 克隆的模型

git clone https://huggingface.co/Qwen/Qwen3-8B-GGUF /tmp/qwen3
mdd /tmp/qwen3 --out ./audit-qwen3 --fail-on high

--fail-on high 让命令在风险等级达到 HIGH 时返回非零退出码,适合 CI 流水线。

场景 2:审计已安装的 Ollama 模型

mdd-ollama qwen3:4b --out ./audit-qwen3-ollama

mdd-ollama 自动从 Ollama 的本地模型存储中定位模型文件并执行审查,不需要 Ollama 服务器在线。

场景 3:CI/CD 中的安全门禁

GitHub Actions 中的保守配置:

- name: Scan downloaded model
  run: |
    pip install model-due-diligence
    mdd ./model-cache/ --out ./audit --fail-on critical --skip-external

全量配置(含外部扫描器):

- name: Full model audit
  run: |
    pip install "model-due-diligence[scanners,semgrep]"
    mdd ./model-cache/ --out ./audit --fail-on high

产出的审计报告

一次完整扫描输出的目录结构:

audit/
├── model_due_diligence_report.md   # 人工审查报告
├── model_due_diligence_report.json # 机器可读报告
├── model_due_diligence_report.sarif # SARIF 格式
├── modelscan.json
├── semgrep.json
├── bandit.json
└── detect-secrets.json

每个发现包含:严重等级、分类、文件名、上下文证据片段和修复建议。

与同类工具的区别

mdd 在设计上不是「模型安全验证器」——它不声称能检测权重中的后门、触发型 sleeper agent 或训练数据投毒。它所做的事情更务实:在模型实际进入你的运行环境之前,收集所有可静态检查的证据,让你在知情的前提下做决策

适用人群

  • 使用 Ollama/llama.cpp/LM Studio 的本地模型用户
  • 在工作中集成 Hugging Face 模型的 AI 工程师
  • 需要在 CI 流水线中加入模型审查的安全团队
  • 即将把 Agent 系统接入外部模型的企业开发者

在实践中,mdd 不适合作为生产部署的唯一审批机制——它是整个供应链安全流水线中的一个重要节点。官方推荐的操作模型是:

官方源 + 固定 commit + 静态审查 + 沙箱首次运行 + 运行时监控 + 人工审查
= 合理可行的风险降低

注意事项

  • mdd v0.2.0 当前仍是 Alpha 阶段,不应对其有过高的可靠性预期
  • 报告可能包含本地路径和摘要信息,不应直接提交到公共仓库
  • 外部扫描器需要各自独立安装,使用 [scanners] extras 可以一次性安装
  • 仪表盘 mdd-ui 是单进程 FastAPI 应用,并非生产级部署方案

总结

AI 模型的供应链安全是一个未被充分覆盖的领域。传统的 SCA 工具看不见 .gguf.safetensors,而 model-due-diligence 填补了这个空白。它不做运行时分析、不加载模型、不执行代码——只做一件事:让每一次模型导入都留下可审查的静态证据。在 Miasma 蠕虫事件之后,这种能力已经从「锦上添花」变成了「基本防线」。

Model Due Diligence 的开源仓库:https://github.com/mmccalla/model-due-diligence

PyPI 包:https://pypi.org/project/model-due-diligence/

发表评论

你的邮箱地址不会被公开,带 * 的为必填项。