跳转到主要内容
CC Safety Net 是一个执行前 hook。编码智能体每次要运行 shell 命令或文件操作时,它都会先在你的机器上检查,并在操作到达操作系统之前返回允许或阻止。被阻止的调用不会运行,智能体会收到一条消息,说明阻止原因和替代做法。

CC Safety Net 是否使用 LLM?

不使用。所有决策都由本地基于规则的解析器做出。它把命令解析为可执行文件、子命令、选项和参数,再套用固定规则。相同的命令、工作目录和配置,决策结果总是相同。不会向任何模型或网络发送内容,提示词怎么写都无法把阻止变成允许。

一次工具调用的生命周期

1

智能体准备工具调用

智能体准备好一条 shell 命令(如 git reset --hard),或一次文件写入、编辑、搜索或 patch,并交给自己的工具层。
2

集成拦截调用

该智能体对应的 CC Safety Net 集成会在工具执行前收到这次调用。接收方式因智能体而异,见集成模型。
3

CC Safety Net 检查操作

CC Safety Net 只解析一次输入,然后按按顺序检查的内容运行各项检查。
4

返回允许或阻止

允许的调用正常执行。被阻止的调用不会运行,智能体会以工具结果的形式收到阻止消息。
5

记录决策

决策会写入本地审计日志。

集成模型

CC Safety Net 通过四种集成模型支持十六种智能体。每种模型运行的检查相同,同一次调用得到的决策也相同。 “安装”部分中每个智能体的页面都列出了它保护的工具和配置所在位置。如果想在自己的 Node.js 程序里调用同样的检查,见 Library API。

按顺序检查的内容

每次工具调用都按以下顺序经过同样的阶段:
  1. 有界输入提取。 CC Safety Net 在深度、字段数和大小的限制内从工具输入中读出命令。超过任一限制的输入会被阻止。
  2. 单次解析。 命令只解析一次,后续阶段都复用这个结果。耗尽解析器预算的输入在所有安全级别下都会被阻止。
  3. 策略文件保护。 任何会修改或删除 CC Safety Net 自己的 policy.json、其所在目录或祖先目录的操作都会被阻止。
  4. Git 元数据保护。 任何会删除、移动、覆盖或 patch 仓库 .git 元数据或 hooks 目录的操作都会被阻止,包括从工作目录内部发起的操作。
  5. 加载配置。 解析出你的策略、rulebook 和安全级别。
  6. 敏感路径保护。 对照内置的敏感位置(.env、~/.ssh、云服务和编码 CLI 的凭证文件)以及你配置的拒绝路径,检查命令、路径、搜索和 patch。
  7. 破坏性命令分析。 把命令拆成命令段,展开包装器和解释器,再由对应的分析器对每个命令段分类。分析器覆盖 git、rm、Remove-Item、find、xargs、parallel、设备命令和自定义规则。
第 3、4 步在第 5 步之前运行,所以任何配置都无法削弱它们。第 6 步遵循你的策略,可以关闭,也可以用自己的拒绝路径扩展。

分析器能看穿的写法

把命令藏进另一条命令里,也躲不过第 7 步:
  • 包装器和解释器。 分析器会展开 sh -c、bash -c、sudo、env 以及 python -c、node -e 单行命令,分析其中的内层命令,最多 10 层。更深的嵌套会被阻止。见 Shell 包装器和解释器单行命令。
  • 同一命令内的 cd。 分析器在 dir 中判断 cd dir && rm -rf x。如果 cd 无法解析,其后的目标就无法验证。见文件系统命令。
  • Shell 函数。 分析器在函数被调用的位置检查函数体,所以 cleanup() { rm -rf ../outside; }; cleanup 会被阻止。只定义、从未调用的函数会被允许。见文件系统命令。
  • Heredoc。 cat > note.md <<'EOF' 只是写入数据,无论 body 写了什么都会被允许。如果 shell 把 heredoc 当作自己的程序来执行,例如 bash <<'EOF',则逐条命令分析。见 strict 和 paranoid 中的 heredoc。
  • Shell 脚本。 对于 sh x.sh、source x.sh 和 ./x.sh,分析器会读取其背后的脚本,无论它是同一条命令中的 heredoc 刚写出的,还是原本就在磁盘上;阻止理由中会指明文件和行号。python3 tool.py 这类解释器文件不会被读取。见从文件运行的脚本。
  • 复合命令。 if、while、until 和 { …; } 主体中的命令与顶层命令一样接受检查,所以 if true; then rm -rf ~; fi 会被阻止。
  • 动态目标。 由变量或替换构造的目标(如 rm -rf "$target")在运行前无法验证。standard 允许这类命令,strict 和 paranoid 会阻止。见文件系统命令。

为什么分析意图,而不是匹配字符串

CC Safety Net 按命令实际做什么来做出决策。开头相同的两条命令,结果可能不同: 两者都以 git checkout 开头。如果不重复实现 Git 的选项逻辑,前缀规则无法区分它们。解析命令还能识别调换顺序的选项(rm -r -f /)、shell 包装器(sh -c "rm -rf /")和解释器单行命令(python -c 'import os; os.system("rm -rf /")')。 哪些命令会被阻止、哪些不会,见被阻止和允许的命令。

阻止消息的形式

智能体会以工具结果的形式收到阻止消息:
Rule: 行给出阻止该调用的规则或固定拒绝的 ID。只有 hook 输入缺失或不是有效 JSON 时,消息中才没有这一行。命令和命令段文本会被截短,整条消息中的机密都会被脱敏。 以下各行只在适用时出现: 阻止不会结束智能体会话。结尾指令由规则的 intent 决定,引导智能体回到任务上,而不是反复尝试变体: 阻止本身并不依赖智能体是否照这条指令去做,因为命令根本不会运行。

消息改为询问而不是阻止时

在 Claude Code 中,standard 模式无法验证的命令会以权限提示的形式交给你,而不是直接阻止。消息字段不变,只有首行和末行不同:
末行取代了 intent 指令,因为这次由你而不是智能体来决定。无论哪种结果,审计日志都把这次调用记为拒绝。哪些拒绝会变成询问、在哪些权限模式下生效,见 Claude Code 何时改为询问而不是阻止。

审计记录

CC Safety Net 会把所有拒绝记入本地审计日志,默认也记录允许的命令决策。用 npx cc-safety-net logs 读取。日志位置、字段、保留期限和脱敏规则见审计日志参考。

决策出乎预期时

1

询问原因

npx cc-safety-net explain "<command>" 会重放分析过程,显示命中了哪条规则以及原因。加上 --json 可获得结构化跟踪。
2

确认保护已生效

npx cc-safety-net status 会输出 ready 或 degraded。degraded 表示某个配置来源被拒绝,当前执行的是回退配置。输出说明见 status,修复配置来源见配置恢复。
3

调整或报告

如果阻止没错,只是对你的工作流过于严格,可以换一种安全模式,或为个别规则添加覆盖。如果安全的命令被阻止,或破坏性命令没被阻止,请参阅故障排除和安全策略,了解该向哪里报告。

CC Safety Net 不涵盖的范围

CC Safety Net 检查的是智能体尝试发起的工具调用。任意二进制文件运行后做了什么、经由不透明代理发送的命令、网络活动,它都看不到。它不是操作系统沙箱或权限边界,绕过已安装集成的命令也不受保护。完整列表和缓解措施见已知限制。
最后修改于 2026年10月27日