Skip to main content
CC Safety Net 阻止这些命令,因为它们可能永久破坏数据,包括未提交的更改、stash、远程历史或整个磁盘。下表涵盖默认内置规则;你可以用自定义规则扩展它们。 默认情况下,所有未标记的行在三个安全级别中都会阻止。标记为 StrictParanoid 的行需要对应级别或能力。策略可以禁用部分非灾难性规则。启用各级别的方法见模式 本页是行为矩阵,说明阻止什么以及每项边界的位置。它不是架构页面:有序防护流程见架构,分类器如何得到判定见分析引擎,可通过的安全变体见被允许的命令

每个级别增加的阻止

根目录和主目录递归删除、Git 元数据保护和规范 policy.json 保护不依赖安全级别,也不能通过规则覆盖关闭。

Git 命令

同时带强制标志和创建/重置标志的 Git 分支变更命令(例如 git checkout -Bfgit switch -Cf --discard-changes)会被视为强制分支重置并阻止。

Git SSH 环境覆盖

Git 接受 GIT_SSH_COMMANDGIT_SSHGIT_SSH_VARIANT,以在网络操作期间运行任意程序。CC Safety Net 会阻止这些覆盖与网络子命令的组合:

文件系统命令

rm -rf 目标使用以下首个匹配分类顺序:不受支持的 Windows UNC 或设备目标、根目录或主目录、受保护的 Git 元数据、临时路径、动态目标、配置的 allow path、主目录作为工作目录、工作目录本身、工作目录内部、工作目录外部。临时路径在所有级别都允许。当前工作目录内的其他路径在 paranoid rm 未启用时允许。安全变体见被允许的命令 将破坏性命令隐藏在 POSIX 函数中不会改变这些规则:函数正文会在调用位置使用调用者的 cwd 进行分析;调用可经由引号('cleanup')、time/! 前缀和 eval 解析。未调用的定义不产生作用。有关调用解析和 scope,请参阅 POSIX shell 函数
standard 不会一律阻止动态 rm -rf 目标。rm -rf "$target" 只有在启用 fail_closedstrictparanoid 中才被阻止。不可信来源可能构造命令时,请使用更高级别。
Git 元数据和动态目标都会在配置的 allow path 前分类,因此 destructive_command_protection.allow_paths 中的项绝不会放宽 Git 元数据保护,也绝不会应用于无法验证的目标。

设备和磁盘破坏

CC Safety Net 在每个安全级别分析 ddmkfsshred。这些规则不是灾难性规则,因此主破坏性命令开关和单条规则的 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/sdaenv dd of=/dev/sda if=/dev/zeroeval "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,始终被阻止。此检查在加载配置前运行,因此其保护策略无法禁用它,拒绝不带安全级别或配置状态。原因字符串严格为:
检查覆盖文件、其目录和祖先目录的直接写入、编辑、patch、准确 shell 操作数、写入重定向、受支持的环境变量/相对路径/现有符号链接别名、递归删除,以及以文件、目录或祖先为源的移动。 以下只读命令允许检查该文件:[, cat, file, grep, head, jq, less, ls, more, rg, sed, stat, tail, test, wc
这是有意保持最小范围的精确路径保护,不是命令模拟。它跟踪仅赋值 shell 变量和明确的 cd,但不会展开 glob 或 brace,不会推断解释器计算路径、检查解释器正文、推断归档成员、模拟 find 操作或推断传输后的最终文件名。Rulebook、lockfile、缓存、同级文件和对策略目录的检查不在此防护范围内,只有 policy.json 防篡改。

PowerShell Remove-Item

PowerShell 支持是以 Remove-Item 及其别名和现有跨 shell 规则为中心的保守子集,不是通用 PowerShell 解析器。规则在 powershellauto shell 模式中生效;posix 模式有意不应用这些规则,但仍保留 git.reset-hardrm.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 -Forcestandard 中也会阻止,因为它分类为根目录/主目录目标,而不是动态目标。

敏感路径

敏感路径保护是独立的防护阶段,在命令分析前运行。它涵盖受支持的 commandpathsearch(grep/glob)和 patch 形式,也会检查未知工具,但绝不会将未知工具的任意文本视为 shell 命令。 内置敏感集合不只阻止写入,也阻止读取:cat .envenv cat .envsudo command cat .envstrings id_rsaxxd .envbase64 .envdd if=.envcat ~/.ssh/id_rsabash -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 -csh -c 等 shell 解释器中的命令。CC Safety Net 最多递归分析 10 层嵌套包装器;超过该深度时会拒绝,而不会放行。 默认情况下,会检测并阻止解释器单行命令中嵌入的破坏性代码。CC Safety Net 提取传给解释器 -c-e 标志的代码,并扫描嵌入的破坏性操作,因此智能体无法将 os.system("rm -rf /") 包在 Python 或 Node 调用中来绕过 hook。 分析的解释器是 pythonpython2python3noderubyperl。触发阻止的是嵌入的破坏性命令,默认情况下不会只因单行命令形式而阻止。

阻止所有解释器单行命令

设置 CC_SAFETY_NET_PARANOID_INTERPRETERS=1 后,所有这些解释器单行命令都会被阻止,即使不含危险代码。python -c "print(1)"standardstrict 中允许,在此处被阻止。详情见模式 这会阻止每个 python -cnode -eruby -eperl -e 单行命令,而不论其内容。

strictparanoid 中的 heredoc

启用 fail_closed 能力时,heredoc 仅在以下条件全部满足时允许:只有一个 heredoc;用于标准输入;分隔符带引号;没有其他输入重定向;消费者是字面量 catteegit applygit commitgh pr creategh issue createfail_closedstrictparanoid 中启用。 不带引号的分隔符会使用以下拒绝消息:
其他不受支持的形式或消费者会使用以下消息:
完整 heredoc 合同(包括 standard 模式处理 heredoc 内容的方式)见分析引擎

无法解析的命令文本

解析器资源限制与级别无关,在所有模式下都会拒绝。使用 npx cc-safety-net explain "<command>" 可查看具体规则和分析结果。 启发式扫描会查找 rm -rfgit reset --hardgit reset --mergegit clean -fgit checkout --forcegit checkout --git push --forcegit push --deletegit branch -Dgit tag -dgit stash dropgit stash clear、不带 --stagedgit restorefind -deletedd of=/dev/mkfs /dev/shred <arg>。匹配会以规则 raw-text.dangerous-command 拒绝。文本以 echo rg 开头时会跳过 findddmkfsshred 模式,避免引用这些字符串触发扫描。
资源耗尽限制独立于级别系统,并在包括 standard 在内的每个模式中拒绝:超过声明命令递归限制或结构命令验证限制始终拒绝,绝不会放行。
explain 命令可准确跟踪 CC Safety Net 阻止或允许任意命令的原因。参数见 CLI 命令,JSON schema 见 Explain 跟踪
最后修改于 2026年8月12日