Skip to main content
Beta — OSレベルのサンドボックスはオプトインで、現在も活発に開発中です。挙動、 設定、プラットフォームサポートはリリースごとに変更される可能性があります。
OSレベルのサンドボックス化では、ユーザーがDroidのファイルシステム境界とネットワーク境界を設定できます。Beta版では、Droidが開始するすべてのシェルコマンドが別プロセスで実行され、ユーザーが設定し、OSカーネルレベルで強制されるファイルシステムおよびネットワーク境界の範囲内に制限されます。 内部的には、サンドボックスは macOS では Seatbelt プロファイル、Linux では seccomp と組み合わせた bubblewrap、ドメインレベルのネットワークフィルタリングには HTTP/SOCKS プロキシを使用します。Windows は WSL2 経由でサポートされます。

デフォルトのアクセスポリシー(サンドボックス有効時)

リソースデフォルトポリシー設定項目
ファイル読み取りすべて許可。明示的な denyRead エントリのみブロックされます。sandbox.filesystem.denyRead
ファイル書き込みCWD(現在の作業ディレクトリ)以外はすべて拒否。追加のパスは許可できます。denyWriteallowWrite より優先されます。sandbox.filesystem.allowWrite, sandbox.filesystem.denyWrite
ネットワーク*.factory.ai(デフォルトで常に許可)以外はすべて拒否。追加のドメインは明示的に許可する必要があります。sandbox.network.allowedDomains

サンドボックスモード

sandbox.mode 設定で、分離の適用方法を選択します:
  • per-command(デフォルト) — Droid が開始するシェルコマンドとツール操作のみがサンドボックス化されます。
  • whole-process(Linux のみ) — Droid プロセス全体が OS サンドボックス内で起動され、メインプロセス、MCP の stdio トランスポート、サブエージェントにまで分離が拡張されます。

含まれる機能

コマンド単位のサンドボックスモードmode: "per-command"、有効時のデフォルト):
  • ファイルツール(Read、Edit、Create、LS、Grep、Glob、ApplyPatch) — すべての操作の前に checkFileAccess() を実行し、読み取りには denyRead、書き込みには allowWrite / denyWrite を適用
  • Execute ツール — シェルコマンドを OS サンドボックス(Seatbelt / bubblewrap)でラップし、ネットワークはドメインレベル制御のために SRT のフィルタリングプロキシ経由でルーティング
  • FetchUrlallowedDomains に対して checkNetworkAccess() を実行
  • MCP ツール — サンドボックス有効時は fail closed(拒否)になります。MCP ツールの挙動は不透明で(サーバーがファイルの読み書きやネットワークアクセスなどを行う可能性があります)、プロトコルはツールごとの効果メタデータを公開しないため、強制可能なサンドボックスポリシーにマッピングできず、後述のデフォルト拒否ツールポリシーによってブロックされます。
  • 注記 — このモードではメインのDroidプロセスとサブエージェントは分離されません。これらを分離するには whole-process モードを使用してください。
プロセス全体のサンドボックスモードmode: "whole-process"、Linux のみ):
  • 起動時に Droid プロセス全体が OS サンドボックス内で再実行されるため、メインプロセス、MCP の stdio トランスポート、サブエージェントのライフサイクルがすべて、設定されたファイルシステムおよびネットワーク境界の範囲内で実行されます
  • Droid プロセスが直接行うネットワークリクエスト(Execute ツールからのものだけでなく)も allowedDomains に対してフィルタリングされ、TUI モードでは対話型のドメインプロンプトが表示されます
  • Fails closed — 起動時にセキュアなランタイムを確立できない場合(非対応プラットフォーム、サンドボックスサポートの欠如、または分離チェックの失敗)、Droid はサンドボックスなしで実行するのではなく起動を拒否します
  • デフォルトのアクセスポリシー、ファイルシステムおよびネットワーク設定、「常に許可」の永続化は、コマンド単位モードと同じ挙動です
