
2026/03/30 23:32
**Show HN:** 「Zerobox – ファイル・ネットワーク・認証情報を制御して任意のコマンドをサンドボックス化」
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
Summary:
Zerobox は軽量でクロスプラットフォームのサンドボックスです。デフォルトではプロセスを隔離し、書き込みやネットワークトラフィック、およびほとんどの環境変数へのアクセスをブロックします。ただし、明示的な権限が付与される場合のみ例外となります。コマンドラインフラグ(例:
--allow-read, --deny-net)または SDK オプションでアクセス制御を行い、プロキシ経由で秘密情報を注入し、macOS では Seatbelt、Linux では Bubblewrap + Seccomp といった OS 固有の隔離層に依存します。ベンチマーク結果から、オーバーヘッドは約10 ms程度と低く、メモリ使用量も控えめであるため、ローカル開発や AI 生成コード実行に適しています。
Rust/Cargo で構築され、シェルスクリプトまたはソースビルドを通じてインストールでき、現在は macOS / Linux に対応し、Windows のサポートが予定されています。今後のリリースでは Windows サポートの追加、TypeScript を超えた SDK バインディングの拡張、およびネットワーク/秘密情報に対するより細粒度の制御を導入します。このツールは CI パイプラインや LLM ツーリング向けで、コンテナの重いオーバーヘッドなしに不信頼コードを安全に実行できるよう設計されています。
開発者向けには、潜在的に危険なスクリプトをローカルで最小限のリスクで迅速に走らせる手段を提供します。組織向けには、エッジデバイスや継続的インテグレーションワークフローといったリソースが制約された環境でより厳格なセキュリティポリシーを実施できるようにします。
Summary Skeleton
What the text is mainly trying to say (main message)
Zerobox は軽量でクロスプラットフォームのサンドボックスです。デフォルトではプロセスを隔離し、書き込みやネットワークトラフィック、およびほとんどの環境変数へのアクセスをブロックします。ただし、明示的な権限が付与される場合のみ例外となります。
Evidence / reasoning (why this is said)
ツールはコマンドラインフラグや SDK オプション(
--allow-read, --deny-net など)を通じて隔離を実現し、プロキシで秘密情報を注入し、OS 固有の隔離層(macOS の Seatbelt、Linux の Bubblewrap + Seccomp)を導入しています。パフォーマンステストでは約10 msのオーバーヘッドと控えめなメモリ使用量が確認されています。
Related cases / background (context, past events, surrounding info)
Zerobox は Rust/Cargo で構築され、シェルスクリプトまたはソースビルドを通じてインストールでき、macOS と Linux に完全に対応し、Windows のサポートが予定されています。これは Docker などのサンドボックスツールの傾向に沿いつつ、ローカル開発や AI 生成コード実行のために格段に軽量化したものです。
What may happen next (future developments / projections written in the text)
今後のリリースでは Windows サポートが追加され、TypeScript を超えた SDK 言語バインディングが拡張され、ネットワークや秘密情報に対するより細粒度の制御が導入される可能性があります。ツールは CI パイプラインと LLM ツーリングで不信頼コードを安全に実行するために位置付けられています。
What impacts this could have (users / companies / industry)
開発者はローカルで不信頼スクリプトや AI 出力を最小限のリスクで実行でき、組織は完全なコンテナ化のオーバーヘッドなしにより厳格なセキュリティポリシーを適用できます。軽量性により、エッジデバイスや継続的インテグレーション環境といったリソースが制約された場面で採用が進む可能性があります。
本文
ファイル・ネットワーク・認証情報を制御したサンドボックス化
OpenAI Codex のサンドボックスランタイムで実現する、軽量かつクロスプラットフォームのプロセスサンドボックス。
- デフォルトで拒否:書き込み、ネットワーク、環境変数は明示的に許可しない限りブロック。
- 認証情報注入:プロセスが直接見られないよう API キーを渡す;Zerobox は承認されたホストのみに実際の値を注入。
- ファイルアクセス制御:特定パスへの読み書きを許可または拒否。
- ネットワークフィルタリング:ドメイン単位でアウトバウンド通信を許可/拒否。
- クリーン環境:PATH、HOME など必須の env のみデフォルト継承。
- TypeScript SDK:
(Deno風 API)。import { Sandbox } from "zerobox" - クロスプラットフォーム:macOS と Linux に対応;Windows は計画中。
- 単一バイナリ:Docker や VM 不要、オーバーヘッドは約 10 ms。
インストール
Shell (macOS / Linux)
curl -fsSL https://raw.githubusercontent.com/afshinm/zerobox/main/install.sh | sh
npm
npm install zerobox
ソースからビルド
git clone https://github.com/afshinm/zerobox && cd zerobox ./scripts/sync.sh && cargo build --release -p zerobox
速攻開始
- 書き込みとネットワークを許可しないコマンド実行:
zerobox -- node -e "console.log('hello')"
- 特定ディレクトリへの書き込み許可:
zerobox --allow-write=. -- node script.js
- 特定ドメインへのネットワーク許可:
zerobox --allow-net=api.openai.com -- node agent.js
- 特定ホストにのみシークレットを渡す(内部プロセスは実際の値を見ない):
zerobox \ --secret OPENAI_API_KEY=sk-proj-123 \ --secret-host OPENAI_API_KEY=api.openai.com \ -- node agent.js
TypeScript SDK
import { Sandbox } from "zerobox"; const sandbox = Sandbox.create({ secrets: { OPENAI_API_KEY: { value: process.env.OPENAI_API_KEY, hosts: ["api.openai.com"], }, }, }); const output = await sandbox.sh`node agent.js`.text();
アーキテクチャ
Secrets
API キー・トークンなどのシークレットはサンドボックス内では決して表示されない。
プロセスにはプレースホルダーが渡り、ネットワークプロキシレベルで要求されたホストに対してのみ実際の値を差し替える。
例:
# サンドボックス内 echo $OPENAI_API_KEY # → ZEROBOX_SECRET_a1b2c3d4... curl -H "Authorization: Bearer $OPENAI_API_KEY" https://api.openai.com/... # プロキシがプレースホルダーを実際のキーに置き換えて送信
CLI の使用
zerobox \ --secret OPENAI_API_KEY=sk-proj-123 \ --secret-host OPENAI_API_KEY=api.openai.com \ -- node app.js
--secret-host を省略すると、シークレットはすべてのドメインに渡る。
zerobox --secret TOKEN=abc123 -- node app.js
複数のシークレットとホストを組み合わせられる。
注意:Node.js の
はデフォルトでfetchを尊重しない。サンドボックス内でシークレットを使う場合はHTTPS_PROXY引数を渡す。--use-env-proxy
TypeScript SDK
import { Sandbox } from "zerobox"; const sandbox = Sandbox.create({ secrets: { OPENAI_API_KEY: { value: process.env.OPENAI_API_KEY, hosts: ["api.openai.com"], }, GITHUB_TOKEN: { value: process.env.GITHUB_TOKEN, hosts: ["api.github.com"], }, }, }); await sandbox.sh`node agent.js`.text();
環境変数
デフォルトでは PATH、HOME、USER、SHELL、TERM、LANG のみ継承。
-
親プロセスのすべてを継承:
zerobox --allow-env -- node app.js -
指定した env だけ継承:
zerobox --allow-env=PATH,HOME,DATABASE_URL -- node app.js -
特定の env をブロック:
zerobox --allow-env --deny-env=AWS_SECRET_ACCESS_KEY -- node app.js -
環境変数を設定:
zerobox --env NODE_ENV=production --env DEBUG=false -- node app.js
TypeScript SDK
const sandbox = Sandbox.create({ env: { NODE_ENV: "production" }, allowEnv: ["PATH", "HOME"], denyEnv: ["AWS_SECRET_ACCESS_KEY"], });
例
AI が生成したコードを安全に実行
zerobox -- python3 /tmp/task.py
出力ディレクトリへの書き込みのみ許可:
zerobox --allow-write=/tmp/output -- python3 /tmp/task.py
SDK を使う場合:
import { Sandbox } from "zerobox"; const sandbox = Sandbox.create({ allowWrite: ["/tmp/output"], allowNet: ["api.openai.com"], }); const result = await sandbox.sh`python3 /tmp/task.py`.output(); console.log(result.code, result.stdout);
LLM ツール呼び出しを制限
各 AI ツール呼び出しは個別にサンドボックス化可能。
import { Sandbox } from "zerobox"; const reader = Sandbox.create(); const writer = Sandbox.create({ allowWrite: ["/tmp"] }); const fetcher = Sandbox.create({ allowNet: ["example.com"] }); const data = await reader.js` const content = require("fs").readFileSync("/tmp/input.txt", "utf8"); console.log(JSON.stringify({ content })); `.json(); await writer.js` require("fs").writeFileSync("/tmp/output.txt", "result"); console.log("ok"); `.text(); const result = await fetcher.js` const res = await fetch("https://example.com"); console.log(JSON.stringify({ status: res.status })); `.json();
完全動作例:
– シークレット付きでエージェントプロセス全体をサンドボックス化(API キーは可視化されない)。examples/ai-agent-sandboxed
– Vercel AI SDK でツールごとにサンドボックス化し、シークレットを使用。examples/ai-agent
– Vercel Workflow の耐久ステップをサンドボックス化。examples/workflow
ビルド時にリポジトリを保護
# ネットワークアクセスが必要なビルドスクリプト zerobox --allow-write=./dist --allow-net -- npm run build # ネットワークなしでテスト(外部呼び出しの誤検知) zerobox --allow-write=/tmp -- npm test
SDK 参照
シェルコマンド
import { Sandbox } from "zerobox"; const sandbox = Sandbox.create({ allowWrite: ["/tmp"] }); const output = await sandbox.sh`echo hello`.text();
JSON 出力
const data = await sandbox.sh`cat data.json`.json();
生出力(非ゼロ終了時にエラーを投げない)
const result = await sandbox.sh`exit 42`.output(); // { code: 42, stdout: "", stderr: "" }
明示的なコマンド + 引数
await sandbox.exec("node", ["-e", "console.log('hi')"]).text();
インライン JavaScript
const data = await sandbox.js` console.log(JSON.stringify({ sum: 1 + 2 })); `.json();
エラーハンドリング
非ゼロ終了コードは
SandboxCommandError を投げる。
import { Sandbox, SandboxCommandError } from "zerobox"; const sandbox = Sandbox.create(); try { await sandbox.sh`exit 1`.text(); } catch (e) { if (e instanceof SandboxCommandError) { console.log(e.code); // 1 console.log(e.stderr); } }
キャンセル
const controller = new AbortController(); await sandbox.sh`sleep 60`.text({ signal: controller.signal });
パフォーマンス
サンドボックスのオーバーヘッドは最小で、通常約10 msと7 MB程度。
| コマンド | ベア | サンドボックス化 | オーバーヘッド |
|---|---|---|---|
| <1 ms | +10 ms | 1.2 MB → 8.4 MB |
| 10 ms | +10 ms | 39.3 MB → 39.1 MB |
| 10 ms | +10 ms | 12.9 MB → 13.0 MB |
| <1 ms | +10 ms | 1.9 MB → 8.4 MB |
| 50 ms | +10 ms | 7.2 MB → 8.4 MB |
Apple M5 Pro のウォームアップ後、10 回のベスト実行で測定。再現は
./bench/run.sh を実行。
プラットフォームサポート
| プラットフォーム | バックエンド | ステータス |
|---|---|---|
| macOS | Seatbelt (sandbox‑exec) | 完全対応 |
| Linux | Bubblewrap + Seccomp + Namespaces | 完全対応 |
| Windows | Restricted Tokens + ACLs + Firewall | 予定 |
CLI 参照
| フラグ | 例 | 説明 |
|---|---|---|
| | 指定パスのみ読み取りを許可。システムライブラリはアクセス可能。デフォルト: すべての読み込みが許可。 |
| | これらのパスからの読み取りをブロック。 より優先。 |
| | 指定パスへの書き込みを許可。値が無いと全域を書き込み可能に。デフォルト: 書き込み不可。 |
| | これらのパスへの書き込みをブロック。 より優先。 |
| | アウトバウンドネットワークを許可。値が無いと全域で許可。デフォルト: ネットワーク不可。 |
| | これらのドメインへの通信をブロック。 より優先。 |
| | サンドボックス内に env を設定。複数回指定可。 |
| | 親プロセスの env を継承。値が無いとすべて継承。デフォルト: PATH、HOME、USER、SHELL、TERM、LANG のみ。 |
| | 親から継承される env を除外。 より優先。 |
| | シークレットを渡す。プロセスはプレースホルダーのみ受け取り、許可されたホストに対して実際の値が注入される。 |
| | シークレットを特定ホストに限定。未指定ならすべてのホストで置換。 |
| | すべてのファイルシステムとネットワーク権限を付与。env とシークレットは引き続き制御。 |
| | サンドボックスを完全に無効化。 |
| | 完全サンドボックス(bubblewrap)を必須にし、弱い隔離にフォールバックしない。 |
| | サンドボックス設定とプロキシ決定を stderr に出力。 |
| | サンドボックス化されたコマンドの作業ディレクトリを設定。 |
| | バージョン情報を表示。 |
| | ヘルプを表示。 |
ライセンス
Apache‑2.0