LLM エージェントの sandbox(コード実行隔離)— 自律性と安全性を両立する多層防御¶
作成日: 2026-06-16 出典 / きっかけ: AI Engineering Summit Tokyo 2026(2026-06-09)小谷悠久(Ubie CTO)「Unleash true potential of LLM with sandbox」 https://speakerdeck.com/yukukotani/unleash-true-potential-of-llm-with-sandbox (GitHub issue「Sandbox」#6 起点) 関連: agentic_reference_architecture_評価ループ(参照アーキの HITL/権限層の“下”にあたる構造防御がこの sandbox) / findy_ai_engineering_summit_2026_summer(同イベント全体) / ai_agent_9社_本番運用アーキテクチャ
0. 要点(3行)¶
- 「安全 vs 自律」はトレードオフではない。sandbox(セッション隔離されたコード実行環境)+ egress 制御 + credential の JIT 注入 + 権限スコープ分離、の多層防御を組めば、prompt injection を前提にしても 15 時間級の自律エージェントを安全に回せる、というのが Ubie 小谷氏の主張。
- 隔離の強さは microVM(Firecracker, 自前カーネル)> gVisor(user-space カーネルで syscall 横取り)> Docker/Linux primitives(カーネル共有=境界ではない) の順。Anthropic Claude Code の
sandbox-runtimeは VM を使わず macOS Seatbelt / Linux bubblewrap + seccomp で軽量に FS・ネットワークを締める。 - load-bearing な層はネットワーク egress(Simon Willison の lethal trifecta)。計算隔離だけでは情報窃取(exfiltration)は止まらない。「許可ドメインのみ+payload 検査」と「credential を sandbox に常駐させない」が要。これは確率の防御(プロンプト)ではなく構造の防御。
1. このノートの位置づけ¶
agentic_reference_architecture_評価ループ の参照アーキで言う (4) Human-in-the-Loop / 権限ゲートの“さらに下の構造層”が本ノート。承認ゲート(確率+人間)で止めきれない・止めると自律性が死ぬ部分を、コード実行能力そのものの隔離で構造的に封じる話。学習リポジトリの写経教材 lectures/sandbox_basics(9例)と lectures/guardrails_basics(6例)の実装そのものに対応する(§8)。
2. なぜ sandbox か — 自律性を阻む3つの壁¶
小谷氏の整理(Ubie は社内 400+ AI partner、採用率100%/作成率81%、Slack/Salesforce/カレンダー/BigQuery 等に接続)。長時間自律実行を阻むのは:
- 無限の権限承認 — コマンド単位の HITL は 15 時間級モデルの能力を殺す。かといって YOLO(全許可)は危険。allowlist/blocklist の保守も破綻しがち。
- 情報アクセス制限 — 長いタスクには探索が要るが、データ漏洩リスクが高い。アクセス範囲の綱引き。
- 環境衝突 — 並行プロセスの競合(ポート、DB マイグレーション、リソース競合)。
→ 解は「エージェントの副作用を sandbox に封じ込める」。セッション単位で隔離された Shell/FS を、エージェント実行ごとに使い捨てる(microVM ベース、~1秒起動)。
その根底にあるリスクが lethal trifecta(§7)。
3. 隔離技術の地図(一次資料)¶
| 技術 | 隔離レベル | ホストとカーネル共有? | ネットワーク制御 | 起動/オーバヘッド |
|---|---|---|---|---|
| Firecracker microVM(AWS) | KVM で自前ゲストカーネルの microVM | しない | VMM レベルで最小デバイス | 125ms で user code / 150 VM/s/host / <5MiB/VM |
| gVisor(Google) | user-space カーネル "Sentry" が全 syscall を横取りし自前実装で処理 | しない(host syscall を素通ししない) | user-space netstack | 起動なし・syscall ごとに CPU オーバヘッド |
| Linux primitives(namespaces/cgroups/seccomp/capabilities) | プロセス級の隔離つまみ(見える物/使う量/できる事/呼べる syscall) | する | network namespace + iptables(手動) | ほぼゼロ。既定では“境界”ではない |
| Docker(既定) | 上記 primitives の束ね | する(カーネル共有) | bridge | 速いが「カーネル1バグ / docker.sock マウント1つ」で脱出余地 |
Anthropic sandbox-runtime(srt) |
コンテナ無し。macOS Seatbelt(sandbox-exec) / Linux bubblewrap + seccomp |
する | default-deny、全 egress を proxy 経由でドメイン allowlist | 「コンテナ起動のオーバヘッド無し」 |
| E2B | Firecracker microVM(マネージド) | しない | 設定可 | <200ms(同一リージョン)/ quick-start 80ms / 最大24h |
読み筋:
- microVM(Firecracker)が最強の境界=自前カーネル。マルチテナントの相互隔離はこれ。gVisor は中間(カーネルは持たないが syscall を素通ししない)。Docker 既定は“境界”ではない(カーネル共有、つまみの集合)。
- gVisor の限界(公式が明記): ハードウェアサイドチャネル(Spectre 等)は守らない。Firecracker も landing page では side-channel 非言及。
- Anthropic の srt は VM ではなく OS プリミティブで軽量に締める設計(脅威モデルは prompt injection されたエージェントの「SSH 鍵 exfiltration / 機微ファイル改変」防止)。FS は read=deny→allow、write=allow-only、network は default-deny で全 egress を host 側 proxy(domain allow/deny)に通す。「ネットワーク隔離が無いと SSH 鍵を流出され、FS 隔離が無いと sandbox を抜けて network に出られる」=両方要ると明言。
4. 防御は多層 — 5つのレイヤ¶
小谷氏の sandbox 実装も Anthropic の managed agents も、結局この5層に分解できる。
flowchart TD
Brain["脳: Claude + harness<br>計画・推論・credential 保持"]
Sbx["手: Sandbox(microVM・session隔離)<br>LLM生成コード・shell・FS"]
Proxy["egress proxy<br>mitmproxy: 許可ドメイン + payload検査"]
Net(("外部<br>SaaS / API"))
Vault[("Vault<br>credential")]
Brain -->|"execute(name,input) → string"| Sbx
Sbx -->|全 egress を強制| Proxy
Proxy -->|許可のみ通す| Net
Vault -.->|JIT注入・実行後cleanup| Sbx
- 計算隔離(compute) — セッション単位の microVM(自前カーネル)。E2B/Vercel/Fly が Firecracker、Modal/GKE Sandbox が gVisor、Cloudflare Dynamic Workers が V8 isolate(軽いが境界は弱い)。
- ファイルシステム — sandbox ごとに専用 FS。Docker なら
cap_drop=ALL+USER nobody+no-new-privileges、Linux なら Landlock。 - ネットワーク egress(最重要・load-bearing) — default-deny の許可ドメイン allowlist + mitmproxy で双方向 payload 検査(許可ドメイン内に隠した exfil も捕る)。sandbox の壁を抜かれても情報窃取を止める最後の砦。
- credential(JIT 注入) — 秘密は vault に暗号化保管し、実行直前に注入+実行後に cleanup。プロンプトやツールスキーマには絶対載せない(model context に echo させない)。短命・最小スコープ・自動失効(Zero Standing Privileges)。Ubie は bash 実行直前に JIT 注入。
- 権限スコープ分離 — Service Account(shared scope)と OAuth(personal scope)を分け、impersonation で「同じエージェントが共有モード(Slack 可視)/ closed モード(個人データ)」を切替。Google IAM の SA impersonation は「鍵を持たず・credential が persist しない」点でキーより安全。
「mitmproxy egress 検査」「JIT credential」「SA/OAuth スコープ分離」はまさに小谷氏スライドの実装そのもの。
5. エージェント sandbox プロバイダ比較(一次資料)¶
| Provider | 隔離技術 | egress 制御 | 起動 |
|---|---|---|---|
| E2B | Firecracker microVM(自前カーネル) | アプリ層 | <200ms / pause-resume 5–30ms |
| Daytona | 専用カーネル+FS+network stack | per-sandbox firewall(egress 全遮断も可) | <90ms |
| Modal | gVisor コンテナ | アプリ層・syscall 面を縮小 | コンテナ級 |
| Cloudflare Sandboxes | 2層: V8 isolate Workers + コンテナ Sandbox | egress proxy が JWT 検証し実 credential を request 時注入 | 名前で起動・idle で sleep |
| Vercel Sandbox | Firecracker microVM(Amazon Linux 2023, root 可) | アプリ層 | ミリ秒起動・既定5分 |
| Fly Machines | Firecracker microVM | Fly private networking | 高速起動 |
潮流: microVM(自前カーネル, 最強隔離)vs gVisor(中間)vs V8 isolate(最速・最弱)。Ubie は E2B + GKE ベースの自前 を併用、Cloud Run Instances も評価中。
6. 「脳と手の分離」と code execution = 行動空間¶
- Brain/Hands 分離(Anthropic managed agents)— 「脳」(Claude+harness、credential 保持)と「手」(Sandbox、コード実行)を物理分離。インタフェースは単一ツール
execute(name, input) → string。Claude が生成する未信頼コードは token/credential に触れない箱で動く=prompt injection が credential-free な箱に着弾する。 - Code execution with MCP(Anthropic)— ツールを毎回 model 経由で叩く代わりに、エージェントが MCP を呼ぶコードを書く。中間結果は実行環境に留まり model に出ない(privacy + token 削減、150,000→2,000 token ≒ 98.7%減)。ただし「生成コードの実行には適切な sandbox・resource limit・monitoring が必須」と Anthropic 自身が警告=この最適化は sandbox 必要性を高める。
- smolagents(HF)— エージェントが JSON でなくコードで思考。既定の
LocalPythonExecutorは AST を1命令ずつ歩いて import を allowlist 制限し総演算数を制限するが「ローカル python sandbox は完全には安全にならない」と明言。真の隔離は E2B / Docker / Wasm(Pyodide+Deno) のリモート実行のみ。 - Ubie の「コーディング以外」での活用: LLM が shell の
|・sed・jq・head でツールを合成、中間結果をファイル保存、オンデマンドのコード生成で試行錯誤。in-memory shell エミュレータ(justbash.dev)で導入障壁を下げる。
7. lethal trifecta と「確率の防御 vs 構造の防御」¶
Simon Willison「the lethal trifecta」(2025-06-16)。3つが揃った時だけ危険:
- private data へのアクセス(エージェントツールの目的そのもの)
- untrusted content への暴露(攻撃者が制御するテキスト/画像が LLM に届く経路)
- 外部通信能力(窃取の出口=exfiltration)
根本原因は「LLM は content 内の指示に従う」「指示元を区別できない」こと。Willison の立場は明確で 「guardrails won't protect you」(確率的フィルタは回避される)。確実な対処は組み合わせ自体を避けるか、未信頼入力が consequential action を起こせないよう構造で制約する(CaMeL 方式、taint tracking でツール出力を汚染印付け→汚染中は exfil 系アクションを決定論的にブロック)。
→ これが sandbox(計算隔離)と egress 制御(出口封鎖)と JIT credential(窃取対象を置かない)が確率ではなく構造の防御である理由。research-orchestrator(3リポ横断)はこの3辺を全部持ちうるので要点検(agentic_reference_architecture_評価ループ §8 / agent-design STEP 7 と同じ観点)。
8. 学習リポジトリとの対応¶
~/ai-engineering-study/lectures/sandbox_basics(9例)と本ノートはほぼ1:1。
| 本ノートの論点 | sandbox_basics の例 |
|---|---|
| 隔離なし(基準線)→ なぜ危険か | ex01 |
| rlimit(可用性専用・OS依存) | ex02 |
macOS Seatbelt(.sb で FS/network 能力剥奪)=Anthropic srt の macOS 側 |
ex03 |
| Docker(namespaces + network none + read-only + cap-drop) | ex04 |
| 隔離8層を脅威モデルから逆算 | ex05 |
| E2B Firecracker microVM(クラウド・カーネル非共有) | ex06 |
| LLM 生成コードを隔離あり/なしで対比実行 | ex07 |
| Temporal の決定性 sandbox と security sandbox の分離 | ex08 |
LangChain create_agent + sandbox 化したコード実行ツール(@wrap_tool_call ゲート) |
ex09 |
接続: 権限ゲート(allow/ask/deny)の写経は guardrails_basics。本ノートはその「先=コード実行能力そのものの隔離」。評価ループ(agentic_reference_architecture_評価ループ)で“正しく動くか”を測り、sandbox で“暴走しても被害を構造的に限定”する、の両輪。
9. 自分に活かすアクション¶
research-orchestrator/temporal-workflows— Claude Code CLI を自律で回す箇所を lethal trifecta の3辺で点検し、egress allowlist(mitmproxy or proxy)と credential の JIT 化(op runでの注入は既に近い思想)を入れる。Temporal は ex08 の通り「決定性 sandbox(workflow)」と「security sandbox(コード実行)」を別物として扱う。ai-engineering-digest— 将来 LLM 生成コードを実行する Phase を足すなら E2B か Docker(cap-drop) のリモート実行に隔離。今は外部 fetch のみなので egress の観点でドメイン許可を意識。~/.claudeの運用 — 既存の permissions(deny/ask)・gitleaks hook・block-secret-file-reads.sh・.env.op+op runは本ノートの credentials/permissions 層に対応。Anthropicsandbox-runtimeの導入余地(ローカルで Claude Code のコード実行を Seatbelt/bwrap で締める)を検討。
10. まとめ — 状況 → 使うもの早見表¶
| やりたいこと | 使うもの |
|---|---|
| 未信頼コードを最強隔離で実行 | Firecracker microVM(E2B / Vercel / Fly) |
| 軽量に syscall 面を絞る | gVisor(Modal / GKE Sandbox) |
| ローカルで Claude Code を締める | Anthropic sandbox-runtime(Seatbelt / bwrap+seccomp) |
| 情報窃取を止める(最重要) | egress default-deny allowlist + mitmproxy payload 検査 |
| 秘密を漏らさない | credential の JIT 注入 + 実行後 cleanup(vault 外出し) |
| 共有/個人データの権限分離 | SA(shared) と OAuth(personal) + impersonation |
| なぜ guardrail では不十分か | lethal trifecta(§7)=構造で断つ |
| 写経で手を動かす | lectures/sandbox_basics(9例)/ guardrails_basics |
参考リンク¶
講演: - 小谷悠久(Ubie)「Unleash true potential of LLM with sandbox」 https://speakerdeck.com/yukukotani/unleash-true-potential-of-llm-with-sandbox
隔離技術(一次資料): - gVisor security model https://gvisor.dev/docs/architecture_guide/security/ - Firecracker https://firecracker-microvm.github.io/ - Docker seccomp https://docs.docker.com/engine/security/seccomp/ - Anthropic「Claude Code sandboxing」 https://www.anthropic.com/engineering/claude-code-sandboxing / repo https://github.com/anthropic-experimental/sandbox-runtime - Anthropic「Code execution with MCP」 https://www.anthropic.com/engineering/code-execution-with-mcp - Anthropic「Managed agents(brain/hands 分離)」 https://www.anthropic.com/engineering/managed-agents - E2B https://e2b.dev/
プロバイダ: - Daytona https://www.daytona.io/docs/en/sandboxes/ / Modal https://modal.com/docs / Cloudflare Sandbox https://developers.cloudflare.com/sandbox/ / Vercel Sandbox https://vercel.com/docs/sandbox / Fly Machines https://fly.io/docs/reference/architecture/ - Hugging Face smolagents(secure code execution) https://huggingface.co/docs/smolagents/en/tutorials/secure_code_execution
セキュリティ概念: - Simon Willison「The lethal trifecta」 https://simonwillison.net/2025/Jun/16/the-lethal-trifecta/ - Google IAM: service account impersonation https://cloud.google.com/docs/authentication/use-service-account-impersonation
未確認の注記: 「OpenAI Code Interpreter = gVisor」「Anthropic Claude-on-web = gVisor」は第三者報告で公式ページ未確認。E2B の 80/200ms は公式、microVM/<5MiB 等の一部数値は Firecracker 由来の二次引用。mitmproxy egress 検査・JIT credential の細部はベンダー横断の慣用パターン(単一公式ではない)。
作成: 2026-06-16 / 最終更新: 2026-06-16