ツールポリシー(デフォルト拒否):
  • 登録されたすべてのツールは、サンドボックスの副作用メタデータ(filesystem-readfilesystem-writenetworkprocessexternal-servicepersistent-settings)を宣言します
  • サンドボックス有効時、宣言されたすべての副作用がサンドボックスポリシーハンドラ(ファイルアクセス、ネットワーク、またはコマンド単位の Execute)にマッピングされる場合にのみ、ツールが許可されます。注釈のない副作用、不明な副作用、または未処理の副作用を持つツールは拒否されます
  • ローカルで強制できない効果を持つツール(MCP ツールやコネクタ(external-service)など)はハンドラを持たないため、fail closed になります
  • ツールポリシーによる拒否はプロンプト不可です。ユーザーの承認でポリシーカバレッジの欠如を回避することはできず、これらの拒否は allowWrite / allowedDomains では設定できません
対話型の権限プロンプト(TUIモード):
  • サンドボックス違反があると、Auto(High)自律レベルでもエージェントループが中断され、TUIプロンプトが表示されます
  • 3つの選択肢: 1回だけ許可常に許可(設定に永続化)、拒否
  • denyWrite 違反では、「常に許可」の代わりに「拒否リストから削除」オプションが表示されます(設定の denyWrite から該当エントリを削除)
  • denyRead 違反でも、「常に許可」の代わりに「拒否リストから削除」オプションが表示されます
  • Execute のネットワーク違反では、SRT のプロキシコールバックを通じたリアルタイムのドメインプロンプトが表示され、60秒で自動拒否されます
非対話モード(droid exec):
  • サンドボックス違反はプロンプトなしで自動拒否されます — ハングせず、ユーザー操作も不要です
  • エージェントは拒否メッセージを受け取り、それを出力に報告します
「常に許可」の永続化:
  • ファイル書き込み違反(CWD外): ユーザー設定の sandbox.filesystem.allowWrite に親ディレクトリを追加
  • denyWrite 違反: sandbox.filesystem.denyWrite から該当エントリを削除
  • denyRead 違反: sandbox.filesystem.denyRead から該当エントリを削除
  • ドメイン違反: ドメイン(3つ以上のパートを持つドメインではワイルドカード付き。例: registry.npmjs.org -> *.npmjs.org)を sandbox.network.allowedDomains に追加
  • 変更は現在のセッションにすぐ反映されます
組織管理による強制:
  • 組織レベルの denyWrite / denyRead 設定は、ユーザーの「常に許可」では上書きできません
  • 拒否が組織設定に由来する場合、違反プロンプトには「(組織ポリシー)」と表示されます
TUI インジケーター:
  • サンドボックス有効時は、フッターに SANDBOX ステータスインジケーターを表示
  • 違反の詳細(パス、ドメイン、理由)を含む「Sandbox Violation」プロンプトを表示

設定構成

{
  "sandbox": {
    "enabled": true,
    // 分離のスコープ: "per-command"(デフォルト)または "whole-process"(Linux のみ)
    "mode": "per-command",
    "filesystem": {
      // CWD(常に書き込み可)に加えて書き込み可能にするパス
      "allowWrite": ["/tmp/build-output", "~/.config"],
      // 親が allowWrite にあっても特定のサブパスへの書き込みを拒否
      "denyWrite": ["/tmp/build-output/cache/locks", "~/.config/secrets"],
      // 特定のパスへの読み取りをブロック(それ以外は読み取り可)
      "denyRead": ["~/.aws/credentials", "~/.ssh/id_rsa"]
    },
    "network": {
      // 到達可能なドメインはこれらのみ(*.factory.ai は常に含まれる)
      "allowedDomains": ["github.com", "*.npmjs.org"]
    }
  }
}
設定は階層全体(組織 > プロジェクト > ユーザー)でマージされます。denyWrite / denyRead は和集合マージを使用するため、組織による拒否は下位レイヤーで削除できません。

関連