Git コマンド
ファイルシステムコマンド
rm -rf はターゲットによって分類され、最初の一致が優先されます。ルートまたはホームのターゲット(/、~、$HOME)、保護対象の Git メタデータ、cwd 自体(rm -rf .)、cwd がホーム自体である場合は、すべてのレベルでブロックされます。cwd 外のその他のリテラルパスも、認識済みの一時パスまたは設定済み allow path でない限りブロックされます。一時パスと cwd 内のパスは許可されます。違いに注意してください。rm -rf ./subdir は許可されますが、cwd 自体を示す rm -rf . はブロックされます。
その上で、レベルに応じた次の 2 つの調整が適用されます。
- 動的ターゲット(
rm -rf "$target"、バッククォート、置換)は standard では許可され、fail-closed 機能が有効になるとブロックされます。standard は、敵対的または動的に生成されたコマンドテキストに対してベストエフォートで動作します。 CC_SAFETY_NET_PARANOID_RM=1を設定すると、一時パス以外の再帰的な強制削除は、cwd 内でもブロックされます。そのため、rm -rf ./cacheは許可されなくなります。一時ターゲットと設定済みの許可パスは引き続き許可されます。
設定済みの許可パス
destructive_command_protection.allow_paths に記載した絶対ディレクトリまたは ~/ で始まるディレクトリは、信頼された一時ルートとして扱われます。これはすべての安全レベルで、rm、PowerShell の Remove-Item、find -delete に適用されます。
許可パスが他の範囲を広げることはありません。機密パス保護や拒否パスを緩和しません。ルート、ホーム、保護対象の Git メタデータを対象にはできません。リポジトリを含む許可パスでも、そのリポジトリの .git に対する rm -rf はブロックされます。動的ターゲットが最初に分類されるため、検証できないターゲットには許可パスが適用されません。$HOME と等しい、またはそれを含むエントリは、検証時と正規化後の両方で拒否されます。許可パスから外へ出るシンボリックリンクは対象外です。
heredoc データコンシューマー
stdin の引用符付き heredoc で、コンシューマーが本文を保存または公開するだけの場合、その本文はプログラムではなくデータです。そのため、本文をコマンドテキストとしてスキャンしません。コンシューマーは、リテラルのcat、tee、git apply、git commit、gh pr create、gh issue create のいずれかである必要があります。heredoc はコマンドの唯一の入力リダイレクトである必要があります。また、cat と tee は出力プロセス置換(>(...))に接続できません。この許可は、strict と paranoid を含むすべてのレベルで有効です。
区切り文字は引用符で囲む必要があります(
<<'EOF')。引用符がない <<EOF の本文では置換が展開される可能性があるため、standard では引き続きスキャンされ、fail-closed が有効になると拒否されます。heredoc の外にあるコマンドは引き続き解析されます。cat <<'EOF' && rm -rf ~ は rm でブロックされます。cat、tee、git commit、gh pr create、gh issue create では、機密パスを抽出する前にも本文がマスクされます。そのため、シークレットのファイル名を文章で示してもコミットはブロックされません。git apply の本文は、書き込むファイル名をパッチが示すため、パス抽出からは見える状態を保ちます。完全な条件と、その条件を満たさない heredoc を standard が処理する方法については、heredoc 解析を参照してください。
standard のみの許可
次の形式は standard では許可され、strict または paranoid が有効になると拒否されます。これは見落としではなく、意図したトレードオフです。standard は、敵対的または動的な入力に対してベストエフォートで動作します。
引用符付き代入の保留は狭い範囲に限定されます。代入自体は何も実行せず、引用符付きの展開は 1 つの argv ワードのままなので、コマンドとフラグに分割されません。データとしての使用だとアナライザーが証明できない参照では、代入時のブロックが維持されます。これには、引用符なしの展開(
env $W)、コマンド位置でのすべての展開(引用符付きも含む)、コマンド置換内の参照、引用符なしの heredoc 本文内の参照が含まれます。値をシェルに渡す処理は、後段で検出されます。eval "$W"、bash -c "$W"、echo "$W" | sh はすべて、シェル実行元を検証できないため拒否されます。
リソース枯渇の制限は、このトレードオフの一部ではありません。パーサーの再帰上限または構造検証上限を超えるコマンドは、standard を含むすべてのレベルで拒否されます。
デバイスコマンド
dd、mkfs、shred はすべてのレベルで解析されますが、実際に破壊的な形式のみがブロックされます。
PowerShell コマンド
シェルモードに
posix を選ぶと、PowerShell の削除ルールは意図的にすべて無効になります。一方、git.reset-hard や rm.recursive-force-root-or-home などのクロスシェルルールは維持されます。auto モードでは、明示的な Remove-Item が検出されます。これは、;、改行、&&、|| の後にある場合も同じです。
機密パスに関する許可
機密パス保護は、サポート対象の形式に対する範囲が限定されたパターンセットです。そのため、機密ファイル名を含む一部の形式は引き続き許可されます。
この許可のうち 2 つには、知っておく必要がある正確な境界があります。
- env テンプレート。 正確なベース名
.env.example、.env.sample、.env.template、.env.defaultsと、.env.example.または.env.sample.で始まるすべての名前(.env.example.localなど)は、ほかのすべての機密パスルールより先に除外されます。そのため、保護対象のホームディレクトリ内でも読み書きできます。この接頭辞形式は、残りの 2 つのテンプレートには拡張されません。.env.template.localは、ほかのすべての.env.*名と同様にsecret.pattern.env-variantでブロックされます。 - ベンダー管理ディレクトリ。 パスセグメントが
node_modulesまたは__pycache__の場合、または隣接する組み合わせvendor/bundleまたはvendor/cacheがある場合(単独のvendorセグメントは対象外)、正確に 2 つのルールグループが抑制されます。拡張子ルール(.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 はリンクされた 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— 共有 ref に影響するgit stash drop/git stash clear— stash は worktree 間で共有されるgit worktree remove --force— 別の worktree を削除する可能性がある
rm .git、rm -rf <resolved gitDir>、rm -rf <commonDir>、リダイレクト > .git はすべて hard-stop になります。これは、マーカーファイルが解決する Git ディレクトリも保護されるためです。