AIエージェントの権限設計は、誰かが意図して広げた瞬間より、絞らなかった既定値のまま気づかず動く場面で壊れます。本記事は、調査目的で走らせたサブエージェントが指示していないファイルを書き込んだ社内の実際の事故を、症状・誤診・真因の順で追います。根拠は公式ドキュメント5件と、社内の実測記録です(計測日2026-07-29)。
01何が起きたか|AIエージェントの権限設計が試された書き込み事故
2026-07-28 11:13、WEBMARKSは調査目的のワークフローをサブエージェントに走らせました。指示は「資料を読んで内容を要約し、結果を返すだけ」という読み取り専用の作業です(出典: 社内リポジトリ git commit 60e639be の実測)。
このサブエージェントは、指示していない図解SVGファイルを生成し、ディスクへ保存しました。生成物はAGIM-701-01.svg(5,333バイト・viewBox 800×450)と、キャプション情報のcaptions.jsonの2点です。
内容を検証したところSVG自体は壊れておらず、『AIエージェントとは|そう呼べる3条件と、呼べない境界』の1枚目の図解として後日採用されています。それでも「読むだけの指示で、なぜ書き込みが実行できたのか」という問いは、検証を終えたあとも残りました。
被害が軽微だったのはたまたまです。書き込まれる先が納品済みフォルダや送信キューだった場合、検証してから採用する猶予はありません。AIエージェントの権限設計では、事故の大小より「なぜ止まらなかったか」を先に見るべきです。
02最初に疑ったのは、権限設計を広げすぎたという誤診だった
この記録を最初に見たとき、浮かびやすい説明は「権限設計のどこかを広げすぎた」というものです。誰かが承認ルールを緩め、書き込みを許可する設定を増やしたのではないか、という見立てです。
この見立てには理由があります。Claude Codeには、確認なしで承認を進めるモードが複数あります。既定のdefaultのほかacceptEdits・auto・bypassPermissionsなど、合わせて6モードあります(出典: Claude Code公式ドキュメント)。どれか広いモードで動かしていたのではと疑う余地は、確かにありました。
しかし社内記録には、この呼び出しの直前に権限モードや許可ルールを変更したというログが残っていません。台帳に残っているのは「読むだけの指示だったのに書き込みが起きた」という結果だけです。
| 論点 | 誤診(最初の見立て) | 記録から言えること |
|---|---|---|
| 何が起きたか | 承認ルールをどこかで意図的に緩めた | 変更ログは無く、既定の書き込み権限がそのまま残っていた |
| 疑った根拠 | 自動承認モードが6種類あり、広い方を使えば説明がつく | モード選択の記録自体が残っていない |
| 対策の向き | モード設定を1つずつ点検する | 個々のモードより、既定値の絞り込み手順を見直す |
「広げた」という能動的な操作の記録が無いまま「広げすぎた」と結論づけるのは早計でした。広がっていたのは設定ではなく、絞らなかった既定値だったからです。
03書き込み事故の本当の原因は、権限設計を広げたのではなく絞っていなかったこと
Claude Codeの権限は3層に分かれます。読み取り専用の操作は作業ディレクトリ内なら承認不要です。Bashコマンドは組み込みの読み取り専用コマンドを除き承認が要ります。ファイルの編集・書き込みは常に承認が要ります(出典: Claude Code公式ドキュメント)。
問題は3層目、ファイル書き込みの扱い方にありました。サブエージェントの定義にはtoolsという項目があり、そのサブエージェントが使えるツールを絞り込めます。公式ドキュメントは、この項目を省略すると全ツールを継承すると明記しています(出典: Claude Code公式ドキュメント)。読み取り専用に絞りたい場合は、次のように明示的に書く必要があります。
---
name: investigate-only
description: 資料を読んで要約を返す。ファイルは作らない
tools: Read, Grep, Glob
---toolsを明示しなければ、WriteやEditを含む既定の全ツールプールがそのまま渡ります。今回の呼び出しがこの項目をどう設定していたかは、台帳に記録が残っていません。それでも、症状と一致する既定挙動が公式ドキュメントに明記されている以上、最有力の説明として扱えます。
最小権限の原則は、この種の事故を防ぐ情報セキュリティの基本概念です。OWASPは、ユーザー・プロセス・プログラムには役割に必要な最小限のアクセス権だけを与えるべきだと説明しています(出典: OWASP公式)。NISTのSP 800-53 Rev.5も同様に、必要最小限の権限だけを与える設計だと定義しています(出典: NIST用語集)。
権限設計の失敗は、多くの場合「広げた記録」ではなく「絞らなかった空白」として残ります。
04指示文で塞いだ範囲と、権限設計として残った宿題
WEBMARKSがこの事故のあとに実施した対応は、調査系ワークフローの指示文に「読んで返すだけ・ファイルを作らない」という一文を明記することでした。内容を検証したうえでSVG自体は採用し、運用ルールの側を直す判断です。
この対応には限界があります。Claude Codeの公式ドキュメントは、権限ルールを強制するのはClaude Code自身であり、モデルではないと明記しています。プロンプトやCLAUDE.mdの指示は、Claudeが何をしようとするかを形づくります。ただし、Claude Codeが何を許可するかは変えません(出典: Claude Code公式ドキュメント)。
つまり「ファイルを作らない」という指示文は、モデルの振る舞いを導く一文であって、書き込みツール自体を使えなくする境界ではありません。境界として機能するのは、toolsの絞り込みやdisallowedToolsの指定、あるいはツール呼び出し直前に発火するPreToolUseフックです。
| 対策の種類 | 具体例 | 強制力 |
|---|---|---|
| 指示文(プロンプト・CLAUDE.md) | 「読んで返すだけ・ファイルを作らない」を明記 | モデルの振る舞いを導くのみ。ツール自体は使える |
| 権限設計(tools/disallowedTools) | tools: Read, Grep, Globで明示的に絞る | Claude Code自身がツールをその場から外す |
| PreToolUseフック | 書き込み系ツールにdenyを返すスクリプトを登録 | ツール呼び出しの直前で機械的にブロックする |
今回の記録に残っているのは、表の1行目までです。2行目・3行目に相当する技術的な歯止めまで踏み込んだかどうかは、この記録の範囲では確認できません。指示文の追加は無意味ではありませんが、権限設計としては応急処置にとどまります。
05AIエージェントの権限設計を最小権限から段階的に広げる仕組み
権限設計を最小権限から段階的に広げる考え方を、仕組みとして運用に落とし込むには次の4点が要ります。
- 役割ごとに
toolsを明示する:調査・要約だけを担うサブエージェントにはtools: Read, Grep, Globのように読み取り系だけを渡す。書き込みが要る役割にだけEdit・Writeを足す disallowedToolsで引き算する選択肢を持つ:継承した全ツールから書き込みだけを外したい場合はdisallowedTools: Write, Editと書ける。禁止したい対象がはっきりしているときはこちらが速い- 送信・公開・削除は
PreToolUseフックで機械的に止める:判定はallow(許可)・deny(拒否)・ask(確認)・defer(委譲)の4値で返します。出典はClaude Code公式ドキュメントです。指示文ではなく、ここに歯止めを置く - 評価順序を前提に設計する:権限ルールは
deny→ask→allowの順で評価され、最初に一致したルールが結果を決めます。広いallowを先に書いても、denyルールがあれば書き込みは通りません(出典: Claude Code公式ドキュメント)
社内の承認ゲート設計は『AIエージェントの承認ゲート|送信・公開・削除で止める仕組み』にまとめています。今回の事故は、その承認ゲートより手前の権限設計の段階で起きました。
権限ルールの配分は『Claude Codeの権限設定|allow・ask・denyの配分と設定例』で扱っています。PreToolUseフックの書き方は『Claude CodeのPreToolUseフック|危険コマンド遮断のコード例』にまとめています。役割を分けてもtoolsを絞らなければ、今回と同じ空白が残ります。
同じVaultでは、更新時刻を根拠に成果物の所有者を誤認し、3日間で233回誤爆した障害も起きています(出典: 社内タスク台帳)。真因は別ですが、どちらも「既定のままにした空白」が事故を生んだ点は同じです。
WEBMARKSは2026-06-24に7部署30体のAI社員体制を統合しました。調査用の使い捨てワークフローにも本番と同じ書き込み能力が既定で渡る構成のまま、今回の事故は起きています。
06同じ失敗を避けるためのチェックリスト
- 新しいサブエージェント・ワークフローを作るとき、
toolsを役割に合わせて明示したか(省略すると全ツールを継承する) - 「読むだけ」「要約だけ」と説明する作業を、
tools: Read, Grep, Globのような読み取り専用の設定でも裏づけたか - 指示文(プロンプト・CLAUDE.md)だけを対策にして、権限設計としての歯止めを後回しにしていないか
- 送信・公開・削除にあたる操作は、
PreToolUseフックでdeny・askを返す設計にしているか - 権限ルールが
deny→ask→allowの順で評価されることを前提に、広いallowを先に置いていないか - 想定外の書き込みが起きたとき、「誰かが権限を広げた」という説明を裏づけるログを実際に確認したか
- 被害が軽微だった事故を「たまたま軽微だっただけ」として扱い、書き込み先が変われば重大化する前提で見直したか