本文へスキップ
メニュー
自分に必要?エージェントが手元のマシンで触れられるもの仕組みエージェントとシステムの間にある層比較組み込みサンドボックス、Docker、VM設定タスクに必要なものだけを開けるセキュリティ脅威モデルとその限界インストール
比較

エージェントにもサンドボックスはある。ただし守る範囲が違う。

組み込みサンドボックスと許可プロンプトは、モデルが実行するコマンドを見張ります。ai-jailは、エージェントというプログラム全体がマシン上で何を見られるかを決めます。両者は併用できます。

最終確認日は2026年9月21日です。他社製品は変化が速いため、それらに関する記述にはすべてベンダー自身のドキュメントへのリンクを付けています。

壁はどこにあるか

執筆時点で、Claude Codeのサンドボックスの対象はシェルコマンドとその子プロセスです。ファイル操作ツールのほうは許可システムで制御され、ドキュメントにはMCPサーバーとフックはホスト上で制約なしに動くと書かれています。ai-jailはエージェント自体を壁の中で起動するので、エージェントが起動するものもすべて中に入ります。

2枚のパネル。左では、組み込みサンドボックスが囲んでいるのはシェルコマンドだけで、エージェント、MCPサーバー、フックは壁の外にあり、ホームディレクトリへ線が伸びています。右では、ai-jailがエージェント、MCPサーバー、フック、シェルコマンド、プロジェクトをまとめて囲み、ホームディレクトリは外にあって暗く、格子がかかっています。
左のパネルはClaude Codeのドキュメントに基づいています。

Codexも、自分が起動するコマンドをサンドボックスに入れ、codexプロセス自体は外に残します。ローカルのMCPサーバーがどこで動くかは、ドキュメントに書かれていません。

許可プロンプトは別の種類の保護

プロンプトが尋ねる相手は人間で、人間は急かされたり騙されたりします。サンドボックスが尋ねる相手はカーネルで、答えは毎回同じです。

2枚のパネル。左では、エージェントから伸びる線が、「承認」ボタンの付いた承認ダイアログの重なりを通り抜けて、あなたの鍵に届きます。右では、同じ線が「カーネルのルール」と書かれた壁で止まり、その向こうの鍵は暗く、格子がかかっています。
プロンプトは役に立ちます。プロンプトはレビューの工程で、サンドボックスは境界です。

人間を外すモード

執筆時点で、以下のエージェントにはいずれも、確認を求めなくなるモードがあります。プロンプトがなくなれば、残る保護はサンドボックスだけです。それも、有効にしてあればの話です。

エージェントモードベンダーの説明による動作
Claude Codeautoすべてが実行され、別のモデルがあなたの代わりに操作を審査します。ドキュメントはこの分類器を操作ごとの制御であり、隔離の境界ではないと説明しています。
Claude CodebypassPermissions、または--dangerously-skip-permissionsすべてがチェックなしで実行されます。ドキュメントは、隔離されたコンテナやVMの中だけで使うよう求めています。
Codex CLI承認ポリシーneverエージェントは一切確認を求めません。サンドボックスモードは引き続き適用されます。承認とセキュリティを参照してください。
Codex CLIdanger-full-access、または--yoloサンドボックスが無効になります。--yoloでは承認もなくなります。

並べて比べる

ここに書いた内容はすべて、執筆時点の各製品のドキュメントに基づいています。私たちが読んだドキュメントに答えがなかった項目は、セルにそう記しています。

