AI 模型供应链安全完全指南:Model Due Diligence 静态审查实战
从 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.json、requirements.txt、pom.xml 这些依赖清单。但当开发者从 Hugging Face 下载一个 4GB 的 GGUF 模型时:
- 这个文件里混入了 pickle 序列化的恶意载荷吗?
- 有隐藏的
eval()或exec()调用吗? - Git 历史是否可疑?有没有失窃的 API 密钥嵌入其中?
- 模型的元数据被篡改过吗?
这些问题没有一个能被 pip audit 或 npm audit 回答。模型文件本身就是新的攻击载体,而 AI 运行时的安全工具覆盖远远落后于威胁演进速度。
什么是 Model Due Diligence?
model-due-diligence 是一个 Python CLI 静态分析工具,专为 AI 模型供应链审查设计。它的核心设计哲学有两条:
- 静态优先:绝不加载模型权重、不执行模型代码、不做推理——只分析文件本身
- 证据导向:不自动判断「安全」或「不安全」,而是生成可人工审查的审计报告
安装也非常简单:
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 AST | eval、exec、compile、pickle.loads、os.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
| 风险等级 | 分数范围 | 建议操作 |
|---|---|---|
| LOW | 0-29 | 可在沙箱中首次运行 |
| MEDIUM | 30-69 | 理解所有发现后再导入 |
| HIGH | 70-89 | 除非每个发现都被确认无害,否则不要加载 |
| CRITICAL | 90-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 + 静态审查 + 沙箱首次运行 + 运行时监控 + 人工审查 = 合理可行的风险降低
注意事项
mddv0.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/