如何用 mdd 做 AI 模型供应链安全审计:从下载到运行的完整检查清单
你下载的 AI 模型真的安全吗?
如果你从 Hugging Face、GitHub 或某个量化版本仓库下载了一个模型,然后直接塞进 Ollama 或 llama.cpp —— 你其实是在信任整个下载链上的每个人:模型作者、上传者、量化者、平台运维,以及他们使用的所有依赖库。
PyTorch 的 pickle 反序列化漏洞已经不是新闻:一个精心构造的 .pt 文件可以在你执行 torch.load() 的瞬间执行任意代码。2025 年的”恶性复活节彩蛋”事件(模型 checkpoints 内嵌 os.system 调用)更是让整个社区意识到:模型文件本身就是攻击面。而就在两天前(2026-06-12),席卷 AI 开发工具圈的 Miasma 供应链攻击进一步证明:开发者工具链上的每一个入口都可能被植入恶意代码。
好在有一个小众但极度扎实的开源工具可以填补这个空白——Model Due Diligence(简称 mdd)。
mdd 是什么?
mdd 是一个 Python CLI 工具,在导入或加载模型之前对本地模型文件和仓库做静态供应链审查。它的核心思想很简单:先扫描再信任。
- 安装:
pip install model-due-diligence - 命令:
mdd ./path/to/model --out ./audit - 许可证:Apache 2.0
- Python 版本:3.11+
它不执行模型推理,不加载权重,不导入仓库代码——所有检查都是纯静态的。
快速上手:扫一个模型看看
pip install model-due-diligence mdd ~/models/qwen3-8b-q4_k_m.gguf --out ./audit-qwen mdd ./downloaded-model --out ./audit-repo mdd ./downloaded-model --out ./audit-smoke --skip-external
扫描后会生成一份 Markdown 报告,包含文件清单、SHA-256 哈希、权限检查、高风险序列化格式检测等信息。
五大核心检测能力
1. 高危序列化格式检测
mdd 会扫描目录中所有高风险格式文件:
| 风险等级 | 格式 |
|---|---|
| 高风险 | .pickle, .pt, .pth, .bin, .joblib, .h5 |
| 低风险 | .gguf, .safetensors, .onnx |
| 特殊 | 检查 pickle-like 字节标记 |
对于 Python 文件,它还会做 AST 扫描,检测 eval()、exec()、pickle.loads()、os.system()、subprocess 等危险调用模式。
2. GGUF / Safetensors 元数据验证
- 检查 GGUF 文件的魔术字节和版本号
- 解析 safetensors 头部元数据
- 验证文件格式是否合规
3. 凭证泄露检测
内置启发式扫描,同时支持集成 detect-secrets,在模型文件中寻找疑似 API 密钥、令牌、密码等高熵字符串。
pip install "model-due-diligence[scanners]" mdd ./model --out ./audit
4. Git 来源追踪
如果目标是一个 Git 仓库,mdd 会自动检查:
- 远端来源(origin remote)
- 当前 commit SHA
- 工作目录是否 dirty
- Git LFS 文件清单
这让你能确认自己下载的确实是模型作者的官方 commit,而非某个被篡改的分支。
5. 风险评分系统
mdd 将所有发现归一化为一个 0-100 的评分:
| 风险等级 | 分数范围 | 建议操作 |
|---|---|---|
| LOW | 0-29 | 沙箱中首次运行 |
| MEDIUM | 30-69 | 理解每个发现后加载 |
| HIGH | 70-89 | 除非每个发现都有解释,否则不加载 |
| CRITICAL | 90-100 | 视为 unsafe |
评分默认保守——宁可误报也不漏报。
Ollama 集成:一键扫描已安装模型
如果你已经用 ollama pull qwen3:4b 装了一个模型,mdd 提供了专门的子命令:
mdd-ollama qwen3:4b --out ./audit-qwen3-ollama
它会自动定位 OLLAMA_MODELS 目录中的模型 blob,创建友好文件名,然后运行标准的静态审查流程。Ollama 服务甚至不需要在运行——只要有本地的 manifest 和 blob 存储即可。
CI 流水线集成
mdd 的 --fail-on 参数让它可以嵌入 CI/CD 流程:
mdd tests/fixtures/safe_repo --out ./audit --fail-on critical --skip-external mdd ./downloaded-model --out ./audit --fail-on medium
在 CI 中结合 mdd + GitHub Actions CodeQL + Pipeline 可以在模型进入生产环境的每一道门前设置安全检查。这特别适合类似 Miasma 事件的场景——如果 CI 阶段就能发现意外引入的二进制文件或异常 pickle 标记,影响面会被大幅缩小。
全面的安全操作模型
mdd 的 README 推荐了一套完整的安全流程,我把它们提炼为 9 条检查清单:
- 只从官方仓库或可信量化者下载
- 不要使用
latest等浮动标签——锁定具体 Git 版本 - 记录 SHA-256 哈希,方便事后验证
- 用
mdd做静态审计,检查所有 HIGH/CRITICAL 发现 - 首次推理在网络隔离的容器或 VM 中执行
- 不要挂载 API 密钥、SSH 密钥、云凭证
- 在 RAG 或 Agent 部署前测试提示注入行为
- 保留审计报告和已接受的哈希值
- 不要把
mdd当作唯一信任机制——它是多层防御的一环
输出格式:不止一个 Markdown
mdd 支持三种输出格式:
mdd ./model --out ./audit --format markdown mdd ./model --out ./audit --format json mdd ./model --out ./audit --format sarif mdd ./model --out ./audit --format markdown,json,sarif
最终目录结构示例:
audit/ ├── model_due_diligence_report.md ├── model_due_diligence_report.json ├── model_due_diligence_report.sarif ├── modelscan.json ├── semgrep.json ├── bandit.json ├── pip-audit-xxx.json └── detect-secrets.json
注意事项与局限
mdd 明确说了自己不能做什么——这是一个诚实的工具:
- ❌ 不能检测权重层面的后门(sleeper agent、trigger-based)
- ❌ 不能检测训练数据投毒
- ❌ 不能检测运行时数据泄露
- ❌ 不能替代人工审查
静态扫描发现”干净”不代表模型真的安全。它只是告诉你:在这个时间点上,工具没有发现已知的静态风险模式。
总结
在 Miasma、恶意 pickle 模型和开源供应链攻击频发的 2026 年,”先扫再跑”应该成为每个 AI 开发者的默认操作。mdd 虽然才发布一周(2026-06-08)、GitHub 上仅有 0 个 stars,但其文档完整度、架构设计(模块化单体 + 纯静态扫描 + 外部工具适配器)、以及对 NIST/MITRE/OWASP 标准的对齐,都远远超出”0 star 项目”的预期。
一句话总结:pip install model-due-diligence 然后在 ollama pull 之前跑一次 mdd。这个习惯花你 30 秒,但可能帮你省下一个灾难。