**Show HN:** 「Zerobox – ファイル・ネットワーク・認証情報を制御して任意のコマンドをサンドボックス化」

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
    import { Sandbox } from "zerobox"
    (Deno風 API)。
  • クロスプラットフォーム: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();

完全動作例:

  • examples/ai-agent-sandboxed
    – シークレット付きでエージェントプロセス全体をサンドボックス化(API キーは可視化されない)。
  • examples/ai-agent
    – Vercel AI SDK でツールごとにサンドボックス化し、シークレットを使用。
  • examples/workflow
    – Vercel 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程度。

コマンドベアサンドボックス化オーバーヘッド
echo hello
<1 ms+10 ms1.2 MB → 8.4 MB
node -e '...'
10 ms+10 ms39.3 MB → 39.1 MB
python3 -c '...'
10 ms+10 ms12.9 MB → 13.0 MB
cat 10 MB file
<1 ms+10 ms1.9 MB → 8.4 MB
curl https://...
50 ms+10 ms7.2 MB → 8.4 MB

Apple M5 Pro のウォームアップ後、10 回のベスト実行で測定。再現は

./bench/run.sh
を実行。


プラットフォームサポート

プラットフォームバックエンドステータス
macOSSeatbelt (sandbox‑exec)完全対応
LinuxBubblewrap + Seccomp + Namespaces完全対応
WindowsRestricted Tokens + ACLs + Firewall予定

CLI 参照

フラグ説明
--allow-read <paths>
--allow-read=/tmp,/data
指定パスのみ読み取りを許可。システムライブラリはアクセス可能。デフォルト: すべての読み込みが許可。
--deny-read <paths>
--deny-read=/secret
これらのパスからの読み取りをブロック。
--allow-read
より優先。
--allow-write [paths]
--allow-write=.
指定パスへの書き込みを許可。値が無いと全域を書き込み可能に。デフォルト: 書き込み不可。
--deny-write <paths>
--deny-write=./.git
これらのパスへの書き込みをブロック。
--allow-write
より優先。
--allow-net [domains]
--allow-net=example.com
アウトバウンドネットワークを許可。値が無いと全域で許可。デフォルト: ネットワーク不可。
--deny-net <domains>
--deny-net=evil.com
これらのドメインへの通信をブロック。
--allow-net
より優先。
--env <KEY=VALUE>
--env NODE_ENV=prod
サンドボックス内に env を設定。複数回指定可。
--allow-env [keys]
--allow-env=PATH,HOME
親プロセスの env を継承。値が無いとすべて継承。デフォルト: PATH、HOME、USER、SHELL、TERM、LANG のみ。
--deny-env <keys>
--deny-env=SECRET
親から継承される env を除外。
--allow-env
より優先。
--secret <KEY=VALUE>
--secret API_KEY=sk-123
シークレットを渡す。プロセスはプレースホルダーのみ受け取り、許可されたホストに対して実際の値が注入される。
--secret-host <KEY=HOSTS>
--secret-host API_KEY=api.openai.com
シークレットを特定ホストに限定。未指定ならすべてのホストで置換。
-A, --allow-all
-A
すべてのファイルシステムとネットワーク権限を付与。env とシークレットは引き続き制御。
--no-sandbox
--no-sandbox
サンドボックスを完全に無効化。
--strict-sandbox
--strict-sandbox
完全サンドボックス(bubblewrap)を必須にし、弱い隔離にフォールバックしない。
--debug
--debug
サンドボックス設定とプロキシ決定を stderr に出力。
-C <dir>
-C /workspace
サンドボックス化されたコマンドの作業ディレクトリを設定。
-V, --version
--version
バージョン情報を表示。
-h, --help
--help
ヘルプを表示。

ライセンス

Apache‑2.0


同じ日のほかのニュース

一覧に戻る →

2026/04/02 8:35

新しいC++バックエンド for `ocamlc`

