
sandbox-runtime v0.0.67
軽量なサンドボックスツールで、コンテナを必要とせずに、OSレベルで任意のプロセスに対してファイルシステムとネットワークの制限を適用します。
Anthropic Sandbox Runtime (srt)
コンテナを必要とせず、OSレベルで任意のプロセスにファイルシステムとネットワークの制限を適用するための軽量サンドボックスツールです。
srt はネイティブOSのサンドボックスプリミティブ(macOSでは sandbox-exec、Linuxでは bubblewrap)とプロキシベースのネットワークフィルタリングを使用します。エージェント、ローカルMCPサーバー、bashコマンド、および任意のプロセスの動作をサンドボックス化するために使用できます。
ベータリサーチプレビュー
Sandbox Runtimeは、より安全なAIエージェントを実現するために Claude Code 向けに開発されたリサーチプレビューです。より広範なエコシステムがより安全なエージェントシステムを構築できるよう支援するため、早期のオープンソースプレビューとして公開されています。これは早期のリサーチプレビューであるため、APIや設定フォーマットは進化する可能性があります。AIエージェントをデフォルトでより安全にするためのフィードバックと貢献を歓迎します!
インストール```bash
npm install -g @anthropic-ai/sandbox-runtime
## 基本的な使い方```bash
# Network restrictions
$ srt "curl anthropic.com"
Running: curl anthropic.com
<html>...</html> # Request succeeds
$ srt "curl example.com"
Running: curl example.com
Connection blocked by network allowlist # Request blocked
# Filesystem restrictions
$ srt "cat README.md"
Running: cat README.md
# Anthropic Sandb... # Current directory access allowed
$ srt "cat ~/.ssh/id_rsa"
Running: cat ~/.ssh/id_rsa
cat: /Users/ollie/.ssh/id_rsa: Operation not permitted # Specific file blocked
概要
このパッケージは、CLI ツールとしてもライブラリとしても使用できるスタンドアロンのサンドボックス実装を提供します。secure-by-default の哲学に基づいて設計されており、一般的な開発者のユースケースに合わせて調整されています。プロセスは最小限のアクセス権で起動し、必要な穴だけを明示的に開けます。
主な機能:
- ネットワーク制限: HTTP/HTTPS やその他のプロトコルを介してアクセスできるホスト/ドメインを制御
- ファイルシステム制限: 読み書きできるファイル/ディレクトリを制御
- Unix ソケット制限: ローカル IPC ソケットへのアクセスを制御
- 違反モニタリング: macOS では、システムのサンドボックス違反ログストアに接続してリアルタイムアラートを受信
ユースケース例: MCP サーバーのサンドボックス化
主要なユースケースの一つは、Model Context Protocol (MCP) サーバーをサンドボックス化してその機能を制限することです。例えば、ファイルシステム MCP サーバーをサンドボックス化するには:
サンドボックス化なし (.mcp.json):```json
{
"mcpServers": {
"filesystem": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem"]
}
}
}
**サンドボックス化あり** (`.mcp.json`):```json
{
"mcpServers": {
"filesystem": {
"command": "srt",
"args": ["npx", "-y", "@modelcontextprotocol/server-filesystem"]
}
}
}
次に、~/.srt-settings.json で制限を設定します:```json
{
"filesystem": {
"denyRead": [],
"allowWrite": ["."],
"denyWrite": ["~/sensitive-folder"]
},
"network": {
"allowedDomains": [],
"deniedDomains": []
}
}
これで、MCPサーバーは拒否されたパスへの書き込みがブロックされます:```
> Write a file to ~/sensitive-folder
✗ Error: EPERM: operation not permitted, open '/Users/ollie/sensitive-folder/test.txt'
仕組み
サンドボックスは OS レベルのプリミティブを使用して、プロセスツリー全体に適用される制限を強制します:
- macOS: 動的に生成された Seatbelt プロファイル を使用して
sandbox-execを実行します - Linux: ネットワーク名前空間の分離を伴うコンテナ化のために bubblewrap を使用します
- Windows: 専用の
srt-sandboxローカルユーザーアカウントの下でサンドボックス化されたプロセスを実行し、そのアカウントの SID をキーとする Windows Filtering Platform の egress フェンスと、作業ツリー上のセッションごとの明示的な ACE を適用します
0d1c612947c798aef48e6ab4beb7e8544da9d41a-4096x2305
二重分離モデル
効果的なサンドボックス化には、ファイルシステムとネットワークの両方の分離が必要です。ファイル分離がなければ、侵害されたプロセスが SSH キーやその他の機密ファイルを窃取する可能性があります。ネットワーク分離がなければ、プロセスがサンドボックスを脱出して無制限のネットワークアクセスを取得する可能性があります。
ファイルシステム分離 は読み取りと書き込みの制限を強制します:
- 読み取り (deny-then-allow パターン): デフォルトでは、読み取りアクセスはどこでも許可されます。広い領域 (例:
/Users) を拒否し、その中の特定のパス (例:.) を再許可することができます。allowReadはdenyReadより優先されます — これは書き込みとは逆で、denyWriteがallowWriteより優先されます。allowRead領域の内側にある、それよりも具体的なdenyReadエントリ (例:allowRead: ["."]を伴うdenyRead: ["**/.env"]や["./secrets"]) は、依然として拒否されたままです。 - 書き込み (allow-only パターン): デフォルトでは、書き込みアクセスはどこでも拒否されます。パス (例:
.、/tmp) を明示的に許可する必要があります。許可リストが空の場合、書き込みアクセスはありません。
ネットワーク分離 (allow-only パターン): デフォルトでは、すべてのネットワークアクセスが拒否されます。ドメインを明示的に許可する必要があります。allowedDomains リストが空の場合、ネットワークアクセスはありません。ネットワークトラフィックは、ホスト上で実行されているプロキシサーバーを経由してルーティングされます:
-
Linux: リクエストはファイルシステムを介して Unix ドメインソケット経由でルーティングされます。サンドボックス化されたプロセスのネットワーク名前空間は完全に削除されるため、すべてのネットワークトラフィックはホスト上で実行されているプロキシ (サンドボックスにバインドマウントされた Unix ソケットでリッスン) を経由する必要があります
-
macOS: Seatbelt プロファイルは、特定の localhost ポートへの通信のみを許可します。プロキシはこのポートでリッスンし、すべてのネットワークアクセスのための制御されたチャネルを作成します
-
Windows: マシン全体の WFP フィルターセットは、プロキシポート範囲へのループバックを除き、
srt-sandboxアカウントから発信されるすべてのアウトバウンド接続をブロックします。プロキシはその範囲内でリッスンし、すべてのネットワークアクセスのための制御されたチャネルを作成します
HTTP/HTTPS (HTTP プロキシ経由) とその他の TCP トラフィック (SOCKS5 プロキシ経由) の両方が、ドメインの許可リストと拒否リストを強制するこれらのプロキシによって仲介されます。
Claude Code でのサンドボックス化の詳細については、以下を参照してください:
- Claude Code Sandboxing Documentation
- Beyond Permission Prompts: Making Claude Code More Secure and Autonomous
アーキテクチャ```
src/ ├── index.ts # Library exports ├── cli.ts # CLI entrypoint (srt command) ├── utils/ # Shared utilities │ ├── debug.ts # Debug logging │ ├── settings.ts # Settings reader (permissions + sandbox config) │ ├── platform.ts # Platform detection │ └── exec.ts # Command execution utilities └── sandbox/ # Sandbox implementation ├── sandbox-manager.ts # Main sandbox manager ├── sandbox-schemas.ts # Zod schemas for validation ├── sandbox-violation-store.ts # Violation tracking ├── sandbox-utils.ts # Shared sandbox utilities ├── http-proxy.ts # HTTP/HTTPS proxy for network filtering ├── socks-proxy.ts # SOCKS5 proxy for network filtering ├── linux-sandbox-utils.ts # Linux bubblewrap sandboxing ├── macos-sandbox-utils.ts # macOS sandbox-exec sandboxing └── windows-sandbox-utils.ts # Windows srt-win sandboxing
## 使用方法
### CLI ツールとして
`srt` コマンド(Anthropic Sandbox Runtime)は、あらゆるコマンドをセキュリティ境界でラップします:```bash
# Run a command in the sandbox
srt echo "hello world"
# With debug logging
srt --debug curl https://example.com
# Specify custom settings file
srt --settings /path/to/srt-settings.json npm install
ライブラリとして```typescript
import { SandboxManager, type SandboxRuntimeConfig, } from '@anthropic-ai/sandbox-runtime' import { spawn } from 'child_process'
// Define your sandbox configuration const config: SandboxRuntimeConfig = { network: { allowedDomains: ['example.com', 'api.github.com'], deniedDomains: [], }, filesystem: { denyRead: ['~/.ssh'], allowWrite: ['.', '/tmp'], denyWrite: ['.env'], }, }
// Initialize the sandbox (starts proxy servers, etc.) await SandboxManager.initialize(config)
// Wrap a command with sandbox restrictions const sandboxedCommand = await SandboxManager.wrapWithSandbox( 'curl https://example.com', )
// Execute the sandboxed command const child = spawn(sandboxedCommand, { shell: true, stdio: 'inherit' })