Crucible · 模型审查防火墙

干净的扫描仍未解决模型加载的实质问题

合成模型通过了 PickleScan 基线,但在加载过程中尝试打开数据库。Crucible 记录并拦截了该配置的效果,返回附带证据的 QUARANTINE。

23/23 vs 19/23

拦截事件检测对比 PickleScan 标志

相同的 23 个恶意加规避型合成测试夹具

4/4 vs 0/4

四个构造的规避样本

行为检测对比 PickleScan 1.0.4

2/2

路由至 REVIEW 的弃权夹具

需要更多证据;未签发签名

卡片展示了 2026 年 10 月 6 日使用确定性建议进行的单次固定 33 构件合成直接流水线参考运行结果。它们未评估针对未知模型的检测率。视频单独记录了本地应用中新配置的检查:主控制台使用缓存 Codex 建议,基准测试使用确定性建议。未捕获新的模型推理。

决策需要关于加载过程的证据

当安全团队审批序列化模型时,核心问题不仅限于其声明的身份:加载尝试执行了什么操作,以及还有哪些证据尚未解决?

Python 警告称,精心构造的 pickle 数据可能会在反序列化过程中执行代码。Hugging Face 的 pickle 扫描文档也指出了检查导入项与操作码的局限性。 Python pickle 文档; Hugging Face pickle 扫描文档。

我们的合成 SQLite 夹具使这一区别变得可审查:未带感染标志的基线与被拦截的数据库打开尝试并存。准入记录保留了这两项发现,而不是将扫描器输出的干净字段直接视为放行批准。

配置决策的生成机制

  1. 审查受支持的 pickle 内容。 静态操作码反汇编记录全局变量并估算调用的可调用对象。安装的 PickleScan 基线提供独立的对比字段;其标志并不直接决定最终判定。
  2. 观察尝试的加载过程。 全新的 Python 子进程使用 CPython 审计钩子记录选定事件,并在配置的拦截效果(包括 SQLite 连接与套接字连接)生效前触发异常。这是基于进程隔离的 Python 插桩,不包含容器或操作系统级别的沙箱限制。
  3. 应用门禁并保留不确定性。 被拦截的行为事件返回 QUARANTINE。运行器崩溃或超时、pickle 反汇编错误,或未执行的危险静态全局变量返回 REVIEW。在其他情况下,基础门禁返回 ALLOW;质询者的质疑可将 ALLOW 更改为 REVIEW,而 QUARANTINE 始终保持有效。
  4. 附加有界记录。 每项结果都会收到一个最小化的 CycloneDX 格式模型清单与本地哈希链字段。只有 ALLOW 会针对模型名称、构件哈希和清单接收开发密钥签名。未知的上游历史保持为 UNKNOWN。

建议机制在单次组合请求中使用分析员与质询者角色。所记录的主控制台使用缓存建议;基准测试使用确定性建议。这些配置检查并不保证每个畸形文件、不受支持的格式或分析错误都会路由至 REVIEW。

跟踪单个构件从干净扫描到准入决策的全过程

下文中的所有构件、模型名称以及 hf:// 来源标签均为本地合成测试夹具,而非客户模型或经过验证的注册中心记录。前三张截图记录了使用缓存 Codex 建议的新配置检查;单独的基准测试捕获使用的是确定性建议。未展示新的模型推理。

实操示例:干净的基线,被拦截的数据库尝试

生成的 trusted-looking/finetune-safe pickle 文件在反序列化过程中尝试打开 SQLite 数据库。其名称为人工编写的夹具标签,并非可信证据。有价值的问题在于:扫描器发现的结果与观察到的加载行为是否支持相同的准入决策。

配置的结果

PickleScan: CLEAN。观察到的操作: sqlite3.connect,已尝试且被拦截。最终判定:QUARANTINE。签名:none。

Crucible 合成 SQLite 规避样本显示 PickleScan CLEAN、被拦截的 sqlite3.connect 及 QUARANTINE
合成 SQLite 规避样本:PickleScan 未标记该构件;配置的审计钩子记录并拦截了其尝试的数据库操作。QUARANTINE 不签发签名。NO CODE SURFACE 表示未命中配置的危险全局变量;_sqlite3.connect 依然存在。界面中的沙箱表述指子进程审计插桩,不包含操作系统或容器级别的隔离限制。点击图片可查看完整尺寸。

1. 分别解读扫描器与静态检查发现

PickleScan 1.0.4 将 _sqlite3.connect 记录为可疑,但未设置其感染标志。Crucible 的静态反汇编同样保留了该导入的可调用对象,但它不在配置的危险全局变量集合中。因此,可见的 NO CODE SURFACE 徽标表示未命中配置的危险全局变量;这并不意味着该文件不包含可执行的可调用对象。

