を支えるSandbox Codex/Gemini CLI 勉強会 @クラシル Agentic Coding
自己紹介 ラク 年にクラシル株式会社に入社 バックエンドエンジニアとして「クラシル」「クラシルリワード」の バックエンド開発を担当した後、現在はSRE AIツールの導入・推進 未踏スーパークリエイター’21 好きなものはTypeScript・キーボード・クラブ・Skrillex 2023 X: @rakutek アイコンはクラブで労働中の影
9 月に書いたzenn 月中旬時点での基本的な設定などをリリースノートやPRを読んで記事化 9 はOSSなので実装を読みまくってSandboxの実装が面白いことに気づく Codex
セキュリティに気をかけてCoding Agent を使えてますか?
簡単にできる対策: コンテナ上で動かす
ぶっちゃけ面倒だしオーバーヘッドもある コンテナ化せずホストマシン上で使っていることも全然ある
で一番好きなオプション --dangerously-skip-permissions CC プランのPOCを開始した日のslack *Claude Max
ターミネーターみたいなことは起こる https://x.com/mugisus/status/1940127947962396815
MCP によって新たなサプライチェーン攻撃のリスクも出てきた メール配信PaaSの野良MCPを使ってメールを配信する と、悪意のある第三者にBCCでメールが送られてしまっ ていた事件
MCP によって新たなサプライチェーン攻撃のリスクも出てきた の野良MCPに任意コード実行可能な脆弱性が見つかった事件 Figma
も出てきた Claude Skills
どうやって安全に使うのか もちろんコンテナ上で動かすのもアリ
にはSandbox機能があります! Codex / Gemini CLI
Codex CLI のSandbox機能
を安全に実行するためのsandbox Codex CLI sandbox モード のモードは3種類 説明 ファイルシステム全体への読み取り専用アクセスを許可。書き込みやネットワークアクセ read-only スの試行はブロックされる。 workspace-write 現在の作業ディレクトリへの書き込みアクセスを許可。 danger-fullaccess すべての制限を無効化。Dockerコンテナなど、既に隔離された環境での使用を想定。
Sandbox モードの決定 の起動時にバージョンコントロールされているディレクトリであればworkspace-writeモードが選択 バージョンコントロールされていないディレクトリではread-onlyモードが選択 codex の設定はconfig.tomlで設定可能 sandbox sandbox_mode = "workspace-write" sandbox_mode = "danger-full-access" sandbox_mode = "read-only"
の debugコマンドでsandboxの挙動を試す モードで動作させると、 Codex CLI read-only > test % codex debug seatbelt touch hoge.txt touch: hoge.txt: Operation not permitted # 権限エラー > test % codex debug seatbelt ls ワークスペース内であれば書き込み可能)で動作させると、 –full-auto( > test % codex debug seatbelt --full-auto touch hoge.txt > test % ls hoge.txt # hoge.txtが作成されている
やってみたくなりますよね rm -rf ~ codex-findy % codex debug seatbelt --full-auto rm -rf ~ rm: /Users/raku/.claude.json.backup: Operation not permitted rm: /Users/raku/.config/zed/settings.json: Operation not permitted rm: /Users/raku/.config/zed/conversations: Operation not permitted rm: /Users/raku/.config/zed/prompts: Operation not permitted rm: /Users/raku/.config/zed/themes: Operation not permitted rm: /Users/raku/.config/zed: Operation not permitted rm: /Users/raku/.config/mise/config.toml: Operation not permitted rm: /Users/raku/.config/mise: Operation not permitted rm: /Users/raku/.config/gh/config.yml: Operation not permitted rm: /Users/raku/.config/gh/hosts.yml: Operation not permitted rm: /Users/raku/.config/gh: Operation not permitted ドキドキしましたが、sandboxのおかげでファイルは削除されませんでした👍
を支えるSandbox Codex/Gemini CLI
にClaude CodeにもSandboxがきた! 10/21
Claude Code モード Sandbox + Auto Allow で/sandboxを実行 説明 サンドボックス環境で自動的にコマンド実行を許可する。安全性を保ちつつ手 動承認を減らす。 Permission サンドボックス環境で通常通りの承認ルール。セキュアかつ制御可能。 No Sandbox サンドボックスなしで実行 Sandbox + Manual
を使うとファイルシステム・ネットワークを 分離できる Sandbox 書き込み: 現在の作業ディレクトリ以下(CWD)に限定 読み取り: 明示的に拒否されたフォルダ以外は許可 ネットワークアクセス: 承認されたドメインのみアクセス可能
設定のカスタマイズ settings.json サンプル { で許可/拒否パスやドメインを細かく制御 "sandbox": { "enabled": true, "autoAllowBashIfSandboxed": true, "excludedCommands": ["docker"], "network": { "allowUnixSockets": [ "/var/run/docker.sock" ], "allowLocalBinding": true } }, "permissions": { "deny": [ "Read(.envrc)", "Read(~/.aws/**)" ]
はどうや ってSandboxを実装しているのか Claude Code,Codex/Gemini CLI
Apple Seatbelt(sandbox-exec)
Apple Seatbelt とは 懐かしい)から搭載されたアプリケーション用のサンドボックス機構" Apple Seatbelt”というコードネームで開発が進められている os標準なので手元のPCでも sandbox-exec と打つと動きます! Mac OSX Snow Leopard( Apple Seatblet はなんと仕様非公開・非推奨の機能 すでに非推奨になっている 設定言語のsb,sbplの仕様は非公開・有志がリバースエンジニアリングで仕様をまとめている Chromeiumのwikiにもsbplの仕様を解説したPDFがリンクされているが、これも非公式のもの https://www.chromium.org/developers/design-documents/sandbox/osx-sandboxing-design/
ただ多くのソフトウェアが今でも Apple Seatbeltを使っている 代表的なのは Chromium でもApple Seatbeltは非推奨になっているよとissueが上がっていた、「まだ十分に動いているからヨシ (意訳)」というメンテナからの回答があった https://github.com/openai/codex/issues/215 Codex
内部のSandboxプロファイルを覗いてみる mac /System/Library/Sandbox/Profiles /usr/share/sandbox
を試してみる でプロファイルを指定 sandbox-exec -n デフォルトで用意されているno-writeのプロファイルを使ってみる raku@raku-MacBook-Air sandbox-exec -n no-write touch hoge.txt sandbox-exec: The no-write profile is deprecated and may not be secure touch: hoge.txt: Operation not permitted ちゃんと新しくファイルを作成することができなかった
sandbox のプロファイルはLispというかS式っぽい記述 (version 1) (deny default) (import "system.sb") (import "com.apple.corefoundation.sb") (allow pseudo-tty) (allow file-ioctl (literal "/dev/ptmx") (regex #"^/dev/ttys") ) (allow file-read* file-write* (regex #"^/Library/Keychains/System.keychain") (regex #"^/Library/Keychains[^/]+\.[^/]+$") (literal "/Library/Keychains") (literal "/dev/ptmx") (regex #"^/dev/ttys") ) (allow file-read* file-write* (regex #"^/private/var/root/Library/Logs/Bluetooth/[^/]+\.pklg$") (literal "/private/var/root/Library/Logs") (literal "/private/var/root/Library/Logs/Bluetooth")
Codex の実装を見てみる のベースとして使うsbplファイル(Chromiumにインスパイアされているとコメントがある) Codex https://github.com/openai/codex/blob/88abbf58cec9843a7cebe250d71146314ebbcf1a/codexrs/core/src/seatbelt_base_policy.sbpl の実行 Sandbox https://github.com/openai/codex/blob/88abbf58cec9843a7cebe250d71146314ebbcf1a/codexrs/core/src/seatbelt.rs#L13 でcodexの設定ファイルからwriteプロファイルを組み立て、ベースのsbplと組 create_seatbelt_command_args み合わせる https://github.com/openai/codex/blob/88abbf58cec9843a7cebe250d71146314ebbcf1a/codexrs/core/src/seatbelt.rs#L47
とっつきにくい!
はSandbox機能をOSSとして公開している Claude Code
anthropic-experimental/sandbox-runtime https://github.com/anthropic-experimental/sandbox-runtime がすごく便利
str
の使い方はシンプル
で使う
CLI
raku@raku-MacBook-Air sandbox % bunx @anthropic-ai/sandbox-runtime "curl example.com"
Running: curl example.com
Connection blocked by network allowlist%
MCP
{
}
と組みわせて使う
"mcpServers": {
"filesystem": {
"command": "str",
"args": ["npx", "-y", "@modelcontextprotocol/server-filesystem"]
}
}
他の有象無象のAIエージェントを使う時もstrを使ってセキュアに使っていきたい
まとめ コーディングエージェントはSandbox化して使おう Claude Code,Codex/Gemini CLIにはそれぜれSandbox機能が実装されている その実装にはmac標準のApple Seatbeltが使われている Claudeはsandbox機能を便利に使えるstrというCLIを公開している。おすすめ
Thank You ✊