## 日本語訳: 新しいC++バックエンドが `ocamlc` に追加され、インクリメントされていない C ランタイムと外部関数インタフェースを置き換えました。著者は、ユーザーが指定した上限まで素数を生成するプログラムでその使用例を示しています。このプログラムは OCaml の List モジュールの一部を純粋に関数型スタイルで再実装しています。プログラムは `primes.cpp` という慣用的な C++ コードへ翻訳され、`Cons`、`I`、`ifthenelse` などのテンプレートメタプログラミング構造を含みます。`g++ -Dlimit=100 primes.cpp` でコンパイルすると、`print` が型ではないためにコンパイラー風エラーが発生し、出力形式は古い C プリプロセッサのエラー(OCaml の `::` の代わりにネストされた `Cons<hd, tl>`)を模倣します。生成されたコードはデフォルトテンプレート深度を増やす (`-ftemplate-depth=999999`) ことでのみ大きな上限を扱うことができます。著者のマシンでは、`limit = 10000` を実行すると約 30 秒で 10000 以下のすべての素数が出力され、約 11 GiB のメモリを使用します。clang++ は遅く、セグフォールトする可能性があります。アルゴリズム自体は非効率的です——コンテナライブラリからの優先度付きキュー/レフトヒープに基づく改良された純粋関数型素数生成器は、同じ上限で実行時間を約 8 秒、メモリ使用量を約 3.1 GiB に削減します。今後の作業では、このアプローチを他言語へ拡張することが目標です;Rust は部分的な実装特殊化がサポートされれば OCaml プログラムを実行できるようになります。 この改訂された要約は、すべての主要ポイントを反映し、不当な推測を避け、明確な主旨を提示し、あいまいまたは混乱を招く表現を排除しています。

2026/04/02 2:11

NASAの「アーテミス II」クルーが月へ発進します

## Japanese Translation: > **Artemis II 発射成功:** オリオンのソーラーアレイ翼が午後6時59分に完全展開し、各翼は約15,000セルを含み、およそ63フィート(19メートル)にわたります。 > > **主要推進マイルストーン:** 固体ロケットブースターが午後6時37分に分離;SLSコアステージの主エンジンカットオフは午後6時43分に発生;その後、コアステージ分離が午後6時59分に行われ、最初の推進フェーズが終了しました。 > > **打ち上げタイミング:** 打ち上げウィンドウは午後6時24分(EDT)で開き、ロケットコンプレックス-39Bからの離陸は午後6時35分に実施されました。 > > **事前準備:** 最終天気ブリーフィング(約80%が許可)、クルー服チェック、ハッチ閉鎖、打ち上げ中止システム検証をカウントダウン前に完了しました。コアステージとICPSのタンク作業はLH₂/LOX のスロー・フィル→ファスト・フィル→リペンリッシュ段階で行われました。 > > **離陸後の計画マヌーバー:** オリオンは低軌道上昇マヌーバー(PRM)を実施し、その後遠地点上昇バーナー(ARB)で深宇宙軌道を形成します。 > > **クルーと運用:** 乗員の4名は司令官レイド・ウィズマン、パイロットビクター・グローバー、クリスティーナ・コッホ、およびCSA宇宙飛行士ジェレミー・ハンセンです。NASAはケネディ宇宙センターで午後9時に打ち上げ後の記者会見を開催し、その後クルーは中間液体推進ステージを使用した近接操作デモンストレーションの準備に取り組みます。

2026/04/02 6:36

DRAM の価格がホビイスト向けのSBC市場を潰しつつあります。

## Japanese Translation: ### 改訂要約 ホビイスト向けのシングルボードコンピュータ(SBC)市場は、DRAM価格が急騰したため圧迫を受けています。Raspberry Pi は LPDDR4 RAM を搭載したすべての Pi モデルの価格を引き上げ、新しい 3 GB‑RAM の Pi 4 を $83.75 に設定し、16 GB の Pi 5 を $299.99 にしました。これらの値上げは主に LPDDR チップのコスト増によるもので、現在ボードコストの大部分を占めています。その結果、4 GB 以上の RAM を搭載したボードは多くのホビイストにとって手が届かないものとなっています。以前はお得だったミニ PC は 8 GB バリアントで $250 を超え、同様に使用済み PC も 4 GB 超で $250 を上回る価格になっています。Radxa は昨年新しいボードをリリースし続けましたが、ほかのベンダーは発売を減速または停止しています。Raspberry Pi の創設者 Eben Upton は「メモリ価格は現在の非常に高い水準で永続するわけではない」と述べており、その期間は不確実です。著者自身のプロジェクトは学習コストを下げ、破損リスクを減らすために $100 未満の部品を対象としています。DRAM 価格が高止まりする場合、ホビイストは古い SBC やマイクロコントローラへ戻る可能性が高く、手頃な選択肢が狭まり、小規模ベンダーは事業停止のリスクに直面します。Raspberry Pi の強力なマイクロコントローラエコシステムと産業基盤はある程度のレジリエンスを提供しますが、ホビイストセグメント全体での多様性は減少する可能性があります。

**Show HN:** 「Zerobox – ファイル・ネットワーク・認証情報を制御して任意のコマンドをサンドボックス化」 | そっか~ニュース