Claude Code Max Planでauto modeを再現するclawd-seatbeltを作った
2026年 04月 11日 土曜日
モチベーション
Claude CodeのTeam planには auto mode という、ツール実行の安全性をLLMが事前判定してくれる機能がある。
しかしMax planでは今のところauto modeが提供されていないので、相当する実装 clawd-seatbelt を自作することにした。
設計
すべてのツール呼び出しを3段階のパイプラインで判定する。
Claude Codeを --dangerously-skip-permissions で利用しつつ、PreToolUseフックで自作の事前判定機構をかませてツールの実行を制御する。
設計はAnthropicのauto modeのブログ記事 Auto mode for Claude Code を参考にしている。
bunを使ってシングルバイナリとしてbuildし、PreToolUseフックで呼び出す。
判定の大まかな流れは以下の通り。
Tier 0: Static Allow → 読み取り専用は即座に許可 (例: ls, git status, Read)
Tier 1: Static Deny → 既知の危険パターンは即座に拒否 (例: cat ~/.ssh/id_rsa, rm -rf /)
Tier 2: LLM Classifier → 曖昧なケースはLLMが判断 (例: git commit, npm install)Tier 0: 高速パス
明らかに安全な操作はLLMを呼ばず即座に許可する。作業の大半はここを通るのでオーバーヘッドはほぼない。 ただし読み取りコマンドでも機密ファイルを参照しているケースや、パイプ・リダイレクトを含む複合コマンドは後段に回す。
Tier 1: ルールベース拒否
機密ファイルへのアクセスや破壊的コマンドを正規表現で即座に拒否する。 破壊的コマンドの判定には cc-safety-net のルールを活用させてもらっている。
Tier 2: LLM判定
残りのケースを claude -p (Sonnet) で判定する。
auto modeの設計原則に倣い、Claudeの思考過程は分類器に渡さない(Reasoning-blind)。
プロンプトインジェクションでClaude本体が騙されていても、分類器は独立した判断を下せる。
渡された情報にインジェクションを行うワードが入っている可能性があるため、多少インジェクション対策もしている。
エスカレーション
deny判定が続くと段階的に警告を強め、最終的にユーザー介入を強制する。 機密ファイルへのアクセス拒否が短期間で繰り返された場合は即座にユーザー確認を強制する。
感想
実際に --dangerously-skip-permissions で運用してみると、auto modeと差がわからない。
anthropicのauto modeはみんなが使ってるので、攻撃者がインジェクションできるワードの組み方を見つけると突破される可能性があるが、
オレオレauto modeは自分しか実装を知らないので、実は安全な可能性がある。
自分が使いやすいように、特定のディレクトリのパーミッションレベルを制御できる機能なども実装していて、まぁまぁ使いやすい。
課題
OSSとして配布できない
clawd-seatbeltのTier 2分類器は内部で claude -p を呼んでいる。
公式CLIバイナリを自分のスクリプトから呼ぶのは個人利用の範囲で許可されているが、この呼び出しを行うアプリケーションを第三者向けに配布することは認められていない。
分類精度
今のところ問題は起きていないが、攻撃検査はauto modeほどしっかりできていないと思うので、なんとも言えない。
一応判定のログをとっていて、いい感じに判定されていることだけ確認している。
気合いを入れて作ろうと思うと、壊れてもいい環境を用意する必要がある。
パーミッションチェックの抜け穴
Claude Codeのソースは一応非公開なので、すべての危険な原因になる操作がPreToolUseフックを経由するかなんとも言えない。
個々のステップが安全でも組み合わせると危険になるケース(無害なスクリプトを書いてから実行する等)など、手の込んだ攻撃は突破される可能性がある。
auto modeの方がケアされているパターンは多いはずだが、--dangerously-skip-permissions のまま運用するよりは安全なはず。
弊社はほぼ全員Team planなのでauto modeを使えると思うが、Max Planを使っている人や追加のパーミッションチェックを作ってみたい人は参考にしてみてください。