こんにちは!コロンビア大学の博士課程でAI・セキュリティの研究をしている Koukyosyumei です。
さて、読者のほとんどの方が Claude Code や Codex を使って開発をしていると思いますが、皆さんは「AIエージェントがシェルコマンドやネットワークアクセスを実行するときにどのように安全性を確認しているか」についてどこまで理解しているでしょうか?
エージェントは様々な作業を自動で行ってくれますが、誤ってファイルを削除したり、機密情報を外部に送信したり、CPUリソースを食いつぶすような非効率なプログラムを実行したりする可能性があります。
もちろん、Claude Code や Codex はどちらもエージェントを安全に動かすための仕組みであるサンドボックスを内製しています。また h5i や docker-agent といったより高性能なエージェント向けサンドボックスも注目を集めています。
本記事では、Claude Code や Codex に内蔵されているサンドボックス機能の仕組みを解説し、さらに高性能なサンドボックスである h5i の簡単な使い方を説明します。
Claude Code のサンドボックス
Claude Code は OSレベルのサンドボックス機能 (Bubblewrap、socat、seccompなどなど) を Bash Tool に対して適用することができます。その他の Read、Write、WebFetch などは、適宜ユーザーに確認する permission model によって安全性の担保を図っています。
これらのサンドボックス設定は、settings.json の sandbox block で決定でき、各 Bash Tool に対して、許可するコマンド、除外されるコマンド、ネットワークのアクセス可否、credential の扱いなどを設定できます。
{
"sandbox": {
"enabled": true,
"network": {
"tlsTerminate": {},
"allowedDomains": ["*.github.com", "registry.npmjs.org"]
},
"credentials": {
"envVars": [
{ "name": "GH_TOKEN", "mode": "mask", "injectHosts": ["api.github.com"] },
{ "name": "NPM_TOKEN", "mode": "mask" }
]
}
}
}
また、permissions block でツールごとの allow / ask / deny ルールを静的に定義することも可能です。
{
"permissions": {
"allow": [
"Bash(npm run *)",
"Bash(git commit *)",
"Bash(git * main)",
"Bash(* --version)",
"Bash(* --help *)"
],
"deny": [
"Bash(git push *)"
]
}
}
Codex のサンドボックス
Codex では、「何が許されるか」を決める sandbox policy と、「誰に聞くか」を決める approval policy という二つのポリシーを組み合わせ、すべてのコマンドを OS レベルのサンドボックスを用いて実行します。
sandbox policy には以下の三つのモードが用意されています。
- read-only: ディスク全体を読み込めるが、書き込みやネットワークアクセスはできない
- workspace-write: カレントディレクトリ、/tmp などに書き込みができる
- danger-full-access: より広範囲のアクセスが許可されるモード。
approval policy にはたとえば以下の3つの選択肢があります。
- on-request: デフォルトのモードで、モデルが必要だと判断したときに、ユーザーに承認を求めます。
- never: 権限を昇格するようなリクエストを常に拒否します。
- granular: 特定のリクエストを拒否するといった、より細かい設定を行うモードです。
h5i
h5i はより広範囲を高い自由度で設定できるサンドボックスツールです。Claude Code や Codex は基本的に個々のコマンドの実行可否を判断することに注力していますが、h5iは作業環境そのものを分離します。
具体的には、h5i env というコマンドにより、OS レベルのサンドボックスで隔離された専用の Git worktree が用意できます。Claude Code や Codex が持つシステムコールレベルの制限やフォルダアクセス制限などに加えて、メモリやプロセス数などのリソース制限も設定可能です。またドメイン単位のアクセス可否や、認証情報の環境ごとの分離なども柔軟に設定することができます。
インストール
curl -fsSL https://raw.githubusercontent.com/h5i-dev/h5i/main/install.sh | sh
初期化
h5i init
h5i hook setup --write --wrap-bash
サンドボックス環境の構築
h5i env create claude-env --profile agent-claude
h5i env shell claude-env
box$ claude --dangerously-skip-permissions
box$ exit
h5i env diff claude-env # 環境内の変更を確認
h5i env propose claude-env # 環境内の変更を提案
h5i env apply claude-env # 提案された変更を元のブランチに反映
この h5i env のデフォルトのモードである supervised モードは、docker などの重いコンテナは使用せず、システムコールの監視や namespace の設定を組み合わせることで軽量なサンドボックス環境を実現しているため、わずか0.2~3秒程度でサンドボックス内のシェルに入ることができます。
この環境化では、たとえエージェントがプロンプトインジェクション攻撃やハルシネーションなど何らかの理由によって誤作動を起こしたとしても、元の環境に破壊的な変更が起こったり、機密情報が外部に流出するといった事故を防ぐことができます。また h5i は「監査可能なワークスペース」をスローガンに掲げており、環境内で実行されたコマンドやその結果・ユーザーが与えたプロンプトなどはすべて記録され、あとから検証することも可能です。