CASE · 軽微 · tool-misuse
検証済み運営者の一次記録--allowedTools で絞ったつもりが、全体設定の許可がそのまま残っていた
修正を任せる子エージェントを --allowedTools で限定したつもりだったが、許可リストに無い whoami が通った。範囲を指定しない Write は、作業用の worktree の外にも書けた。
約2分で読めます
- 発生日
- 分類
- tool-misuse
- 影響範囲
- data
- 検知
- manual-observation
- タグ
- #claude-code #permissions #allowed-tools #sandbox #isolation #worktree
CH 1
原因
--allowedTools は、ユーザー全体の設定にある広い許可を打ち消さなかった。働きは「ここまでに限る」ではなく、全体の許可に「これも確認なしで通す」を足す方向だった。
CH 2
結果
本番で使う前、使い捨てのリポジトリで隔離を実測していて気づいたため、実害はない。そのまま使っていれば、修正係のエージェントが対象の外のファイルを書き換えられる状態だった。
CH 3
対策
--setting-sources "" で全体設定を読ませず、Edit と Write を worktree のパスに限定し、sandbox を有効にした。コミットは隔離の外でサーバーが行い、push は二重に遮断した。隔離は、効いていることを実測するまで信じない。
何が起きたか
自作のマルチエージェント・キャンバスに、調査で見つかった問題を直す「修正係」を
足そうとしていた。修正係は claude -p で起動する子エージェントで、対象の
リポジトリとは別の git worktree の中だけで作業させる設計だった。
渡す道具は --allowedTools で絞った。読むこと、worktree の中を編集すること。
それ以外はさせないつもりだった。
現場の混乱
本番で使う前に、使い捨てのリポジトリで隔離が本当に効くかを試した。
許可リストに入れていない whoami が通った。範囲を指定しないで許可した Write は、
worktree の外にもファイルを書けた。設定の上では閉じているはずの扉が、
実際には開いていた。
原因
--allowedTools は、ユーザー全体の設定(~/.claude/settings.json)にある
広い許可を打ち消さなかった。普段の対話作業のために許していたものが、
子エージェントにもそのまま引き継がれていた。
このオプションは「ここまでに限る」柵ではなかった。全体の許可の上に 「これも確認なしで通す」を足す働きだった。名前から受ける印象と、 実際の向きが逆だった。
対策
--setting-sources ""を付け、全体設定を読ませないようにした。- Edit と Write は
Edit(//<worktreeのパス>/**)の形で、作業場所に限定した。 - sandbox を有効にした。sandbox の下では許可リストに無い Bash も動いたが、 ネットワークに出られず、作業場所の外にも書けないことを実測した。
- コミットは修正係ではなく、終了後にサーバーが隔離の外で行う。push は 拒否ルールと、そのプロセスに限った push 先の無効化で二重に止めた。
教訓はひとつ。隔離は書いた設定ではなく、実際に破れないことを確かめて初めて 効いていると言える。
出典
- 運営者自身が起こした事故の一次記録です。外部に公開された元記事はありません。
この記録をチームに回す