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。
按顺序检查的内容
每次工具调用都按以下顺序经过同样的阶段:- 有界输入提取。 CC Safety Net 在深度、字段数和大小的限制内从工具输入中读出命令。超过任一限制的输入会被阻止。
- 单次解析。 命令只解析一次,后续阶段都复用这个结果。耗尽解析器预算的输入在所有安全级别下都会被阻止。
- 策略文件保护。 任何会修改或删除 CC Safety Net 自己的
policy.json、其所在目录或祖先目录的操作都会被阻止。 - Git 元数据保护。 任何会删除、移动、覆盖或 patch 仓库
.git元数据或 hooks 目录的操作都会被阻止,包括从工作目录内部发起的操作。 - 加载配置。 解析出你的策略、rulebook 和安全级别。
- 敏感路径保护。 对照内置的敏感位置(
.env、~/.ssh、云服务和编码 CLI 的凭证文件)以及你配置的拒绝路径,检查命令、路径、搜索和 patch。 - 破坏性命令分析。 把命令拆成命令段,展开包装器和解释器,再由对应的分析器对每个命令段分类。分析器覆盖
git、rm、Remove-Item、find、xargs、parallel、设备命令和自定义规则。
分析器能看穿的写法
把命令藏进另一条命令里,也躲不过第 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 模式无法验证的命令会以权限提示的形式交给你,而不是直接阻止。消息字段不变,只有首行和末行不同:审计记录
CC Safety Net 会把所有拒绝记入本地审计日志,默认也记录允许的命令决策。用npx cc-safety-net logs 读取。日志位置、字段、保留期限和脱敏规则见审计日志参考。
决策出乎预期时
1
询问原因
npx cc-safety-net explain "<command>" 会重放分析过程,显示命中了哪条规则以及原因。加上 --json 可获得结构化跟踪。2