Claude CodeのサンドボックスCodex CLIのサンドボックスGemini CLIのサンドボックスai-jail
エージェント全体を包むラッパーで加わるもの
壁の中に入るものBash、PowerShell、Monitorのコマンドとその子プロセス。claudeプロセス、ファイル操作ツール、MCPサーバー、フックは外です。エージェントが起動するコマンド。codexプロセスは外です。ローカルのMCPサーバーについては記載なし。CLIのプロセス全体。security.toolSandboxingを使うと、シェルと書き込みツールだけになります。プロセスツリー全体。エージェント、ファイル操作ツール、MCPサーバー、フック、すべてのコマンドが入ります。
デフォルトで有効かいいえ。/sandboxsandbox.enabledで有効にします。依存するものが足りないと、警告を出してサンドボックスなしでコマンドを実行します。sandbox.failIfUnavailableを設定すれば、そうなりません。はい。デフォルトのモードはworkspace-writeです。-sGEMINI_SANDBOXtools.sandboxのいずれかで有効にします。ai-jail経由でエージェントを起動すれば、常に有効です。設定が不正な場合は起動を拒否します。
サンドボックス内のコードはデフォルトで~/.sshを読めるかはい。ドキュメントによると、デフォルトでは~/.aws/credentials~/.ssh/などの認証情報ファイルを読めます。拒否ルールはオプトインです。Linuxでは読めます。ファイルシステム全体が読み取り専用でマウントされるためです。拒否エントリはオプトインです。macOSのデフォルトは記載なし。macOSのデフォルトプロファイルpermissive-openは、広い範囲のファイル読み取りを許可します。より厳しいプロファイルはオプトインです。いいえ。エージェントには新しい空のホームディレクトリが渡されます。--sshはオプトインです。
環境変数サンドボックス内のコマンドは、デフォルトで親の環境を認証情報ごと引き継ぎます。sandbox.credentialsで拒否またはマスクできます。記載なし記載なしターミナル、ロケール、ツールチェーン用の変数だけの最小限の許可リスト。ほかの変数は--envで名前を指定して追加します。
モデルが使える抜け道モデルはdangerouslyDisableSandboxを付けてコマンドを再試行でき、その場合は通常の許可フローを通ります。allowUnsandboxedCommands: falseでこれを無効にできます。on-requestポリシーでは、ワークスペース外の編集やネットワークのために、エージェントがサンドボックスの外に出る許可を求めます。記載なしありません。ポリシーはエージェントの起動前にあなたが決めます。プロジェクト側の.ai-jailファイルは、ポリシーを厳しくできても緩めることはできません。
どのエージェントでも使えるかClaude CodeのみCodexのみGemini CLIのみどんなコマンドでも使えます。ポリシーファイル1つで、すべてのエージェントに対応します。
組み込みサンドボックスのほうが優れている点
ネットワークの扱いドメイン単位の許可リストを持つプロキシ。新しいドメインが出てくると確認を求めます。ドメインフロンティングで回避されうることは、ドキュメントにも書かれています。workspace-writeではデフォルトで無効。設定1つで有効になり、オプションのプロキシでドメイン単位の許可と拒否のルールを追加できます。デフォルトのプロファイルはネットワークを許可します。より厳しいプロファイルやプロキシ付きのプロファイルはオプトインです。全部かゼロかです。デフォルトでは無効で、--networkで全体が開きます。ドメイン単位のフィルターは、あえて備えていません。
コマンドごとの承認あり。許可モード、planモード、分類器モデル、組織で管理するポリシーがあります。あり。承認ポリシー、カテゴリ別のルール、オプションのレビュー用エージェントがあります。記載なしなし。ai-jailは個々のコマンドを見ることも、確認を求めることもありません。
プロジェクト内の保護されたパスあり。.git/hooks.git/config.claudeの設定、.mcp.json、シェルのrcファイルなどは読み取り専用のままです。あり。書き込み可能なルートの下にある.git.agents.codexは読み取り専用です。記載なし組み込みではなし。プロジェクト全体が書き込み可能です。パスのマスクや拒否は、--maskdeny_pathsで自分で指定します。
秘密情報をエージェントから隠したまま使う認証情報のマスク機能を使うと、本物の秘密情報をプロキシ側で注入できます。実験的な設定が必要です。記載なし記載なしできません。マスクされたファイルは空のファイルです。
プラットフォームmacOS、Linux、WSL2。ネイティブのWindowsとWSL1には非対応。macOS、Linux、WSL2、ネイティブのWindows。macOSのSeatbelt、DockerまたはPodman、gVisor、LXC(実験的)、ネイティブのWindows。LinuxとmacOS。WindowsではWSL2のみ。
インストールエージェントに同梱。Linuxではbubblewrapsocatが必要です。エージェントに同梱。エージェントに同梱。コンテナ系のバックエンドにはDockerかPodmanが必要です。別のバイナリ。Linuxではbubblewrapが必要です。

出典:Claude Code sandboxingClaude Code sandbox environmentsCodex approvals and securityCodex Linux sandboxGemini CLI sandbox

両方使う

ネットワークが無効だと、クラウド型のエージェントは自分のモデルAPIに接続できません。実際に開けるものは2つ、ネットワークとエージェントのログイン情報です。

ジェイルの中のクラウド型エージェント
cd ~/Projects/my-appai-jail --network --agent-state claude
ai-jailと書かれた大きな壁が、エージェント、MCPサーバー、フック、プロジェクト、シェルコマンドを囲んでいます。エージェントとシェルコマンドの間には、エージェント自身の承認プロンプトがあります。1本の線が壁の門を通ってモデルAPIへ出ています。ホームディレクトリは壁の外にあり、暗く、格子がかかっています。
外側の壁がai-jailです。その中で、エージェントのプロンプトとルールはこれまでどおり働きます。

