Git 命令
文件系统命令
rm -rf 按目标分类,第一个匹配项生效。根目录或主目录目标(/、~、$HOME)、受保护的 Git 元数据、当前工作目录本身(rm -rf .),以及当前工作目录就是主目录的情况,在所有级别都被阻止。当前工作目录外的其他字面路径也会被阻止,除非它们是已识别的临时路径或配置的 allow path。临时路径和当前工作目录内的路径是允许的。请注意区别:rm -rf ./subdir 是允许的,但 rm -rf .(当前工作目录本身)被阻止。
在此基础上还有两个依赖于级别的调整:
- 动态目标 (
rm -rf "$target"、反引号、替换) 在标准模式下是允许的,一旦启用故障关闭功能就会被阻止。标准模式尽最大努力防止对抗性或动态生成的命令文本。 - 使用
CC_SAFETY_NET_PARANOID_RM=1时,非临时递归强制删除会被阻止,即使在当前工作目录内,因此rm -rf ./cache不再通过。临时目标和配置的允许路径仍然有效。
配置的允许路径
在destructive_command_protection.allow_paths 下列出的绝对路径或以 ~/ 开头的目录被视为受信任的临时根目录。它们适用于所有安全级别,对 rm、PowerShell Remove-Item 和 find -delete 有效。
允许路径永远不会扩大其他任何内容。它们不会放宽敏感路径保护或拒绝路径。它们不能覆盖根目录、主目录或受保护的 Git 元数据 — 包含存储库的允许路径仍然会阻止 rm -rf 该存储库的 .git。由于动态目标首先被分类,允许路径永远不适用于无法验证的目标。等于或包含 $HOME 的条目在验证时以及规范化后都会被拒绝,并且允许路径外的符号链接逃逸也不受覆盖。
Heredoc 数据消费者
标准输入的带引号的 heredoc,其消费者仅存储或发布内容,则该内容被视为数据,而非程序,因此内容永远不会被扫描为命令文本。消费者必须是字面上的cat、tee、git apply、git commit、gh pr create 或 gh issue create;heredoc 必须是命令唯一的输入重定向;并且 cat/tee 不能馈送到输出进程替换 (>(...))。此允许在所有级别(包括严格和偏执)都有效。
分隔符必须带引号(
<<'EOF'):未带引号的 <<EOF 正文可以展开替换,因此在 standard 中仍会被扫描,并在启用 fail-closed 后被拒绝。heredoc 之外的命令仍会被分析,cat <<'EOF' && rm -rf ~ 会因 rm 被阻止。对于 cat、tee、git commit、gh pr create 和 gh issue create,正文在提取敏感路径前也会被屏蔽,因此在文字中提到机密文件名不会阻止提交;git apply 正文仍对路径提取可见,因为 patch 会列出其写入的文件。有关完整的门控以及 standard 如何处理未通过门控的 heredoc,请参阅 Heredoc 分析。
仅标准允许
这些形式在 standard 中允许,并在启用 strict 或 paranoid 后被拒绝。这是有意的权衡,不是疏漏:standard 对对抗性或动态输入提供尽力而为的保护。
带引号赋值的推迟是有限的。赋值本身不执行任何操作,带引号的展开保持一个 argv 单词,因此它不能拆分成命令加上标志。分析器无法证明是此类数据使用的任何引用都会保留赋值时的阻止:未引用的展开 (
env $W)、命令位置的任何展开(即使带引号)、命令替换内的引用或未引用的 heredoc 内容内的引用。将值传递给 shell 会在下游捕获:eval "$W"、bash -c "$W" 和 echo "$W" | sh 都会被拒绝,因为无法验证 shell 执行源。
资源耗尽限制不属于此权衡。超出解析器递归或结构验证边界的命令在所有级别(包括标准模式)都被拒绝。
设备命令
dd、mkfs 和 shred 在所有级别都会被分析,但只有真正破坏性的形式才会被阻止。
PowerShell 命令
选择
posix 作为 shell 模式会完全禁用 PowerShell 的移除规则,同时保留跨 shell 规则,如 git.reset-hard 和 rm.recursive-force-root-or-home。在 auto 模式下,会检测到显式的 Remove-Item — 包括在 ;、换行符、&& 或 || 之后。
敏感路径允许
敏感路径保护是支持形状的有限模式集,因此某些提及敏感文件名但仍被允许的形状。
其中两个允许具有精确的边界值得了解:
- Env 模板。 精确的基名
.env.example、.env.sample、.env.template和.env.defaults— 以及任何以.env.example.或.env.sample.开头的名称,例如.env.example.local— 在任何其他敏感路径规则运行之前都会被豁免,因此即使在受保护的主目录内也可以读取和写入。前缀形式不适用于其他两个模板:.env.template.local,像所有其他.env.*名称一样,在secret.pattern.env-variant下被阻止。 - 供应商目录。 当任何路径段是
node_modules或__pycache__,或者出现相邻的vendor/bundle或vendor/cache对(单独的vendor段不算),正好有两个规则组被抑制:扩展规则(.pem、.p12、.key等)和广泛的无扩展名键名规则secret.pattern.ssh-key-basename(*_rsa、*_dsa、*_ed25519、*_ecdsa)。其他所有规则在那里仍然适用 —node_modules/x/.env和node_modules/x/id_rsa像往常一样被阻止。.git不在跳过集中,因此.git树内的密钥材料(例如.git/hooks/deploy_key_rsa)像在其他任何地方一样匹配规则。
Worktree 模式例外
使用CC_SAFETY_NET_WORKTREE=1 时,CC Safety Net 会在验证 linked Git worktree 后允许选定的本地丢弃命令。如果验证失败,命令仍然被阻止。
以下命令在 worktree 模式激活时,在链接的 worktree 内是允许的:
git restore <file>和git restore --worktree <file>git checkout -- <file>、git checkout <ref> -- <file>、git checkout --force和模棱两可的多位置 checkout 表单git switch --discard-changes和git switch -f/--forcegit reset --hard和git reset --mergegit clean -f(以及组合标志,如-fd)
git push --force— 影响远程git branch -D— 影响共享引用git stash drop/git stash clear— stash 在 worktree 之间共享git worktree remove --force— 可能删除其他 worktree
rm .git、rm -rf <resolved gitDir>、rm -rf <commonDir> 以及重定向 > .git 仍然会硬停止,因为标记文件的已解析 Git 目录也受到保护。