合成 SQLite 构件的证据
检查项记录的发现所确立的结论
PickleScan 基线flagged: false; _sqlite3.connect [suspicious]该基线未标记此构件。它不能证明加载过程无害。
静态反汇编_sqlite3.connect 存在于导入项与近似可调用对象中;未命中配置的危险全局变量即使配置的拒绝列表未命中,该可调用对象依然可见。
观察到的加载sqlite3.connect 伴随 blocked: true; loaded: false审计钩子在配置的打开数据库操作生效前触发异常。
最终门禁QUARANTINE; signature: null被拦截的尝试决定了该判定。未签发签名。

2. 根据尝试的效果决定处置路由

新的 Python 工作进程调用 sqlite3.connect 以访问 /tmp/vp_demo_persist/.store.db。其 CPython 审计钩子记录了该操作,并在配置的效果生效前触发异常。门禁返回 QUARANTINE,因为观察到了被拦截的危险事件,无论基线标志是否干净。该证据并不表明数据库已创建或持久化成功。

界面称该工作进程为沙箱。其实现的边界是带有选定 Python 审计钩子的子进程,不具备操作系统沙箱、容器隔离或网络隔离。生产准入系统需要另行建立完善的隔离遏制边界。

3. 保持决策与构件及记录的严格绑定

可下载的 JSON 记录将构件的 SHA-256 与其静态检查发现、基线结果、尝试的调用、门禁原因、最小化模型清单以及本地哈希链字段关联起来。对于此 QUARANTINE 结果,签名字段为 null。审查人员可以检视决策证据,而不会将咨询建议误认为是审批或已完成的注册中心操作。

哈希标识受检的构件字节。本地链支持记录之间的一致性检查,但它没有独立的托管或外部锚点,也不是不可变归档。下文展示的经签名的 ALLOW 负载所涵盖的字段集合比完整的证据记录更窄。

无异常加载使条件分支发现处于未解决状态

另一个独立的合成 acme/experimental-rl 夹具包含 builtins.eval (静态检查中)。其条件分支在此环境中未被执行,且观察到的加载未记录被拦截的危险事件。未解决的静态发现将其路由至 REVIEW 且不附带签名。该路径保留了获取更多证据的需求;未展示已完成的人工调查。

Crucible 合成条件夹具显示 builtins.eval、无被拦截运行时事件及 REVIEW
合成条件夹具:静态检查发现了 builtins.eval,而观察到的加载未记录被拦截的危险事件。REVIEW 不签发签名,并将构件路由以等待进一步证据,而非代表已完成的人工审查。点击图片可查看完整尺寸。

ALLOW 对本地清单进行签名,而来源出处保持为 UNKNOWN

生成的 acme/sentiment-mlp 权重字典遵循干净路径:未记录任何被拦截的危险事件,配置的检查返回 ALLOW 并签发 Ed25519 签名。其清单列出了构件与哈希、序列化格式、推断的框架以及声明的来源。定型数据来源与微调历史仍为 UNKNOWN。

Crucible 合成干净权重清单显示 UNKNOWN 出处及本地 Ed25519 签名
合成干净权重字典:ALLOW 针对模型名称、哈希和清单接收本地开发密钥签名。定型出处与微调历史仍为 UNKNOWN。可见的框架参考文本为配置的标签,未经法律验证,亦非合规认定。点击图片可查看完整尺寸。

该签名相对于本地开发密钥验证规范的模型名称、构件哈希以及最小化的 CycloneDX 格式清单负载。它不会对每个判定或整条记录进行签名,不会补全上游历史,不能确立定型权利,也不能证明任意模型是安全的。可见的监管参考文本为配置的夹具元数据,并非经过验证的合规性。

结合分母解读固定集合对比

2026 年 10 月 6 日的单次冻结直接流水线参考运行使用了确定性建议、PickleScan 1.0.4、临时开发密钥和临时账本。其生成的 33 个构件包括 8 个良性夹具、19 个恶意夹具、4 个构造的规避样本和 2 个弃权夹具。恶意加规避对比在两列中统计了相同的 23 个构件。

固定的 33 构件合成直接流水线参考运行
度量指标观察到的结果范围
恶意加规避样本检测行为检测 23/23;PickleScan 19/23在相同的 23 个夹具上,被拦截事件检测与基线感染标志的对比。
构造的规避样本行为检测 4/4;PickleScan 0/4四个旨在阐明这些检查之间差异的夹具。
良性决策0/8 被给出除 ALLOW 以外的判定八个良性夹具,并非对未知模型误报率的估计。
ALLOW 签名8/8 已签发并验证验证使用内置函数与本地开发密钥。
弃权路由2/2 REVIEW未解决的夹具保持未签名状态;调查尚未完成。
预期判定与本地链33/33 匹配;哈希链接完整人工编写的夹具预期与本地一致性检查,无外部锚点。

