Codex / Gemini CLIを支えるSandbox機能

1K Views

October 27, 25

スライド概要

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

ダウンロード

関連スライド

各ページのテキスト
1.

を支えるSandbox Codex/Gemini CLI 勉強会 @クラシル Agentic Coding

2.

自己紹介 ラク 年にクラシル株式会社に入社 バックエンドエンジニアとして「クラシル」「クラシルリワード」の バックエンド開発を担当した後、現在はSRE AIツールの導入・推進 未踏スーパークリエイター’21 好きなものはTypeScript・キーボード・クラブ・Skrillex 2023 X: @rakutek アイコンはクラブで労働中の影

4.

9 月に書いたzenn 月中旬時点での基本的な設定などをリリースノートやPRを読んで記事化 9 はOSSなので実装を読みまくってSandboxの実装が面白いことに気づく Codex

5.

セキュリティに気をかけてCoding Agent を使えてますか?

6.

簡単にできる対策: コンテナ上で動かす

7.

ぶっちゃけ面倒だしオーバーヘッドもある コンテナ化せずホストマシン上で使っていることも全然ある

8.

で一番好きなオプション --dangerously-skip-permissions CC プランのPOCを開始した日のslack *Claude Max

9.

ターミネーターみたいなことは起こる https://x.com/mugisus/status/1940127947962396815

10.

MCP によって新たなサプライチェーン攻撃のリスクも出てきた メール配信PaaSの野良MCPを使ってメールを配信する と、悪意のある第三者にBCCでメールが送られてしまっ ていた事件

11.

MCP によって新たなサプライチェーン攻撃のリスクも出てきた の野良MCPに任意コード実行可能な脆弱性が見つかった事件 Figma

12.

も出てきた Claude Skills

13.

どうやって安全に使うのか もちろんコンテナ上で動かすのもアリ

14.

にはSandbox機能があります! Codex / Gemini CLI

15.

Codex CLI のSandbox機能

16.

を安全に実行するためのsandbox Codex CLI sandbox モード のモードは3種類 説明 ファイルシステム全体への読み取り専用アクセスを許可。書き込みやネットワークアクセ read-only スの試行はブロックされる。 workspace-write 現在の作業ディレクトリへの書き込みアクセスを許可。 danger-fullaccess すべての制限を無効化。Dockerコンテナなど、既に隔離された環境での使用を想定。

17.

Sandbox モードの決定 の起動時にバージョンコントロールされているディレクトリであればworkspace-writeモードが選択 バージョンコントロールされていないディレクトリではread-onlyモードが選択 codex の設定はconfig.tomlで設定可能 sandbox sandbox_mode = "workspace-write" sandbox_mode = "danger-full-access" sandbox_mode = "read-only"

18.

の 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が作成されている

19.

やってみたくなりますよね 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のおかげでファイルは削除されませんでした👍

20.

を支えるSandbox Codex/Gemini CLI

21.

にClaude CodeにもSandboxがきた! 10/21

22.

Claude Code モード Sandbox + Auto Allow で/sandboxを実行 説明 サンドボックス環境で自動的にコマンド実行を許可する。安全性を保ちつつ手 動承認を減らす。 Permission サンドボックス環境で通常通りの承認ルール。セキュアかつ制御可能。 No Sandbox サンドボックスなしで実行 Sandbox + Manual

23.

を使うとファイルシステム・ネットワークを 分離できる Sandbox 書き込み: 現在の作業ディレクトリ以下(CWD)に限定 読み取り: 明示的に拒否されたフォルダ以外は許可 ネットワークアクセス: 承認されたドメインのみアクセス可能

24.

設定のカスタマイズ settings.json サンプル { で許可/拒否パスやドメインを細かく制御 "sandbox": { "enabled": true, "autoAllowBashIfSandboxed": true, "excludedCommands": ["docker"], "network": { "allowUnixSockets": [ "/var/run/docker.sock" ], "allowLocalBinding": true } }, "permissions": { "deny": [ "Read(.envrc)", "Read(~/.aws/**)" ]

25.

はどうや ってSandboxを実装しているのか Claude Code,Codex/Gemini CLI

26.

Apple Seatbelt(sandbox-exec)

27.

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/

28.

ただ多くのソフトウェアが今でも Apple Seatbeltを使っている 代表的なのは Chromium でもApple Seatbeltは非推奨になっているよとissueが上がっていた、「まだ十分に動いているからヨシ (意訳)」というメンテナからの回答があった https://github.com/openai/codex/issues/215 Codex

29.

内部のSandboxプロファイルを覗いてみる mac /System/Library/Sandbox/Profiles /usr/share/sandbox

30.

を試してみる でプロファイルを指定 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 ちゃんと新しくファイルを作成することができなかった

31.

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")

32.

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

33.

とっつきにくい!

34.

はSandbox機能をOSSとして公開している Claude Code

35.

anthropic-experimental/sandbox-runtime https://github.com/anthropic-experimental/sandbox-runtime がすごく便利

36.
[beta]
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を使ってセキュアに使っていきたい

37.

まとめ コーディングエージェントはSandbox化して使おう Claude Code,Codex/Gemini CLIにはそれぜれSandbox機能が実装されている その実装にはmac標準のApple Seatbeltが使われている Claudeはsandbox機能を便利に使えるstrというCLIを公開している。おすすめ

38.

Thank You ✊