
オープンソースのサンドボックス化されたAIエージェント向けランタイム — gVisor/Docker分離、認証情報ボールト、不変監査ログ。CVE-2026-25253後に構築。
AIエージェント向けオープンソースのサンドボックスランタイム
AIエージェントを自信を持って実行。各エージェントには独自の権限スコープ、認証情報ボールト、監査証跡、キルスイッチが付与されます。
2026年1月27日、CVE-2026-25253 はエージェント型AIシステムに割り当てられた初のCVEとなりました。OpenClawの重大なWebSocketハイジャック脆弱性により、公開されたインスタンス(localhostにのみバインドされたものを含む)に対してワンクリックでリモートコード実行が可能になりました。
同じ週に、ClawHavocキャンペーンは341以上の悪意のあるスキルをOpenClawのマーケットプレイスに侵入させました。ClawHubからインストールされたすべてのスキルは、OpenClaw自体と同じ権限(フルディスクアクセス、OAuthトークン、APIキー)で実行されました。サンドボックスなし。監査証跡なし。キルスイッチなし。
「ClawHubからスキルをインストールすると、OpenClaw自体と同じリソースへのアクセスが付与されます。デフォルトではスキル間にサンドボックス分離はありません。」 — DEV Community セキュリティ分析、2026年4月
数字で見る現状:
AgentBoxは構造的な修正です。パッチではなく、ランタイムです。
実行する各エージェントには以下が付与されます:
AgentBox導入前 AgentBox導入後
───────────────── ──────────────
エージェント → フルディスク ❌ エージェント → 許可されたパスのみ ✅
エージェント → 全ネットワーク ❌ エージェント → 許可されたホストのみ ✅
エージェント → 生のシークレット ❌ エージェント → スコープ付きトークン ✅
監査証跡なし ❌ すべてのアクションを記録 ✅
キルスイッチなし ❌ 100ms未満でキル ✅
スキルはrootで実行 ❌ カーネル分離サンドボックス ✅
# インストール
go install github.com/siyad01/agentbox/cmd/agentbox@latest
# 実行前にマニフェストを検証
agentbox validate manifests/email-sorter.yaml
# サンドボックスでエージェントを実行
agentbox run --manifest manifests/email-sorter.yaml python agent.py
# エージェントが行ったことを確認
agentbox audit --log logs/email-sorter-audit.log
# ログが改ざんされていないことを検証
agentbox verify logs/email-sorter-audit.log
# シークレットを管理
agentbox vault add ANTHROPIC_API_KEY
agentbox vault list
各エージェントは必要なものだけを正確に宣言します。リストにないものにはアクセスできません。
name: "email-sorter"
version: "1.0.0"
description: "受信トレイを読み取り、メールを分類し、仕分けフォルダに書き込む"
runtime: docker # または: gvisor (カーネルレベル), firecracker (MicroVM)
permissions:
filesystem:
read:
- "~/Documents/inbox"
write:
- "~/Documents/sorted"
deny: # 読み取りリストにあっても常にブロック
- "~/.ssh"
- "~/.aws"
- "~/.config"
- "/etc"
network:
allow:
- "api.anthropic.com"
- "gmail.googleapis.com"
deny:
- "*" # それ以外はすべてブロック
tools:
allow:
- "read_file"
- "write_file"
- "list_*"
deny:
- "execute_shell" # シェルアクセスは一切不可
- "*_delete" # 削除ツールは不可
credentials:
- ANTHROPIC_API_KEY # 実行時にボールトから注入
- GMAIL_TOKEN # エージェントは生の値を決して見ない
limits:
max_tokens: 50000 # LLMトークン予算
max_duration: "30m" # 30分後にキル
max_memory_mb: 256 # RAM上限
max_requests: 500 # 最大ツール呼び出し回数
audit:
log_level: full
alert_on:
- filesystem_deny
- network_deny
- token_budget_80pct
log_path: "logs/email-sorter-audit.log"
agentbox run --manifest agent.yaml python agent.py
│
▼
┌─────────────────────────────────────────────────────┐
│ ポリシーエンジン │
│ マニフェスト解析 → 許可/拒否リストを構築 │
│ 署名を検証 → 未署名スキルを拒否 │
│ ボールトから認証情報を注入 │
└──────────────────────┬──────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────┐
│ 分離レイヤー │
│ │
│ Docker → コンテナ + seccomp + cap-drop │
│ gVisor → ユーザースペースカーネル、システムコール傍受│
│ Firecracker → エージェントごとに専用MicroVMカーネル │
│ │
│ ファイルシステム: 宣言されたパスのみマウント │
│ ネットワーク: 宣言されたホストのみ到達可能 │
│ ケーパビリティ: すべて破棄、追加なし │
└──────────────────────┬──────────────────────────────┘
│
┌────────────┼────────────┐
▼ ▼ ▼
監査ロガー 認証情報 リソース
(ハッシュチェーン) ボールト モニター
すべてのアクション AES-256-GCM 自動キル
を記録 スコープ付きトークン 制限時
他のサンドボックスはコンテナ境界で止まります。カーネル脆弱性を悪用するエージェントは脱出できます。
gVisorはすべてのシステムコールをホストカーネルに到達する前に傍受します:
エージェントの試み: write("/home/user/.ssh/id_rsa")
│
▼
gVisorユーザースペースカーネル
│
拒否リストにパスがある? → YES
│
▼
EPERMが即座に返される
ホストカーネルはこのシステムコールを決して見ない
プロンプトインジェクションはこの層を越えられない
agentbox <command> [options]
コマンド:
run サンドボックスでエージェントを実行
validate マニフェストファイルを検証
kill 実行中のエージェントを終了
audit エージェントの監査ログを表示
verify 監査ログの整合性を検証
vault 暗号化された認証情報を管理
serve REST APIサーバーを起動
version バージョンを表示
例:
agentbox validate manifests/email-sorter.yaml
agentbox run --manifest manifests/email-sorter.yaml python agent.py
agentbox kill agent-abc123
agentbox audit --log logs/email-sorter.log --deny
agentbox audit --log logs/email-sorter.log --last 1h
agentbox verify logs/email-sorter.log
agentbox vault add ANTHROPIC_API_KEY
agentbox vault list
agentbox vault delete OLD_KEY
agentbox serve :8081
agentbox serve で起動します(デフォルト: :8081)。
# 実行中のエージェントを一覧表示
curl http://localhost:8081/api/agents
# エージェントを起動
curl -X POST http://localhost:8081/api/agents \
-H "Content-Type: application/json" \
-d '{"manifest":"manifests/email-sorter.yaml","command":["python","agent.py"]}'
# エージェントをキル
curl -X DELETE http://localhost:8081/api/agents/abc123
# 監査ログを照会
curl "http://localhost:8081/api/audit?deny=true&agent=email-sorter"
すべてのエージェントアクションは、追記専用でハッシュチェーン化されたJSON Linesファイルに記録されます:
{"id":1,"hash":"a3f2...","prev_hash":"genesis","timestamp":"2026-05-05T09:00:00Z","agent_id":"abc123","agent_name":"email-sorter","event_type":"agent_start","allowed":true,"resource":"manifests/email-sorter.yaml"}
{"id":2,"hash":"b7c1...","prev_hash":"a3f2...","timestamp":"2026-05-05T09:00:01Z","agent_id":"abc123","agent_name":"email-sorter","event_type":"filesystem_allow","allowed":true,"resource":"read:/home/user/Documents/inbox/mail.txt","rule":"filesystem.read: ~/Documents/inbox"}
{"id":3,"hash":"d9e4...","prev_hash":"b7c1...","timestamp":"2026-05-05T09:00:01Z","agent_id":"abc123","agent_name":"email-sorter","event_type":"filesystem_deny","allowed":false,"resource":"read:/home/user/.ssh/id_rsa","rule":"filesystem.deny: ~/.ssh","reason":"path is explicitly denied"}
改ざん検知:
agentbox verify logs/email-sorter-audit.log
✅ 監査ログは無傷です
エントリ: 47 (ID 1–47)
ハッシュチェーン: 途切れなし
どのエントリの1文字でも変更すると、検証は即座に失敗します — チェーンが壊れるからです。
# シークレットを保存(ログに記録されず、環境変数に平文で置かれない)
agentbox vault add ANTHROPIC_API_KEY
# 保存された認証情報名を一覧表示(値は決して表示されない)
agentbox vault list
# 認証情報が復号できることを検証
agentbox vault test ANTHROPIC_API_KEY
# 認証情報をローテーション
agentbox vault add ANTHROPIC_API_KEY # addは既存を更新
認証情報はAES-256-GCMで暗号化されます。マスターキーはボールトパスワードから導出され、ディスクに保存されることはありません。エージェント起動時に、AgentBoxは認証情報をスコープ付き環境変数として注入します。エージェントは通常どおり os.getenv("ANTHROPIC_API_KEY") を呼び出します — ボールトには触れません。
AgentBoxは宣言された制限を超えたエージェントをキルします:
# このエージェントは max_duration: 5s で設定されています
agentbox run --manifest manifests/timeout-test.yaml python long_running_agent.py
Agent started
tick 1
tick 2
tick 3
tick 4
tick 5
🛑 Killing agent timeout-test: duration limit exceeded: 5s
⚠️ Agent timeout-test exited code 137 in 5.2s
終了コード137 = SIGKILL。クリーンなシャットダウン、最終監査エントリが書き込まれます。
# クローン
git clone https://github.com/siyad01/agentbox
cd agentbox
# ビルド
go build -o agentbox ./cmd/agentbox/
# テストを実行(27テスト、すべて成功)
go test ./...
# グローバルにインストール
go install ./cmd/agentbox/
要件:
agentbox/
├── cmd/agentbox/main.go ← CLIエントリポイント
├── internal/
│ ├── policy/
│ │ ├── manifest.go ← YAMLマニフェストスキーマ
│ │ ├── parser.go ← 検証 + デフォルト値
│ │ └── engine.go ← 拒否優先の決定エンジン(20テスト)
│ ├── audit/
│ │ ├── logger.go ← 追記専用SHA-256ハッシュチェーンログ
│ │ ├── verifier.go ← 改ざん検知
│ │ └── reader.go ← 照会 + フィルタ
│ ├── vault/
│ │ ├── store.go ← AES-256-GCM暗号化認証情報ストア
│ │ └── injector.go ← 実行時注入(7テスト)
│ ├── sandbox/
│ │ ├── sandbox.go ← Sandboxインターフェース
│ │ ├── docker.go ← Dockerバックエンド
│ │ ├── gvisor.go ← gVisorバックエンド(カーネルレベル)
│ │ ├── manager.go ← エージェントライフサイクル管理
│ │ └── util.go ← WSL2検出、パスヘルパー
│ ├── monitor/
│ │ └── enforcer.go ← リソース制限 + 自動キル
│ └── api/
│ └── server.go ← :8081のREST API
└── manifests/
├── email-sorter.yaml ← 本番用の例
└── timeout-test.yaml ← 制限強制の例
デフォルトで拒否優先。 エージェントはゼロ権限で開始します。すべてのケーパビリティは明示的に宣言する必要があります。
拒否リストが常に優先。 パスが読み取りリストと拒否リストの両方にある場合でも、拒否リストが優先されます。例外はありません。
gVisorによるカーネルレベルの強制。 seccompフィルタとケーパビリティ破棄はシステムコール境界で動作します。攻撃者が制御可能なモデル出力はユーザースペースで実行され、カーネルレベルのポリシーを変更できません。
認証情報の分離。 ボールトのマスターキーはディスクに保存されません。認証情報はサンドボックス起動時に短命のスコープ付きトークンとして注入され、終了時に破棄されます。エージェントプロセスの侵害は認証情報ボールトの侵害にはつながりません。
不変の監査証跡。 SHA-256ハッシュチェーンにより、事後的なログ改変が検出可能です。どのエントリの変更も、その時点以降のチェーンを壊します。
脆弱性の報告については SECURITY.md を参照してください。
CONTRIBUTING.md を参照してください。
Apache 2.0 — 自由に使用、変更、配布できます。LICENSE を参照してください。
Goで構築 · コアセキュリティ機能に外部依存ゼロ · ワンコマンドでセルフホスト可能
CVE-2026-25253が気になったなら、これが修正です。⭐を付けてください
| 保護 | 仕組み |
|---|
| ゼロトラスト権限 | エージェントは必要なものだけを正確に宣言します。それ以外にはアクセスできません。 |
| カーネルレベルの分離 | gVisorがすべてのシステムコールを傍受します。プロンプトインジェクションはこの境界を越えられません。 |
| 認証情報ボールト | AES-256-GCM暗号化。エージェントは生のシークレットを決して見ません。スコープ付きトークンのみです。 |
| 不変の監査ログ | SHA-256ハッシュチェーン。すべてのアクションが記録されます。改ざん検知可能です。 |
| キルスイッチ | 100ms未満で任意のエージェントを終了。制限違反時は自動キル。 |
| リソース制限 | 時間、メモリ、リクエスト数 — 設定時ではなく実行時に強制されます。 |
| メソッド | エンドポイント | 説明 |
|---|
| GET | /health | ヘルスチェック |
| GET | /dashboard | Webダッシュボード |
| GET | /api/agents | 全エージェントを一覧表示 |
| POST | /api/agents | 新しいエージェントを起動 |
| DELETE | /api/agents/:id | エージェントをキル |
| GET | /api/audit | 監査ログを照会 |
| 機能 | AgentBox | OpenClawサンドボックス | Dockerのみ | AccuKnox |
|---|
| オープンソース(Apache 2.0) | ✅ | ✅ | ✅ | ❌ |
| セルフホスト可能 | ✅ | ✅ | ✅ | K8sのみ |
| gVisor / カーネル分離 | ✅ | ❌ | ❌ | ✅ |
| 認証情報ボールト | ✅ | ❌ | ❌ | ✅ |
| 不変の監査ログ | ✅ | ❌ | ❌ | ✅ |
| 制限違反時の自動キル | ✅ | ❌ | ❌ | ✅ |
| フレームワーク非依存 | ✅ | ❌ (OpenClawのみ) | ✅ | ✅ |
| 単一バイナリ展開 | ✅ | ❌ | ✅ | ❌ |