Skip to main content
CC Safety Net は、意味に基づくコマンド解析を使って、許可される形式と破壊的な形式を区別します。アナライザーは、このページにあるコマンド形式を許可します。 一部の許可は安全レベルによって異なります。standard のみと記載した行は、strict または paranoid が有効になると許可されません。 このページは、許可されるコマンドのリファレンスです。ブロックされる形式については、ブロックされるコマンドを参照してください。順序付きのガードフローについては、アーキテクチャを参照してください。分類の動作については、解析エンジンを参照してください。
壊滅的な操作に対する保護は、すべての安全レベルに適用されます。ルートとホームの再帰削除、保護対象の Git メタデータ、正規の policy.json は常にブロックされます。このページにある形式、allow_paths、worktree モード、ルールごとの off オーバーライドでは、この保護を緩和できません。

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-Itemfind -delete に適用されます。 許可パスが他の範囲を広げることはありません。機密パス保護や拒否パスを緩和しません。ルート、ホーム、保護対象の Git メタデータを対象にはできません。リポジトリを含む許可パスでも、そのリポジトリの .git に対する rm -rf はブロックされます。動的ターゲットが最初に分類されるため、検証できないターゲットには許可パスが適用されません。$HOME と等しい、またはそれを含むエントリは、検証時と正規化後の両方で拒否されます。許可パスから外へ出るシンボリックリンクは対象外です。

heredoc データコンシューマー

stdin の引用符付き heredoc で、コンシューマーが本文を保存または公開するだけの場合、その本文はプログラムではなくデータです。そのため、本文をコマンドテキストとしてスキャンしません。コンシューマーは、リテラルの catteegit applygit commitgh pr creategh issue create のいずれかである必要があります。heredoc はコマンドの唯一の入力リダイレクトである必要があります。また、cattee は出力プロセス置換(>(...))に接続できません。この許可は、strict と paranoid を含むすべてのレベルで有効です。 区切り文字は引用符で囲む必要があります(<<'EOF')。引用符がない <<EOF の本文では置換が展開される可能性があるため、standard では引き続きスキャンされ、fail-closed が有効になると拒否されます。heredoc の外にあるコマンドは引き続き解析されます。cat <<'EOF' && rm -rf ~rm でブロックされます。catteegit commitgh pr creategh 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 を含むすべてのレベルで拒否されます。

デバイスコマンド

ddmkfsshred はすべてのレベルで解析されますが、実際に破壊的な形式のみがブロックされます。

PowerShell コマンド

シェルモードに posix を選ぶと、PowerShell の削除ルールは意図的にすべて無効になります。一方、git.reset-hardrm.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/.envnode_modules/x/id_rsa は通常どおりブロックされます。.git は除外セットに含まれません。そのため、.git ツリー内のキーマテリアル(.git/hooks/deploy_key_rsa など)は、ほかの場所と同様にルールに一致します。
standard は、機密な内容へのアクセスや設定済みの拒否パスを緩和しません。cat ~/.ssh/id_rsafind ~/.ssh -type f -exec cat {} +find ~/.ssh -type f -fprint .envtest -f ~/.ssh/id_rsa && cat ~/.ssh/id_rsatest -f "$(cat ~/.ssh/id_rsa)" はすべて standard でもブロックされます。拒否パスとその子孫は組み込みルールより先に一致し、standard のみの 2 つの緩和の対象外です。

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-changesgit switch -f / --force
  • git reset --hardgit reset --merge
  • git clean -f-fd などの結合フラグも含む)
次のコマンドはローカルの作業ツリーを越えて影響するため、リンクされた worktree 内でも引き続きブロックされます。
  • git push --force — リモートに影響する
  • git branch -D — 共有 ref に影響する
  • git stash drop / git stash clear — stash は worktree 間で共有される
  • git worktree remove --force — 別の worktree を削除する可能性がある
worktree モードは、Git のローカル破棄ルールのみを緩和します。ファイルシステム、デバイス、PowerShell のルールには影響しません。また、Git メタデータ保護を緩和することもありません。リンクされた worktree 内でも、rm .gitrm -rf <resolved gitDir>rm -rf <commonDir>、リダイレクト > .git はすべて hard-stop になります。これは、マーカーファイルが解決する Git ディレクトリも保護されるためです。
安全だと考えるコマンドを CC Safety Net がブロックする場合は、npx cc-safety-net explain "<command>" を実行して解析全体を確認し、理由を把握してください。フラグについては CLI コマンドを、より広い診断フローについてはトラブルシューティングを参照してください。
最終更新日 2026年8月12日