下方的截图是本地应用中单独完成的 HTTP/SSE 基准测试运行,采用确定性建议。它展示了相同的固定集合对比和 33/33 的预期判定匹配。它并非上述冻结直接流水线参考度量的来源;其显示的时间消耗归属于该捕获的运行。

完成的 Crucible 合成基准测试显示 33/33 预期判定匹配、23/23 行为检测以及 19/23 PickleScan 标志
完成的本地 HTTP/SSE 基准测试:所有 33 个合成夹具均与其预期判定匹配。在相同的恶意加规避集合上,行为拦截事件检测为 23/23,PickleScan 标志为 19/23。建议采用确定性模式。仅 ALLOW 会对清单负载进行签名;REVIEW 与 QUARANTINE 均未签名。本地哈希链没有外部锚点,显示的时间亦非生产延迟。点击图片可查看完整尺寸。

这些基于构造夹具的观察结果并不能推断针对未见模型的检测率、生产延迟或安全失陷减少程度。ALLOW 仅描述对观察到的加载所执行的配置检查结果;它并不能确立穷尽的模型安全性。

各层能够确立的结论

层级本演示中的证据需恪守的边界
静态检查与 PickleScan全局变量、近似可调用对象与基线标志仅凭干净标志无法判断加载行为
行为观察单次观察加载中选定的尝试效果无异常加载可能使条件行为处于未解决状态
签名清单ALLOW 对应的本地模型名称、哈希与清单负载签名不能证实未知的上游历史
本地哈希链账本支持本地一致性检查的哈希链接无独立托管或外部锚点

本演示未涵盖的范围

Crucible 是针对合成构件的本地演示。它不包含公共注册中心连接器、企业准入强制执行机制、操作系统沙箱、生产密钥基础设施或完整的依赖重建。它不评估模型质量、推理安全性或定型数据投毒,其框架参考标签亦不能确立合规性。

Python 告诫称审计钩子不适合用于实现沙箱。 Python 审计钩子文档。生产环境工作必须在此本地演示之外建立隔离遏制、信任边界和受控保管链。

安全与平台团队常见问题

干净的 pickle 扫描能证明什么?

干净的 PickleScan 结果意味着该基线未标记受检构件。在 Crucible 的合成 SQLite 示例中,配置的审计钩子在基线保持干净的同时记录并拦截了加载过程中的数据库操作尝试。仅凭扫描器结果并不能证明加载过程没有副作用。

如果可疑的静态证据在加载期间未被执行会怎样?

当观察到的加载未执行被拦截的危险事件时,Crucible 会将命中配置的危险静态全局变量路由至 REVIEW。合成条件夹具包含 builtins.eval 并采用该路由且不带签名。REVIEW 请求进一步的证据;这并不意味着人工调查已经完成。

签名涵盖哪些内容?

只有 ALLOW 会使用本地开发密钥针对规范的模型名称、构件哈希和清单负载接收 Ed25519 签名。该签名相对于此密钥验证该负载。它不能证明上游保管链、来源真实性或完整的出处。

哪些上游出处仍属未知?

最小化的 CycloneDX 格式模型清单将定型数据来源和微调历史记录为 UNKNOWN。它包括构件哈希、序列化格式、推断的框架以及声明的来源。ALLOW 判定和有效的本地签名不会补全缺失的历史。

工作进程是如何隔离的?

工作进程是一个全新的 Python 子进程,带有临时工作目录和 CPython 审计钩子,用于记录选定事件并拦截配置的效果。它没有容器或操作系统沙箱,也不是网络隔离环境。本演示不能确立生产环境的隔离限制或穷尽的安全保障。

这是否能与我们的注册中心和准入流水线集成?

该演示从本地合成注册中心读取生成的构件。其 hf:// 来源字符串为夹具标签,且没有公共注册中心连接器或企业准入强制执行机制。生产集成将需要注册中心信任边界、隔离限制、密钥管理以及受独立控制的审计存储。

技术研究

探索相关研究以获取关于本演示更广泛的背景信息。

明确准入门禁所需的证据

与我们的团队探讨您的模型引入工作流。

我们利用这些展示的区别,围绕您的注册中心、加载边界和证据要求开展评估或实施层面的探讨。

准入设计评估

  • ✓ 构件格式与引入路径
  • ✓ 检查与未解决的判定
  • ✓ 加载与隔离边界
  • ✓ 清单与审计要求

生产实施规划

  • ✓ 注册中心与流水线集成
  • ✓ 隔离遏制与部署设计
  • ✓ 签名密钥与证据保管
  • ✓ 代表性评估方案