コンテンツにスキップ

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 等に接続)。長時間自律実行を阻むのは:

  1. 無限の権限承認 — コマンド単位の HITL は 15 時間級モデルの能力を殺す。かといって YOLO(全許可)は危険。allowlist/blocklist の保守も破綻しがち。
  2. 情報アクセス制限 — 長いタスクには探索が要るが、データ漏洩リスクが高い。アクセス範囲の綱引き。
  3. 環境衝突 — 並行プロセスの競合(ポート、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
  1. 計算隔離(compute) — セッション単位の microVM(自前カーネル)。E2B/Vercel/Fly が Firecracker、Modal/GKE Sandbox が gVisor、Cloudflare Dynamic Workers が V8 isolate(軽いが境界は弱い)。
  2. ファイルシステム — sandbox ごとに専用 FS。Docker なら cap_drop=ALL + USER nobody + no-new-privileges、Linux なら Landlock。
  3. ネットワーク egress(最重要・load-bearing) — default-deny の許可ドメイン allowlist + mitmproxy で双方向 payload 検査(許可ドメイン内に隠した exfil も捕る)。sandbox の壁を抜かれても情報窃取を止める最後の砦。
  4. credential(JIT 注入) — 秘密は vault に暗号化保管し、実行直前に注入+実行後に cleanup。プロンプトやツールスキーマには絶対載せない(model context に echo させない)。短命・最小スコープ・自動失効(Zero Standing Privileges)。Ubie は bash 実行直前に JIT 注入。
  5. 権限スコープ分離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) → stringClaude が生成する未信頼コードは 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つが揃った時だけ危険:

  1. private data へのアクセス(エージェントツールの目的そのもの)
  2. untrusted content への暴露(攻撃者が制御するテキスト/画像が LLM に届く経路)
  3. 外部通信能力(窃取の出口=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 層に対応。Anthropic sandbox-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