Agent Sandboxing
エージェントのサンドボックス化では、AIエージェントのコマンドと生成コードを、ファイル、ネットワーク、認証情報、計算リソースを制限する隔離環境で実行します。
エージェントのサンドボックス化とは、シェルコマンド、生成コード、ファイル編集、ウェブ閲覧などのAIエージェントのアクションを、アクセス可能なファイル、ネットワーク、認証情報、計算リソースを制限する隔離環境内で実行することです。大規模言語モデル(LLM)を基盤とするエージェントは、読んだテキストに基づいて各コマンドを選択しますが、そのテキストには誤りや悪意が含まれる可能性があります。サンドボックスはオペレーティングシステムまたはハイパーバイザーで制限を強制するため、モデルがウェブページやREADMEに隠されたプロンプトインジェクションに従った場合や、単に間違いを犯した場合でも、制限は維持されます。
エージェントにサンドボックスが必要な理由#
関数呼び出しとツール使用によって、モデルのテキストが実際のアクションになります。そのため、シェルを実行できるエージェントは、ファイルの削除、SSHキーの読み取り、ソースコードのアップロードも実行できます。OWASP AI Agent Security Cheat Sheetでは、エージェントにサンドボックスなしで任意のコードを実行させることを避けるべき実践として挙げています。また、2025年12月に公開されたOWASP Top 10 for Agentic Applicationsでは、予期しないコード実行をエージェント型システムの主なリスク10項目の1つに挙げています。サンドボックスはエージェントの使いやすさも高めます。すべてのコマンドで人の承認を求めると承認疲れにつながりますが、Anthropicの社内利用では、Claude Codeのサンドボックス化により許可プロンプトが84%減少しました。境界内にとどまるコマンドには、プロンプトが不要になるためです。
サンドボックスが制限するもの#
エージェント用のサンドボックスでは、通常、次の5項目を制御します。
- ファイルシステム:エージェントには、スクラッチ用のワークスペースまたは単一のリポジトリのみを見せます。多くの場合、読み取り専用のベースイメージ上に置き、認証情報、ブラウザプロファイル、他のプロジェクトにはアクセスできないようにします。
- ネットワーク:外部への通信を遮断するか、パッケージレジストリなど、許可リストに登録されたドメインのみを許可するプロキシ経由にします。これにより、乗っ取られたエージェントが攻撃者のサーバーにデータを送信できないようにします。
- 認証情報:シークレットはサンドボックスの外に保管するか、タスクごとに範囲を限定した短期間有効のトークンとして渡します。これはデータセキュリティにおける最小権限の原則です。
- 計算リソース:CPU時間、メモリ、プロセス数、経過時間の上限によって、無限ループやフォークボムを防ぎます。
- システムコール:seccompなどのフィルターで、エージェントのツールが必要としないカーネルインターフェースをブロックします。
隔離の強度は、境界をどこに設けるかによって異なります。Dockerコンテナはホストのカーネルを共有するため、カーネルの脆弱性を悪用されると脱出される可能性があります。gVisorは、各コンテナのシステムコールを仲介するユーザー空間カーネルを追加します。また、AWSがLambda向けに構築したFirecrackerなどのマイクロVMは、起動時間が125ミリ秒未満、メモリのオーバーヘッドが5 MiB未満でありながら、各サンドボックスに独自の最小限のカーネルを提供します。ホスト型コードインタープリターやクラウド型コーディングエージェントでは、通常、タスクごとに新しいコンテナまたはマイクロVMを起動し、終了後に破棄します。開発者のマシンでは、Claude CodeサンドボックスがmacOSではSeatbelt、Linuxではbubblewrapを使用します。シェルコマンドの書き込み先を作業ディレクトリと一時ディレクトリのみに制限し、各ホストを許可リストと照合するプロキシ経由でネットワーク通信を行います。
サンドボックスは、モデルのツール呼び出しを実行するソフトウェアであるエージェントハーネスの1つの層です。ハーネスは、提案された各アクションをポリシーと照合し、許可されたアクションをサンドボックス内で実行します。また、支払い、デプロイ、組織外へのメッセージ送信など、取り消せないアクションの前には人による確認を求めます。
生成コードのサンドボックス化#
データ分析アシスタントからエージェント型コーディングツールまで、コードを作成して実行するエージェントには、最も厳しい制限が必要です。生成コードはインタープリターが実行できることを何でも実行できるためです。最も内側の層は通常のプロセス分離で、Pythonの標準ライブラリを使って確認できます。このスクリプトは、モデルが書いたコードを使い捨てディレクトリ内で実行し、環境変数を空にして、resourceモジュール(LinuxおよびmacOS)でCPU時間に上限を設定します。
import os
import resource
import subprocess
import sys
import tempfile
os.environ["API_KEY"] = "sk-live-123" # エージェント自身のプロセスが保持するシークレット
# モデルが書いたコード:環境変数を読み取り、その後無限ループする
generated = "import os\nprint('API_KEY =', os.environ.get('API_KEY'), flush=True)\nwhile True: pass"
def limit_cpu():
"""Stop the child process after 2 seconds of CPU time."""
resource.setrlimit(resource.RLIMIT_CPU, (2, 2))
# 分離モードで、使い捨てディレクトリ内かつ環境変数を空にして実行する
cmd = [sys.executable, "-I", "-c", generated]
with tempfile.TemporaryDirectory() as workspace:
proc = subprocess.run(cmd, cwd=workspace, env={}, capture_output=True, text=True, preexec_fn=limit_cpu)
print(proc.stdout.strip())
print("exit code:", proc.returncode)子プロセスはAPI_KEY = Noneを出力します。環境変数が空の状態で起動するため、親プロセスのシークレットを参照できません。また、終了コード-24で終了します。無限ループがCPU時間の上限である2秒に達したときに、カーネルがSIGXCPUでプロセスを強制終了したことを示します。コンテナまたはマイクロVMを使うと、このプロセスの周囲にファイルシステムとネットワークの境界が追加されます。
サンドボックス化と関連する制御手段の比較#
- AIガードレール: 入力、出力、または実行予定のアクションを実行前にスクリーニングする分類器やルールです。ガードレールがアクションの実行を許可した後、そのアクションによって起きることはサンドボックスが封じ込めます。
- 権限:アクセス制御により、エージェントがそもそもどのツールやリソースを使用できるかを決定します。サンドボックスは、モデルが言いくるめて回避できる可能性のあるチェックより下位の、オペレーティングシステムレベルでその決定を強制します。
- コンテナ化: 再現性のあるデプロイに向けて、ソフトウェアを依存関係とともにパッケージ化することです。コンテナは、権限の削除、マウントの制限、外部への通信ルールを設定して実行すると、サンドボックスとして機能します。
- テスト用サンドボックス:ソフトウェアを安全に試すための、システムの非本番用コピーです。エージェントのサンドボックスは、開発時だけでなく本番環境でも、エージェントが行うすべてのアクションを囲みます。
エージェント用サンドボックスの用途#
- コーディングエージェント:タスクごとに新しいコンテナまたは仮想マシンを用意し、単一のリポジトリを配置します。エージェントはそこで依存関係をインストールしてテストを実行し、人によるレビュー用の差分を返します。
- コンピューター操作エージェント: スクリーンショットやクリックを通じてデスクトップやブラウザを操作するエージェントは、独自のアカウントを持つ仮想マシン内で実行します。閲覧するページには、エージェントを標的にした指示が含まれている可能性があるためです。
- コードインタープリター:アップロードされたスプレッドシートや画像を分析するアシスタントは、通常、インターネットアクセスのないセッションごとのサンドボックスでPythonを実行します。
- MCPサーバーとエージェントスキル: サードパーティ製ツールやスキルスクリプトはユーザーの認証情報を使って実行されるため、慎重なホストはローカルサーバーやスクリプトを、エージェントのシェルと同じ境界内で起動します。
ホスト型エージェントプラットフォームも、自らのワークフローに同じ制限を適用します。Ultralytics Platform Agentsは、YOLO26による検出、視覚言語モデル、アラートブロックを連結し、共有トライアルの実行ごとに60秒、入力画像20枚、モデルまたはプロバイダーの呼び出し20回を上限とします。また、WebhookブロックはパブリックHTTPS URLにのみPOSTし、リダイレクトを追跡せず、5秒後にタイムアウトします。










