コンテンツにスキップ

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 は seccompconnect/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-alwaysAIDER_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 に紐付け)

  1. Phase 1(低リスク): sandbox.enabled: true + filesystem.denyRead~/.ssh ~/.aws ~/.gnupg .env 系)。承認フローは変えず、秘密読取を OS 層で二重化(block-secret-file-reads.sh hook=軸A を sandbox denyRead=軸B で裏打ち)。Cursor の denylist 突破が"軸A だけでは足りない"根拠
  2. Phase 2: autoAllowBashIfSandboxed: true + network.allowedDomains(github.com / npmjs.org / pypi / 1Password / Anthropic API)。allowlist の実質縮小を測る。
  3. 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