Skip to main content
これは技術 sequence の最後のページです。新しい動作は追加せず、アーキテクチャ解析エンジンが規定する内容の理由と tradeoff を説明します。何が起きるかを知るには、先にそれらを読んでください。なぜ起きるかを知るには、このページを読んでください。 CC Safety Net は、AI コーディングエージェントが home directory 全体を削除した実際の incident を受けて構築されました。すべての設計判断は 1 つの目標に基づきます。エージェントが破壊的コマンドを実行するに阻止し、誤った安心感を与えないことです。

Wildcard pattern より semantic analysis

コーディングエージェントは、git reset --hard に対する wildcard rule など、wildcard matching を使う deny rule に対応します。wildcard pattern は raw command string と pattern を比較するため、space、flag order、command wrapping の変化で block が静かに失敗する可能性があります。flag の並べ替え(rm -r -f /)、shell での wrapping(sh -c "rm -rf /")、interpreter の背後への隠蔽は、すべて string matching を回避します。 代わりに CC Safety Net は各 command を parse し、gitrmRemove-Itemfindxargsparallel の実際の option grammar を理解する analyzer に渡します。このため、判定は command の見た目ではなく、command が実行する動作に基づきます。 tradeoff は複雑さです。parser は shell syntax を正しく処理する必要があり、対応する各 command には独自の analyzer が必要です。利点は、最も重要な command に対する bypass resistance です。pipeline はアーキテクチャで、各 analyzer の正確な動作は解析エンジンで規定します。

常時有効な保護を先に置く 1 つの固定順序

すべての連携で、各ツール呼び出しは同じ順序付き stage を通ります。そのうち 2 stage(canonical policy file と Git metadata の保護)は、意図的に policy snapshot の読み込みに実行します。 この順序が重要です。設定後に評価する保護の強さは設定に依存し、侵害されたエージェントが最初に編集しようとするのは設定だからです。policy file を読み込む前に拒否することで、この 2 guard は config state を持たず、preset や override で緩和できず、保護対象の file 自身で無効化できません。その代わり、safety level と fallback reason はまだ不明なため、denial で報告できません。これは unconditional guarantee のために diagnostic detail を減らす意図的な tradeoff です。 Sensitive-path protection は snapshot の後にあります。これは policy で制御できます。どの path を sensitive とするかは実際に local decision であり、独自の deny path を追加できなければ役に立たないためです。 具体的な stage table はアーキテクチャにあります。

解析を完了できない場合は fail closed

CC Safety Net は解析を完了できない場合に、許可せずブロックします。
  • guard 内の throw error は、すべての entry point で、throw した stage に属する deny になります。
  • tool-input bound または parser budget の超過は、すべての safety level で deny になります。
  • Strict modeは fail-closed をさらに拡張し、parser が完全に理解できない command と検証できない destructive target を対象にします。
理由は明確です。fail open する safety net は、誤った安心感を与えるため、safety net がない場合より危険です。予期しない error での block は不便ですが復旧できます。destructive command の通過は復旧できません。 無効な設定は意図的にこの対象ではありません。 拒否された configuration source は deny に変換せず drop します。rulebook の typo だけで machine が全作業を block すると、ユーザーに対する denial-of-service になり、file の修正ではなく tool の uninstall を促すためです。設定の復旧が、その contract と修復手順を定めます。 各 trust boundary での適用方法はセキュリティモデルを参照してください。

エージェントが作業を続けられる denial

denial は error state ではありません。active session で通常の tool result としてエージェントに届きます。この動作が、各 block message の書き方を決めます。 単なる「permission denied」は、エージェントに類似 command を再試行させるか、task 全体を停止させる可能性があります。variant の反復は未保護の形式を見つけ、agent turn を消費する可能性があります。task 全体を止めると、1 つの safety action が作業停止になります。 そのため、各 message はエージェントに生産的な次の操作を渡すよう構成します。reason は command が実行したはずの動作を平易に示し、安全な代替がある場合はその名前を示します。各 rule には、closing instruction を選択する intent もあります。block を報告して task の残りを続行する、指定した代替に切り替える、狭い明示 target で再試行する、操作をユーザーに渡す、variant の総当たりではなく command を再構成する、のいずれかです。internal error の fail-closed denial にも intent(retry せず再構成)があるため、tool 自身の予期しない failure でも、有用な response へ導きます。 instruction は意図的に advisory です。エージェントに強制はしません。enforcement は guard が行い、従わない retry も同じように block します。message の目的は compliant path を最も簡単にすることです。このため通常は、session が block を吸収して続行します。message の構造と完全な intent table は仕組みを参照してください。

最小限の dependency surface

