Skip to main content
本页定义供维护者查阅的防护管线。工作原理从用户角度说明同一流程。集成架构说明各智能体如何接入防护。 CC Safety Net 是静态执行前策略门。每个受支持的编码智能体都会向它发送工具调用,防护按相同顺序检查每个调用。集成之间的差异仅在于调用的到达方式:标准输入 hook 子进程,或进程内插件与扩展。 下列阶段顺序只在此定义。其他页面只用一两句说明,并链接回本页。每个分析器的具体行为见分析引擎

系统组件

集成适配器

适配器把智能体的工具调用 payload 转为规范 invocation,并把防护判定转为智能体的 deny 格式。在系统层面,适配器只向精确匹配的、集成专用的工具名授予命令执行能力。未知工具不会按 shell 命令处理,它仍接受策略文件、Git 元数据和敏感路径检查,但其文本不会解析为命令。 各智能体的适配器、hook 标志和配置位置见集成架构,设置命令见安装

策略快照

loadPolicySnapshot() 由用户策略文件、项目策略文件、各范围的 rule.json,以及每个已配置来源指向的 rulebook 文件组合出有效运行时策略。它的约定和内容同样重要:
  • 不写入、不发出网络请求,也不使用内存缓存。rulebook 是实时文件,加载器每次工具调用都从磁盘读取各个 rulebook.json。只有 cc-safety-net rule addcc-safety-net rule update 会访问网络。
  • 结果深度不可变。策略对象、规则数组、每条规则及其 block_args、透明包装器列表、安全块及其 override、破坏性命令规则 override、允许路径、机密保护块及其 disabled rule 和拒绝路径都已冻结,快照包装器本身也是如此。
  • 它只解析为两种状态ready 表示每个通过验证的来源都已生效;degraded 表示某个候选来源被拒绝,改为执行安全的替代内容。degraded 原因会指出失败的来源、哪些内容未生效,以及如何修复。
  • 每条规则的来源信息(rulebook 名和版本、公开 source spec、override 原因)会注册到快照。存在项目策略文件时,还会记录安全级别由哪个范围设定,并为项目策略削弱的每个字段各记录一行。这些内容供诊断和 GUI 显示。
被拒绝的策略或规则来源本身不会导致普通工具调用被拒绝。运行时会丢弃该来源,而不是把它转为阻止。状态约定和修复路径见配置恢复

有序防护阶段

每个集成上的每次工具调用都执行以下固定顺序。拒绝操作会在审计日志中报告所示 failureStage 值。 从该顺序可直接得出三点关于阶段位置的事实:
  • 阶段 6 和 7 在阶段 8 之前运行。 策略文件保护和 Git 元数据保护会在加载任何配置之前作出拒绝。它们始终启用、不带 config state,任何预设、override 或 master switch 都无法削弱它们。
  • 敏感路径保护在快照之后、命令分析之前运行。 三种 hard-stop 保护中只有它受策略控制,控制项包括 master switch、per-pattern override 和拒绝路径。
  • 只有阶段 8 之后做出的判定才报告安全级别。 输入边界、策略文件保护或 Git 元数据保护产生的拒绝有意不带 level 和 config fallback 元数据,因为此时两者都尚未确定。
防护内的每个依赖调用都经过包装,因此抛出的错误会变为归因于该阶段的 fail-closed 拒绝。若原因是工具输入越界,则会从证据中剔除命令替换来源的文本,绝不回显超大输入。

命令分析内部流程

阶段 12 运行分类器。它按 shell 运算符把命令拆为多个段,并独立遍历每一段;只要有任何一段触发阻止,整个命令都会被拒绝。 引擎会跟踪各段之间的工作目录变化(通过 cdpushd),并传播环境 assignment,使目标分类反映真实 shell 行为。递归进入 shell 包装器和解释器 body 的上限为 10 层。各分析器、安全级别边界和完整目标分类顺序见分析引擎

