ルールを読む
ai-jailは、あなた自身の~/.ai-jailファイルを信頼します。プロジェクト内の.ai-jailファイルは信頼できないものとして扱い、サンドボックスを厳しくはできても、緩めることはできません。コマンドラインのフラグはどちらよりも優先されます。
毎回、一瞬で終わります。その後バックグラウンドに残るものはありません。
↔ 横にスワイプすると図全体を見られます
ai-jailは、あなた自身の~/.ai-jailファイルを信頼します。プロジェクト内の.ai-jailファイルは信頼できないものとして扱い、サンドボックスを厳しくはできても、緩めることはできません。コマンドラインのフラグはどちらよりも優先されます。
ai-jailは、エージェントが存在する前に、下で説明する各層を用意し、手元のツールチェーン(mise、cargo、npmなどのキャッシュ)を読み取り専用か、ジェイル専用のキャッシュとしてマップします。設定ファイルが読めなかったり不正だったりした場合は、弱いルールで起動せずに停止します。
エージェントも、それが起動するスクリプトやパッケージ、MCPサーバーも、同じ壁を引き継ぎます。エージェントが終了すると、ai-jailも終了します。
起動のたびに3つのネットワークモードから1つを選びます。デフォルトは最も厳しく、フィルタ付きプロキシが通すもの以外に外への経路はありません。通すのは、両プラットフォームで既知のエージェント自身のAPIホストと、ツールチェーンが有効なLinux(デフォルト)での短いパッケージレジストリ一覧です。残りの2つは意図して渡すフラグです。
↔ 横にスワイプすると図全体を見られます
デフォルト。サンドボックスは外への経路のない専用のネットワーク名前空間を得ますが、フィルタ付きプロキシ経由だけは例外です。既知のエージェントなら、自身のAPIホストをLinuxでもmacOSでもプロキシが通すので、素のai-jail claudeが動きます。Linuxでツールチェーンが有効なら(デフォルト)、固定のパッケージレジストリ一覧も通すので、npm installやcargo buildが動きます。macOSではレジストリは閉じたままです。--no-networkで完全にオフラインになります。
--allow-host HOST。繰り返し指定できます。名前空間は閉じたままで、中の小さなブリッジが通信を外のCONNECTプロキシへ転送し、プロキシは指定したホストとそのサブドメインにだけ接続します。プロキシは名前を外側で一度だけ解決し、確認済みのアドレスに接続します。ai-jailは中でhttp_proxyを設定し、それを無視するプログラムはどこにも届きません。
--network。ネットワーク側の壁はなくなり、エージェントは読めるものを何でも外へ送れます。
| Linux | macOS | |
|---|---|---|
| フィルタ付きモードの柵 | ネットワーク名前空間そのものと、その中のブリッジ | プロキシのポートへの外向き接続だけを許可するsandbox-execのルール1つ |
| サンドボックス内のDNS | 失敗します。名前はプロキシが外側で解決します。 | システムのリゾルバに柵がかからないので、低帯域のDNSチャネルが残ります |
ai-jailは、1枚の壁だけで持ちこたえられるとは考えていません。Linuxでは、エージェントはカーネルが強制する5枚の壁の内側にいます。さらに、入るものと出るものに1つずつフィルターがかかります。
↔ 横にスワイプすると図全体を見られます
ai-sandbox)が与えられます。ホスト上のプログラムとのプロセス間通信の経路はなく、ネットワーク名前空間には、--allow-hostか--networkで開けない限り外への経路がありません。ai-jailが落ちれば、中のものもすべて一緒に落ちます。/usrなどのシステムディレクトリは読み取り専用です。ホームディレクトリと/tmpは新しく作られ、メモリ上に置かれます。手元のツールチェーン(mise、cargo、npmのキャッシュ)は、この新しいホームの中に読み取り専用か、ジェイル専用のキャッシュとしてマップされます。~/.ssh、~/.aws、~/.gnupg、~/.docker、ブラウザのプロファイルは組み込みのリストに載っており、決してマウントされません。例外はハーネス自身の状態ディレクトリ、たとえばClaudeの~/.claudeです。ai-jailはこれをデフォルトで読み書き可能でマウントするので、エージェントはログイン済みで起動します。--no-agent-stateなら外に置かれます。プロジェクトの外に書いたものは、セッションが終わると消えます。ptrace、mount、bpf、カーネルモジュール、io_uring、カーネルキーリング、rawソケット、そしてターミナルにキー入力を打ち込める呼び出しであるTIOCSTIです。コンパイラやランタイムが動き続けるよう、あえてブロックリスト方式にしています。Landlockとseccompの適用前に起動される唯一のプロセスは、フィルタ付きの通信を外へ運ぶ小さなブリッジで、これだけは制限を受けません。PATH、HOME、TERM、ロケール、プロキシと証明書の設定です。ANTHROPIC_API_KEYで、ログイン情報と一緒にデフォルトでコピーされます。--no-agent-stateで止められます。タスクに必要なときは、--envで名前を指定してほかの変数を1つずつ渡します。macOSには名前空間もLandlockもseccompもありません。ai-jailは同じポリシーを、Apple純正のサンドボックスであるsandbox-execのプロファイルに変換します。これがLinuxの隔離と同等ではないことは、ai-jailのドキュメントにもはっきり書いてあります。
↔ 横にスワイプすると図全体を見られます
| Linux | macOS | |
|---|---|---|
| バックエンド | bubblewrap、続いてLandlock、seccomp、リソース制限 | 起動のたびに生成したプロファイルを使うsandbox-exec。Appleはこれを非推奨にしていますが、カーネル拡張なしで使えるもっと良い手段はありません。 |
| ホームディレクトリ | メモリ上の新しいホーム。本物のホームはマウントされません。 | プロファイルは全体の読み取りを禁止した状態から始め、エージェントに必要なパスだけを許可します。本物のホームは閉じたままです。 |
/tmp | 専用で、終了時に破棄 | マウント名前空間がないため、ホストの/tmpです。TMPDIRは起動ごとに作る専用フォルダを指し、許可される一時パスはそこだけです。 |
| コピーオンライトのマップ | --overlay-mapを使うと、エージェントはコピーに書き込みます | 読み取り専用のマップとして扱われます |
| ネットワーク | デフォルトは閉じています:既知のエージェント自身のAPIホストと、ツールチェーンが有効なときに許可されるパッケージレジストリ以外に、外への経路はありません。--allow-hostか--networkで広げ、--forward-portでホストのループバックのポート1つを中継し、--no-networkですべて閉じます。--lockdownでは、--networkを付けても開いたネットワークは常にブロックされます。 | 同じデフォルトと同じフラグで、既知のエージェントのAPIホストも含みますが、--forward-port、レジストリ、ツールチェーンのキャッシュのマップはLinux限定なのでありません。ロックダウンはここでも開いたネットワークをブロックします。 |
| ほかのプログラム | 見えません。プロセス一覧は専用で、ホストのIPCもありません | --macos-host-ipcを渡さない限り、Mach、IOKit、ホストのIPCは拒否されます |
ai-jailは、自前で書くセキュリティ関連のコードをできるだけ少なくしています。土台はbubblewrapです。小さく、主要なディストリビューションすべてでパッケージになっていて、Flatpakを通じて毎日使われています。その上にカーネルの機能を重ねます。
| 選択肢 | 採用しなかった理由 |
|---|---|
| Firejail | 用は足せますが、setuid rootのバイナリであり、その設計に起因するCVEがいくつも出ています。bubblewrapはrootなしで動きます。 |
| bubblewrapをRustで書き直す | 上流で修正が入り続ける約50 KBの依存を1つ避けるために、セキュリティ上重要な500行超のコードを自分たちだけで保守し、パッチを当て続けることになります。 |
| nsjail | 機能は十分ですが、サーバー向けの作りで、設定はprotobuf形式のファイルです。パッケージとして入手できる環境も限られます。 |
| systemd-nspawn | systemdが必須なので、コンテナの中やsystemdのないシステムでは動きません。 |
ツール全体が1本の同期的なRustプログラムです。asyncランタイムもデーモンもコンテナイメージもありません。
依存はai-jailリポジトリのバージョン2.9.0で、テストはバージョン2.9.0で数えた値です。
ai-jailは単一のバイナリで、デーモンもroot権限も要りません。いつものコマンドの前に1語足すだけです。
brew tap akitaonrails/tap && brew install ai-jailai-jail claude