每个级别增加的阻止
根目录和主目录递归删除、Git 元数据保护和规范
policy.json 保护不依赖安全级别,也不能通过规则覆盖关闭。Git 命令
同时带强制标志和创建/重置标志的 Git 分支变更命令(例如
git checkout -Bf、git switch -Cf --discard-changes)会被视为强制分支重置并阻止。
Git SSH 环境覆盖
Git 接受GIT_SSH_COMMAND、GIT_SSH 和 GIT_SSH_VARIANT,以在网络操作期间运行任意程序。CC Safety Net 会阻止这些覆盖与网络子命令的组合:
文件系统命令
rm -rf 目标使用以下首个匹配分类顺序:不受支持的 Windows UNC 或设备目标、根目录或主目录、受保护的 Git 元数据、临时路径、动态目标、配置的 allow path、主目录作为工作目录、工作目录本身、工作目录内部、工作目录外部。临时路径在所有级别都允许。当前工作目录内的其他路径在 paranoid rm 未启用时允许。安全变体见被允许的命令。
将破坏性命令隐藏在 POSIX 函数中不会改变这些规则:函数正文会在调用位置使用调用者的 cwd 进行分析;调用可经由引号('cleanup')、time/! 前缀和 eval 解析。未调用的定义不产生作用。有关调用解析和 scope,请参阅 POSIX shell 函数。
Git 元数据和动态目标都会在配置的 allow path 前分类,因此 destructive_command_protection.allow_paths 中的项绝不会放宽 Git 元数据保护,也绝不会应用于无法验证的目标。
设备和磁盘破坏
CC Safety Net 在每个安全级别分析dd、mkfs 和 shred。这些规则不是灾难性规则,因此主破坏性命令开关和单条规则的 off 覆盖仍可应用。
只有对设备的写入会触发
dd 规则。从设备读取到文件(dd if=/dev/sda of=./backup.img)可以通过,对文件镜像运行 mkfs.ext4 disk.img 也可以通过。三条规则也适用于包装器和载体:bash -c "dd if=/dev/zero of=/dev/sda"、sudo mkfs.ext4 /dev/sda、env dd of=/dev/sda if=/dev/zero 和 eval "shred secret" 都会被阻止。
Git 元数据
CC Safety Net 解析执行目录最近的祖先.git 入口,并保护该入口、解析出的 Git 目录及其 hooks 子树。即使你位于工作目录内,此保护也会生效。它在加载任何配置前求值,因此没有安全级别,策略也无法关闭它。
符号链接的
.git 和 hooks 会同时按字面路径和规范路径保护,指向缺失 Git 目录的 .git 标记仍会阻止。POSIX shell 中末尾的 * 不匹配 dot-entry,因此仓库根目录中的 rm -rf ./* 不涵盖 .git,但 rm -rf .git/worktrees/* 和 PowerShell 通配符会涵盖。
保护范围是执行目录最近的 Git 控制面,不包括执行目录下其他嵌套仓库,也不包括解析集合外的 Git 内部路径。
规范 policy.json
修改或删除 ~/.cc-safety-net/policy.json,或设置变量时的 $CC_SAFETY_NET_HOME/policy.json,始终被阻止。此检查在加载配置前运行,因此其保护策略无法禁用它,拒绝不带安全级别或配置状态。原因字符串严格为:
[, cat, file, grep, head, jq, less, ls, more, rg, sed, stat, tail, test, wc。
PowerShell Remove-Item
PowerShell 支持是以 Remove-Item 及其别名和现有跨 shell 规则为中心的保守子集,不是通用 PowerShell 解析器。规则在 powershell 和 auto shell 模式中生效;posix 模式有意不应用这些规则,但仍保留 git.reset-hard 和 rm.recursive-force-root-or-home 等跨 shell 规则。
系统解析别名和缩写参数,因此
ri . -r -fo 也会阻止。调用运算符形式(& Remove-Item ...、& { ... }、. { ... })、带字面量字符串的 iex / Invoke-Expression 和 $(...) 子表达式都会被分析。行注释(#)和块注释(<# ... #>,包括嵌套)会被忽略,但其后的真实命令仍会阻止;格式错误或超过深度限制的块注释和子表达式会故障时拒绝。
-WhatIf 会取消删除,因此 -WhatIf、-WhatIf:$true 和 -wi 允许原本被阻止的命令;显式 -WhatIf:$false 仍会阻止。Strict 行有一个例外:Remove-Item $HOME -Recurse -Force 在 standard 中也会阻止,因为它分类为根目录/主目录目标,而不是动态目标。敏感路径
敏感路径保护是独立的防护阶段,在命令分析前运行。它涵盖受支持的 command、path、search(grep/glob)和 patch 形式,也会检查未知工具,但绝不会将未知工具的任意文本视为 shell 命令。 内置敏感集合不只阻止写入,也阻止读取:cat .env、env cat .env、sudo command cat .env、strings id_rsa、xxd .env、base64 .env、dd if=.env、cat ~/.ssh/id_rsa、bash -c "cat .env" 和 node -e 'require("child_process").execSync("cat .env")' 都会被阻止。
command 形式的提取是有界且结构化的:达到结构 shell 语法限制时会故障时拒绝,无效解析会抛出错误。配置的 deny path 在内置规则前匹配,并且绝不会被任何 standard 模式放宽。
完整目录(每个规则 ID 和系列、受保护路径、两个 Coding CLI 层级、匹配顺序和豁免)见机密保护参考。可用 secret_protection.enabled: false 禁用整个功能,也可通过 secret_protection.overrides 开关单项规则,详情见策略。
Shell 包装器和解释器单行命令
系统也会阻止包在bash -c 或 sh -c 等 shell 解释器中的命令。CC Safety Net 最多递归分析 10 层嵌套包装器;超过该深度时会拒绝,而不会放行。
默认情况下,会检测并阻止解释器单行命令中嵌入的破坏性代码。CC Safety Net 提取传给解释器
-c 或 -e 标志的代码,并扫描嵌入的破坏性操作,因此智能体无法将 os.system("rm -rf /") 包在 Python 或 Node 调用中来绕过 hook。
分析的解释器是
python、python2、python3、node、ruby 和 perl。触发阻止的是嵌入的破坏性命令,默认情况下不会只因单行命令形式而阻止。
阻止所有解释器单行命令
设置CC_SAFETY_NET_PARANOID_INTERPRETERS=1 后,所有这些解释器单行命令都会被阻止,即使不含危险代码。python -c "print(1)" 在 standard 和 strict 中允许,在此处被阻止。详情见模式。
这会阻止每个 python -c、node -e、ruby -e 和 perl -e 单行命令,而不论其内容。
strict 和 paranoid 中的 heredoc
启用 fail_closed 能力时,heredoc 仅在以下条件全部满足时允许:只有一个 heredoc;用于标准输入;分隔符带引号;没有其他输入重定向;消费者是字面量 cat、tee、git apply、git commit、gh pr create 或 gh issue create。fail_closed 在 strict 和 paranoid 中启用。
不带引号的分隔符会使用以下拒绝消息:
standard 模式处理 heredoc 内容的方式)见分析引擎。
无法解析的命令文本
解析器资源限制与级别无关,在所有模式下都会拒绝。使用
npx cc-safety-net explain "<command>" 可查看具体规则和分析结果。
启发式扫描会查找 rm -rf、git reset --hard、git reset --merge、git clean -f、git checkout --force、git checkout --、git push --force、git push --delete、git branch -D、git tag -d、git stash drop、git stash clear、不带 --staged 的 git restore、find -delete、dd of=/dev/、mkfs /dev/ 和 shred <arg>。匹配会以规则 raw-text.dangerous-command 拒绝。文本以 echo 或 rg 开头时会跳过 find、dd、mkfs 和 shred 模式,避免引用这些字符串触发扫描。