解析器和运行时依赖面

parseCommand(source, dialect, limits) 分派到 CC Safety Net 自有的 POSIX 解析器自有的 PowerShell 解析器auto dialect 会自动判断适用哪一个。两者都是内部模块,而非对第三方语法的包装。 解析器和分析器预算是编译时常量,不是策略设置,因此任何配置都无法调高: 前三项限制初次解析。第四项限制初次解析后分析器从命令派生的工作,包括从 find -execxargsparallel 重建的子命令、包装器后的内嵌命令、重新送入分析器的已跟踪 heredoc 文件,以及 PowerShell Invoke-Expression 来源。耗尽预算会以 “Command analysis exceeds CC Safety Net’s derived-command work limit. Reduce nested or embedded command complexity and retry.” 拒绝。它不同于递归深度限制和上表的结构验证限制。 分析器的公开接口只约定两种结果:允许时不返回内容,阻止时返回结果对象。它不公开解析器内部的 complete / partial / limited 状态,因此调用方无法按解析置信度分支处理。 PowerShell 支持是一个保守子集Remove-Item 及其别名、文件 cmdlet Get-ContentSet-ContentAdd-ContentCopy-ItemMove-Item 及别名 gccattypecpmv,以及现有的跨 shell 规则。该子集保留原生引号、路径分隔符、连接符、pipeline 和动态 word 来源。敏感路径检查会解析 $HOME$env:USERPROFILE$env:HOME~ 前缀,加上用任一路径分隔符连接的字面量后缀;以其他方式拼装的路径,例如字符串拼接、子表达式或 Join-Path,不会被求值。它不是通用 PowerShell 解释器。

依赖项

CC Safety Net 只有一个运行时软件包依赖:zod,仅用于配置验证。源代码通过 createRequire 延迟加载它。拆分的 Node bundle(包括 Pi)保留此行为,并把该延迟加载指向随附的 dist/vendor/zod.cjs;独立的 Amp 和 OpenClaw artifact 则内联 zod。只有一个源模块导入它。 已发布 bundle 不包含第三方 shell 解析器projectShellSyntax 从解析后的 IR 生成路径扫描器读取的 flat entry stream。因此,shell 结构只来自上述内部 POSIX 和 PowerShell 解析器。系统不会再次对原始命令文本分词,也就不会产生两套解析结果的偏差。 已发布运行时目标为 Node.js 18 或更高版本。

关键设计属性

  • 所有集成使用同一个固定顺序。 上表就是完整约定。防护中不存在按智能体区分的分支。
  • 始终启用的保护先于配置。 策略文件保护和 Git 元数据保护无法禁用,因为它们在读取可能禁用自己的策略之前就已作出拒绝。
  • 防护自身失败时 fail closed。 依赖抛出错误、解析器预算耗尽或违反工具输入边界都会导致拒绝而非允许,并归因于失败的阶段。无效配置是另一回事,不会导致拒绝,见配置恢复
  • 评估时无网络、无写入。 运行时评估不发出网络请求,快照加载器也不写入。防护不检查或过滤出站流量。
  • 分析核心不依赖平台。 适配器只转换格式;所有集成共用同一套防护和分类器。
  • 有界,而非穷尽。 它是静态执行前策略门,不是操作系统沙箱、权限边界,也不保护绕过已安装集成的命令。见已知限制

后续阅读

技术指南先讲用户看到的流程,再讲设计依据。本页是第 3 步。
  • 上一页:集成架构说明每个智能体调用如何到达上述适配器;工作原理以用户层次说明同一序列。
  • 下一页:分析引擎详细说明阶段 12,包括各分析器、安全级别边界和递归删除分类顺序。
  • 然后:设计原则说明此顺序、始终启用的保护和自有解析器背后的原因。
相关页面:配置恢复说明 readydegraded安全模型说明信任边界,已知限制说明此设计无法覆盖的范围。
最后修改于 2026年8月31日