エージェント自身のチェックが引き続き担うこと

許可プロンプト、許可と拒否のルール、planモードはエージェントというプログラムの一部なので、ジェイルの中でも外と同じように動きます。あなたなら承認しなかったはずのコマンドを、ここで止められます。

その下でai-jailが保証すること

あなたが何を承認しても、エージェントとそのMCPサーバー、フックからは、ホームディレクトリも鍵もシェルのトークンも見えません。ただし、エージェントは読めるものを送れます。プロジェクト内の秘密情報はマスクしてください

Docker、devコンテナ、仮想マシン

これらも良い選択肢で、仮想マシンのほうが境界として強くなります。違いは、何をビルドし、何を更新し続ける必要があるかです。

得られるものかかるコスト
Dockerコンテナ専用のファイルシステム、プロセス一覧、ネットワーク。エージェントに見えるのは、あなたがマウントしたものだけです。イメージのビルドと保守が必要で、ツールチェーンをもう一度インストールすることになります。Dockerソケットをマウントすると、そのコンテナはホストのroot相当になります。
devコンテナコンテナと同じ隔離。エディタが理解でき、チームで共有できるファイルに定義を書きます。同じくイメージの保守が必要です。加えて、この形式に対応したエディタかツールが要ります。
仮想マシン専用のカーネル。この中で最も強い境界で、悪意があると考えるコードにはこれが適切です。最も重い選択肢です。ゲストOSをインストールして更新し、メモリを割り当て、プロジェクトをコピーする必要があります。
ai-jail1つのコマンドを囲むサンドボックス。マシンにすでにあるコンパイラやランタイムを使います。イメージもデーモンもrootも要りません。カーネルをホストと共有するので、カーネルやドライバの脆弱性を突く攻撃は守備範囲の外です。仮想マシンよりは弱い境界です。

ai-jail自身のドキュメントは、これを「有用な層であり、使い捨てのVMの代わりではない」と位置づけています。脅威モデルを読む

併用についての質問

エージェント自身のサンドボックスとプロンプトは切るべきですか?
プロンプトとルールは残してください。個々のコマンドを審査するのはそちらの役目で、ai-jailはそれをしません。エージェントのOSサンドボックスは、Linuxでは事情が違います。入れ子のbubblewrapサンドボックスに必要なシステムコールをai-jailがブロックしており、この組み合わせが動くとはドキュメントに書かれていません。ジェイルの中でエージェントが「サンドボックスを利用できない」と報告しても、ジェイル自体は機能しています。
ai-jailはDockerより安全ですか?
境界としては同じ種類です。どちらもカーネルをホストと共有し、どちらも仮想マシンではありません。ai-jailはすべて閉じた状態から始まり、イメージもデーモンもrootも要りません。コンテナは指示されたものをマウントし、Dockerソケットをマウントすればホストのroot相当になります。悪意があると考えるコードには、使い捨てのVMを使ってください。
ドメイン単位のネットワーク許可リストがないのはなぜですか?
サンドボックスの中に置いたフィルターは、エージェントが使わないことを選べてしまいます。メンテナーはこの要望を対象外としてクローズしました。rootなしで実現するには、ユーザー空間のネットワークスタックが必要です。そのうえで、SNIの検査か、認証情報を含むエージェントのAPI通信に対するTLSインターセプトのどちらかも必要になります。SNIの検査は、SNIがない場合や暗号化されている場合には機能しません。フィルターは、すでに特権のある場所でかけてください。エージェントのuidに対するnftablesのルール、IPAddressAllow=を指定したsystemdのスライス、ネットワーク名前空間を所有するコンテナやVMなどです。
Claude Codeしか使いません。それでもai-jailは必要ですか?
執筆時点で選択肢は3つあります。組み込みサンドボックスはシェルコマンドをカバーします。Anthropicの@anthropic-ai/sandbox-runtimeはベータ版のリサーチプレビューで、プロセス全体を包みます。ai-jailもプロセス全体を包みます。ホームディレクトリと環境変数を閉じた状態から始まり、後でほかのエージェントを試すときにも同じポリシーを使えます。Anthropicによるサンドボックス環境の比較も参照してください。

エージェントを檻の中に

ai-jailは単一のバイナリで、デーモンもroot権限も要りません。いつものコマンドの前に1語足すだけです。

terminal
brew tap akitaonrails/tap && brew install ai-jailai-jail claude