CC Safety Net は runtime dependency surface を遅延読み込みする 1 package に保ちます。segment splitting、quoting、redirection、command substitution、dynamic-word provenance という構造情報はすべて、third-party grammar ではなく独自の上限付き POSIX parser と PowerShell parserから取得します。これは意図的な build-versus-buy decision です。
  • 小さい dependency tree は supply-chain attack surface を縮小します。parser は攻撃者が最も混乱させたい構成要素です。
  • analysis には一般的な tokenizer が保持しない fact が必要です。どの word が expansion 由来か、どの target が working directory に固定されるか、どの quoting form が使われたかです。owned parser だけが、これらを first-class fact にできます。
  • parser budget を configuration ではなく fixed constant にできるため、resource exhaustion は open-ended problem ではなく、上限付きで test 可能な failure mode になります。
  • CC Safety Net を hook subprocess として実行するエージェントでは、shell tool call ごとに新しく開始するため startup time が重要です。dependency が少ないと cold start が速くなります。
parser budget と各 dependency の使用方法はアーキテクチャを参照してください。

Rulebook system

以前の version は、custom rule を 1 つの project file に inline JSON として保存しました。CC Safety Net は、4 つの理由で rulebook system に置き換えました。
  • 共有:rulebook は GitHub repository から取得し、lockfile の SHA-256 digest で固定できるため、team は JSON を copy-paste せず blocking policy を共有できます。
  • Integrity:remote rulebook content は使用前に lockfile digest に対して検証します。inline config には integrity の仕組みがありませんでした。
  • Scoping:rulebook は、別々の config directory を持つ user(global)scope と project scope に対応します。
  • Validation:rulebook content は、blocking decision に影響する前に schema validation を受けます。
custom rule は厳密に additive です。制限を追加することだけができ、built-in protection を緩和できません。これにより trust boundary が簡潔になります。authoring workflow はカスタムルールを参照してください。

1 設定ではなく段階的な level

保護は単一の on/off switch ではなく、standard、strict、paranoid の 3 preset として提供します。「検証できない command を block すべきか」への正しい答えは、command の source によって異なるためです。 Standard は、人間が監督する session 向けに最適化しています。認識できる destructive command と sensitive-content access を block し、parse できないが無害な text は許容するため、日常作業を中断しません。敵対的または動的な input に対しては明示的に best-effort であり、prompt injection や他の信頼できない context から command が来る場合には適しません。 Strict と paranoid は摩擦と引き換えに確実性を高めます。Strict は検証できないものを block し、paranoid は通常は問題ないが時に壊滅的な category も block します。この設計は、standard-mode parser heuristic の追加によって standard の gap を閉じようとはしません。静的に解決できない target は、推測を増やしても安全にはならないためです。新たな gap への所定の対応は、strict または paranoid の fail-closed fixture です。このため、standard mode の residual-risk family を隠さず記録します。 個別 capability は別々に設定でき、rule ごとの override で standard 下でも strict-tier rule を強制できます。ただし、catastrophic rule または always-on protection を override で弱めることはできません。level はモード、各 boundary の正確な位置は解析エンジンを参照してください。

代替ではなく多層防御

CC Safety Net は完全な security solution とは主張しません。多層防御 stack の 1 layer と位置づけます。
  • Permission deny rule は、迅速でユーザー設定可能な block を提供します。CC Safety Net は permission system のに実行するため、deny rule の設定に関係なく各 command を検査します。
  • OS-level sandboxing は filesystem と network access を制限しますが、その境界の操作が destructive かは理解しません。sandboxed directory 内の git reset --hard は sandbox の視点では技術的に安全ですが、依然として危険な操作です。
これらを併用してください。deny rule は迅速な iteration、sandboxing は未知の threat と containment、CC Safety Net は既知の destructive pattern に対する bypass-resistant protection を担当します。CC Safety Net とサンドボックスを参照してください。

Worktree relaxation

linked git worktree には usability problem があります。worktree で作業する developer は、その worktree の local change を破棄するために git checkout -- . または git reset --hard を実行したい場合がありますが、default rule は local-discard operation として block します。 rule 全般を緩和する代わりに、worktree modeは local discard だけを、linked worktree と確実に検証された directory 内だけで、かつ git context が redirect されていない場合だけ許可します。verification が設計を支える要素です。worktree のように見えるだけの directory は対象外で、check を完了できない場合は command を block したままにします。 この緩和は意図的に狭くしています。remote-affecting operation(force push、branch delete、stash drop)はすべて block のままです。使い捨て worktree の外へ到達できる local discard も block します。正確な条件と緩和不能な場合は解析エンジン、mode の有効化方法はモードを参照してください。

次に読むページ

技術ガイドは、ユーザー向け lifecycle から設計理由まで順に説明します。このページは最後の step 5 です。
  • 前:解析エンジン:これらの tradeoff から生じる正確な classification behavior。アーキテクチャ:それらが正当化する guard order。
  • 最初から:仕組み:同じ system をユーザー向けの深さで説明します。
関連ページ:セキュリティモデル:これらの decision が保護する trust boundary。既知の制限:対応できない範囲。設定の復旧:上記の ready / degraded contract。
最終更新日 2026年8月12日