AIコーディングエージェントの sandbox 隔離と権限運用(Claude Code と他社比較)¶
作成日: 2026-07-24 出典 / きっかけ: m3tech blog「Claude Code のサンドボックス機能を試してみた」を起点に、Claude Code の sandbox が自分の
~/.claude運用に転用できるか+他社(Codex/Cursor/Copilot/Devin/Aider)はどう隔離しているかを deep-research ハーネスで調査 関連: ai駆動開発ループ_interview-dev-loop_整理 / cursor_agent_swarm_planner_worker経済性_整理
0. 要点(3行)¶
- 本質は「約束(軸A)と檻(軸B)は別レイヤ」。allow/ask/deny や hook は"自分で自分を縛る約束"で抜け穴が出る(
headで deny 回避、Cursor の denylist 突破が実例)。sandbox は OS カーネルが外から縛る"檻"で、プロセスが自分で外せない。強さは「物理だから」でなく「縛る主体が bash より上位(OS)だから」。 - 業界の収束点は 3点セット: ①OS ネイティブ sandbox(Seatbelt / bubblewrap / Landlock+seccomp)②allowlist-first の egress(deny > allow・デフォルト遮断)③段階承認(read-only → workspace-write → 危険モードは隔離内のみ)。Claude Code と OpenAI Codex がほぼ同型、Devin は VM レベル隔離、Copilot は Actions 隔離+人間ゲート。
- 設計順序は「環境層で封じ込め → モデル層で操舵」(Anthropic)。モデル層(classifier 等)は 100% にならないので単独では使わない。自分の個人運用(macOS・launchd headless loop・Playwright/MCP 併用)だと、MCP/Playwright を使う無人作業だけが組込み sandbox の"檻の外"に残る穴。
1. 2つの軸(これを混同しない)¶
権限制御は独立した2軸でできている。
| 軸 | 何を縛るか | 縛る主体 | 例 | 破れるか |
|---|---|---|---|---|
| 軸A: 約束 | いつ人間に聞くか/何を通すか | アプリ(エージェント自身) | allow / ask / deny、PreToolUse hook | 抜け穴があれば抜ける |
| 軸B: 檻 | 何に物理的に触れるか | OS カーネル | sandbox(Seatbelt / bubblewrap / Landlock+seccomp) | プロセスは自分で外せない |
- 軸A の deny は「自分で自分に誓う」→ 同じプロセスが縛る側でもあるので見落とし=抜け穴になる。
- 軸B は「親(OS)が子(bash)を部屋に閉じ込めて鍵をかける」→ 子はどんな小細工をしても OS のシステムコール拒否に撥ねられる。
- 強さの序列: ①アプリのルール(hook/deny)< ②OS カーネル(sandbox)< ③ハードウェア(TPM 等)。sandbox は②。物理ではなく「OS 製の、外からしか外せない南京錠」。
Claude Code の権限評価順と bypassPermissions の誤解(訂正済)¶
- 評価順(Agent SDK): Hooks → Deny → Ask → Permission mode → Allow → callback。
- deny と ask は
bypassPermissionsを含む全モードで効く。逆に無効化されるのはallowの方(他が全部承認済みになり事前承認が無意味化するため)。 - 「deny は bypass では負ける」と読める記述は誤り(自分の CLAUDE.md にあった誤記を 2026-07-24 に訂正)。出典 code.claude.com/docs/en/permission-modes「These controls apply in every mode, including bypassPermissions」。
2. Claude Code(Anthropic 公式・3票検証通過)¶
設計思想¶
- 「まず環境層(檻)で封じ込め、その次にモデル層(賢さ)で操舵する」。モデル層防御は決して 100% にならないので単独では成立しない。出典 how-we-contain-claude。
- 定量効果(Anthropic 自己申告・第三者監査ではない): サンドボックス導入で権限プロンプト 84% 削減、auto モードの classifier が行き過ぎた挙動の約 83% を実行前に阻止(≒17% はすり抜ける)。
隔離は二段構え¶
| 組込み Bash サンドボックス | @anthropic-ai/sandbox-runtime (srt) | |
|---|---|---|
| 包む範囲 | Bash ツールだけ | file / hook / MCP 含むプロセス全体 |
| 実装 | macOS=Seatbelt(sandbox-exec) / Linux・WSL2=bubblewrap | 同じ OS primitive・コンテナ不要 |
| FS 既定 | 書込=cwd+temp のみ / 読取=マシン全体(denyRead 除く) | 書込・通信とも全 deny(起動前に要設定) |
| network | プロキシ経由・deny-by-default・新ドメイン都度承認 | allow-only(許可ドメインリスト検証) |
限界(公式明記): 組込み sandbox は Bash 限定。Read / Write / WebFetch / MCP / hook は檻の外(軸A の permissions に依存)。プロセス全体を包むには srt か devcontainer が要る。
権限6モードの構え分け(公式指針)¶
| 文脈 | 推奨 | 理由 |
|---|---|---|
| 対話・長タスク | auto | classifier が安全チェック → プロンプト 84% 減 |
| 無人 CI/headless | allowlist + dontAsk | 入力待ちで固まらず allowlist 外は即 deny |
| YOLO(bypass) | コンテナ/VM/srt の中だけ | プロンプトインジェクション保護ゼロ |
- auto-allow モード(sandbox 境界が承認を代替): 箱に収まる Bash は聞かず自動実行。classifier ベースの auto モードとは別系統で併用可。
- classifier は tool result を遮蔽して見る(汚染ファイル/Web が classifier を直接操作できない)+サーバ側 probe が受信 tool result をスキャン。
- devcontainer は default-deny iptables firewall で未承認 egress を遮断 → これが
--dangerously-skip-permissionsでの無人作業を成立させる。
3. 他社比較¶
確信度を分けて記載する(今回 round2 は途中でセッション上限に当たり、Cursor/Copilot の検証は未完=反証されたのではなく検証が回せなかった)。
3-1. OpenAI Codex(検証済・高確信)— Claude Code とほぼ同型¶
- OS ネイティブ sandbox: macOS=Seatbelt(
sandbox-exec)、Linux=bubblewrap(bwrap)+seccomp。 - FS は Landlock で全体 read-only +
writable_rootsに挙げたパスだけ書込可(/dev/null除く)。 - network は seccomp で
connect/bind/listen/sendto等の syscall を遮断、socket 生成はAF_UNIXのみ許可(ローカル IPC は生きる)。 - network はデフォルト off。有効化は
network_access = true([sandbox_workspace_write])を明示。 - egress は allowlist-first で deny > allow、exact host + wildcard、DNS/IP 分類で DNS rebinding を緩和。
- 承認は read-only / workspace-write(Auto) / danger-full-access(
--yolo, sandbox なし・非推奨) の階層。 - → Claude Code と設計思想が非常に近い(OS primitive + allowlist egress + 段階承認)。Claude Code は Bash 限定なのに対し、Codex は Landlock で FS も締める点が違い。
- 出典 developers.openai.com/codex/agent-approvals-security。
3-2. Cursor(出典付き・検証未完 / 要再検証)¶
- ローカルは OS ネイティブ sandbox を持たない。agent はユーザー権限で動く(境界なし)。強い隔離は Cloud/Background Agents(Cursor の AWS 上の隔離 VM=Ubuntu)に寄せる方針。
- egress: 3モード(allow all / default+allowlist / allowlist-only)。承認: Run Modes(Auto-review 既定 / Allowlist / Run Everything)。
- Background Agent は全コマンド自動実行で、プロンプトインジェクションによる情報漏洩リスクを Cursor 自身が明記。
- 教訓(重要): 旧 Auto-Run は denylist ベース。Backslash 研究が base64 難読化 / subshell / スクリプト化 / クオート回避(
"e"cho)の4手で回避可能と実証 → Cursor は 1.3 で denylist を廃止。 - 文字列ベースの denylist は原理的に破れる。自分の deny 安全網(軸A)も denylist 一本足では不十分で、軸B の檻が要る、を裏付ける実例。
- 出典 cursor.com/docs、GHSA-82wg-qcm4-fp2w、backslash.security。
3-3. GitHub Copilot coding agent(出典付き・検証未完)¶
- 隔離された ephemeral な GitHub Actions 環境で実行。configurable firewall で internet 制限(admin がカスタム/無効化可)。
- 人間ゲート: CI/workflow は「人間が Approve and run workflows を押すまで走らない」。
- push は 単一ブランチ(
copilot/*)のみ、任意 git コマンド不可。 - → 「CI は人間が承認を押すまで走らない」は、自分の issue → PR フロー(approved 入口ゲート) と同じ発想。
- 出典 docs.github.com/copilot。
3-4. Devin / Cognition(出典のみ・未検証)¶
- 「未信頼コードは VM レベル隔離が業界コンセンサス(各ワークロードが自前カーネルを持ち共有攻撃面がない)」と明言。クラウド前提の最も重い隔離を選ぶ立場。出典 cognition.com/blog。
3-5. Aider(OSS・出典のみ・未検証)¶
- ローカル実行。
--yes-always(AIDER_YES_ALWAYS)で全確認を自動 yes、非対話ワンショット可。隔離は Docker 推奨のガイダンスにとどまり、OS ネイティブ sandbox は自前で持たない。出典 aider.chat/docs。
比較早見表¶
| エージェント | 隔離技術 | 既定の egress | 承認モデル | 危険モードの置き場所 |
|---|---|---|---|---|
| Claude Code | Seatbelt / bubblewrap(Bash限定)+ srt でプロセス全体 | deny-by-default プロキシ | 6モード(auto / dontAsk 等) | コンテナ/VM/srt 内のみ |
| OpenAI Codex | Seatbelt / bubblewrap + Landlock + seccomp | off(要 network_access) | read-only / workspace-write / --yolo | 隔離前提・--yolo 非推奨 |
| Cursor | ローカルは檻なし/Cloud は VM | allow all〜allowlist-only | Auto-review / Allowlist / Run Everything | Cloud VM に寄せる |
| Copilot agent | GitHub Actions 隔離環境 | configurable firewall | 人間が Approve を押すまで CI 不可 | Actions 隔離+人間ゲート |
| Devin | VM レベル隔離(自前カーネル) | クラウド管理 | クラウド前提 | VM そのものが檻 |
| Aider | 自前なし(Docker 推奨) | 制御なし | --yes-always で全自動可 | Docker を自分で被せる |
4. 自分の個人運用(macOS・launchd headless loop・Playwright/MCP 併用)への転用¶
| 場面 | 推奨 | 補足 |
|---|---|---|
| 対話セッション | 組込み sandbox enabled + auto-allow + auto モード。bypass は使わない |
現方針(acceptEdits・bypass 不使用)と整合 |
| launchd の headless loop | allowlist + --permission-mode dontAsk |
入力待ちで固まらない。外向き確定操作は ask/hook でゲート |
| MCP/Playwright を使う無人作業 | srt でプロセス全体を包むか devcontainer 内で回す | ここだけ組込み sandbox の外=唯一残る穴 |
| network | deny-by-default + allowedDomains 明示。deny/hook を最終安全網(bypass でも効く) | Codex の allowlist-first と同じ発想 |
具体アクション(→ claude-config #67 に紐付け)¶
- Phase 1(低リスク):
sandbox.enabled: true+filesystem.denyRead(~/.ssh~/.aws~/.gnupg.env系)。承認フローは変えず、秘密読取を OS 層で二重化(block-secret-file-reads.shhook=軸A を sandbox denyRead=軸B で裏打ち)。Cursor の denylist 突破が"軸A だけでは足りない"根拠。 - Phase 2:
autoAllowBashIfSandboxed: true+network.allowedDomains(github.com / npmjs.org / pypi / 1Password / Anthropic API)。allowlist の実質縮小を測る。 - Phase 3: 代表 loop 1本を sandbox 有効の
dontAskで完走。failIfUnavailableの扱いを決める。
5. まとめ — いつ何を使うか¶
| 状況 | 推奨アプローチ |
|---|---|
| ローカル対話で承認疲れを減らしたい | 組込み sandbox + auto-allow(箱内は自動・境界越えだけ承認) |
| 秘密ファイルを絶対読ませたくない | sandbox denyRead(軸B・カーネル層)。hook(軸A)は予備 |
| MCP/Playwright を無人で回す | srt か devcontainer でプロセス全体を包む(組込み sandbox は Bash 限定で不足) |
| 未信頼コードを本気で隔離 | VM レベル(Devin 方式)。ローカルなら Lima VM + 最低権限ユーザーも実務解 |
| CI/自動 PR の暴発を防ぐ | Copilot 式「人間が Approve を押すまで実行しない」ゲート(=approved 入口ゲート) |
| denylist で守ろうとしている | やめる。文字列 denylist は base64/subshell 等で破れる(Cursor 実証)。allowlist か OS 檻へ |
一言: 各社の答えは「モデルを賢くして防ぐ」ではなく「環境(OS/VM)で物理的に封じ込めてから、モデルで操舵する」に収束している。自分の運用も、軸A(hook/allowlist)の上に軸B(sandbox の檻)を1枚足すのが次の一手。
未検証・要フォロー¶
- Cursor / Copilot の主張はセッション上限で敵対的検証が未完(反証ではない)。出典自体は各社公式 docs なので信頼度は中〜高だが、3票検証は別途回す。
- Devin / Jules / Aider は verify バッチに載らず出典どまり。
- 日本企業の一次事例は m3(既読ブログ)のみ。他社の社内展開事例は未収集。
- 数値(84% 減・83% 阻止)は Anthropic 自己申告で第三者監査ではない。
参考リンク¶
- Anthropic「How we contain Claude」: https://www.anthropic.com/engineering/how-we-contain-claude
- Claude Code sandboxing: https://code.claude.com/docs/en/sandboxing
- sandbox-environments: https://code.claude.com/docs/en/sandbox-environments
- permission-modes: https://code.claude.com/docs/en/permission-modes
- devcontainer: https://code.claude.com/docs/en/devcontainer
- @anthropic-ai/sandbox-runtime: https://github.com/anthropic-experimental/sandbox-runtime
- OpenAI Codex — agent approvals & security: https://developers.openai.com/codex/agent-approvals-security
- Cursor docs(agent security / cloud-agent): https://cursor.com/docs/agent/security
- Cursor Auto-Run denylist 突破(Backslash): https://www.backslash.security/blog/cursor-ai-security-flaw-autorun-denylist
- Cursor security advisory GHSA-82wg-qcm4-fp2w: https://github.com/cursor/cursor/security/advisories/GHSA-82wg-qcm4-fp2w
- GitHub Copilot coding agent — risks and mitigations: https://docs.github.com/en/copilot/concepts/agents/cloud-agent/risks-and-mitigations
- Cognition「What we learned building cloud agents」: https://cognition.com/blog/what-we-learned-building-cloud-agents
- Aider docs: https://aider.chat/docs/scripting.html
- m3tech blog(きっかけ): https://www.m3tech.blog/entry/claude-code-sandbox
作成: 2026-07-24 / 最終更新: 2026-07-24