世界を動かす技術を、日本語で。

macOSのあまり知られていないコマンドラインサンドボックスツール (2025)

概要

sandbox-exec は、macOSのコマンドラインユーティリティで、アプリケーションを サンドボックス環境 で実行可能 サンドボックス により、アプリのシステムリソースへのアクセスを厳しく制限 セキュリティ強化プライバシー保護安全なテスト環境 の構築に最適 プロファイル(設定ファイル)で詳細な動作ルールを カスタマイズ 可能 Appleは公式には App Sandbox の利用を推奨し、sandbox-execは非推奨扱い

sandbox-execとは何か

  • sandbox-exec はmacOS標準搭載の コマンドラインツール
  • アプリケーションを 隔離された安全な環境 で実行する仕組み
  • アプリがアクセスできるシステムリソースを 明示的に制限
  • 悪意あるコード予期しない動作 からの被害を最小化
  • 例えるなら「 特定の物だけが置かれた安全な部屋」でアプリを動かすイメージ

サンドボックス化のメリット

  • 悪意あるコード からの保護:未知のアプリやスクリプトの安全な検証環境
  • 被害の限定 :信頼できるアプリでも脆弱性対策として有効
  • プライバシー制御 :DocumentsやPhotosなど個人データへのアクセス拒否
  • 開発・テスト環境 :開発者が制限付きでアプリ挙動を事前検証
  • リソース制限 :CPUやネットワークなどの消費リソースも制御可能

sandbox-execの基本的な使い方

  • プロファイル(設定ファイル) を作成し、ルールを定義
  • 基本構文:
    • sandbox-exec -f プロファイルファイル コマンド
  • プロファイルファイル で許可・拒否する操作を細かく指定
  • 例:sandbox-exec -f profile.sb コマンド

サンドボックスプロファイルの書き方

  • Scheme(LISP系)構文を採用、括弧でルールをまとめる形式
  • 基本要素
    • バージョン宣言:(version 1)
    • デフォルトポリシー:(deny default)または(allow default)
    • 個別ルール:(例:(allow file-read-data (regex "^/usr/lib"))
  • 対象リソースの指定方法
    • リテラルパス:(literal "/path/to/file")
    • 正規表現:(regex "^/System")
    • グロブパターン:(subpath "/Library")

サンドボックス設計の2つの基本方針

  • デフォルト拒否(最もセキュア)

    • すべての操作を拒否し、必要なものだけ許可
    • 例:
      (version 1)
      (deny default)
      (allow file-read-data (regex "^/usr/lib"))
      (allow process-exec (literal "/usr/bin/python3"))
      
    • 未知・信頼できないコードの実行に最適だが、動作検証が必須
  • デフォルト許可(より寛容)

    • すべて許可し、危険なものだけ拒否
    • 例:
      (version 1)
      (allow default)
      (deny network*)
      (deny file-write* (regex "^/Users"))
      
    • 実装は容易だが、セキュリティリスクが高まる

実用例

  • ネットワークアクセス不可のターミナルセッション

    • プロファイル例(terminal-sandbox.sb):
      (version 1)
      (allow default)
      (deny network*)
      (deny file-read-data (regex "^/Users/[^/]+/(Documents|Pictures|Desktop)"))
      
    • 実行例:sandbox-exec -f terminal-sandbox.sb zsh
    • ネットワークや個人ディレクトリへのアクセスを遮断したシェル環境
  • システム標準プロファイルの利用

    • /System/Library/Sandbox/Profilesにプリセット定義が存在
    • 例:sandbox-exec -f /System/Library/Sandbox/Profiles/weatherd.sb コマンド
    • コメント付きで参考になるプロファイル多数

サンドボックスエラーのデバッグ方法

  • Consoleアプリの利用

    • Console.appで「sandbox」やアプリ名で検索
    • 「deny」を含む行でブロックされた操作を特定
  • ターミナルでリアルタイムログ監視

    • コマンド:log stream --style compact --predicate 'sender=="Sandbox"'
    • 特定アプリに絞る:log stream --style compact --predicate 'sender=="Sandbox" and eventMessage contains "python"'
    • 拒否された操作の詳細を確認し、プロファイル改善に活用

高度なサンドボックス技法

  • エイリアス化による簡易運用

    • シェル設定ファイルに追加:
      alias sandbox-no-network='sandbox-exec -p "(version 1)(allow default)(deny network*)"'
      
    • 例:sandbox-no-network curl -v https://google.com
    • ただし、UIアプリ(例:Firefox.app)には期待通り効かない場合あり
  • 既存プロファイルのインポート・拡張

    • 例:
      (version 1)
      (import "/System/Library/Sandbox/Profiles/bsd.sb")
      (deny network*)
      

sandbox-execの限界と注意点

  • 非推奨 :Appleは開発者向けにApp Sandboxの利用を推奨、sandbox-execは将来廃止の可能性
  • 複雑なアプリ :必要な権限の洗い出しや動作検証が難しい場合が多い
  • 試行錯誤が必要 :プロファイル作成には何度もテストが必要
  • GUIなし :App Sandbox(Xcode)とは異なり、設定用のGUIが存在しない
  • システムアップデートの影響 :macOSの大型アップデートで挙動やルールが変更される可能性

結論:パワーユーザー向けの強力なセキュリティツール

  • sandbox-exec はGUI型セキュリティ機能にはない 柔軟性と制御力 が特徴
  • セキュリティ重視のユーザー開発者未知のコードの検証 に最適
  • カスタムプロファイル で用途ごとに最適なセキュリティ環境を構築可能
  • 学習コストや試行錯誤 は必要だが、得られるセキュリティメリットは大きい

次に学ぶべきこと

  • macOSの App Sandbox 公式ドキュメント参照を推奨
  • /System/Library/Sandbox/Profilesのプリセットプロファイルを研究
  • macOSセキュリティのさらなる知識習得

Hackerたちの意見

これをまとめてくれてありがとう、めっちゃ助かる!読者は、最近のHNの会話の後にオープンソース化された「https://github.com/eugene1g/agent-safehouse」も気になるかもね。

これを使ってターミナルアプリを動かすためのUIを作ったよ、claudeやcodexみたいなやつね: https://multitui.com

これいいね!CLIエージェントをサンドボックス化するために似たようなものを作ったんだけど、リポジトリにはsandbox-exec用のミニマルなプロファイルを集めてるよ - https://agent-safehouse.dev/

本当に素晴らしい仕事だね!なんでクローズドソースにしたの?追記:クローズドソース自体には問題ないけど、ソフトウェアが自分のセキュリティに責任を持つことが期待されるとちょっと不安になるから、ここでの安全性や保証について気になったんだ。UXも他の部分も素晴らしいね。

わあ、これめっちゃいいね。

CodexはすでにmacOSでsandbox-execを使ってるよ :)

どのターミナルを埋め込んでるの?

https://man.freebsd.org/cgi/man.cgi?query=sandbox-exec&aprop...: 「sandbox-execコマンドは非推奨です。アプリをサンドボックス化したい開発者は、App Sandbox Design Guideに記載されているApp Sandbox機能を採用すべきです。」これ、MacOS 26.3でも同じことが言えるよね(https://man.freebsd.org/cgi/man.cgi?query=sandbox-exec&aprop...)。MacOS 10.13.6は2017年のもので、もうほぼ10年も非推奨になってる。

その非推奨にもかかわらず、今どれだけの主要なアプリやツールがsandbox-execに依存してるのか気になるな。Codex CLIやSwift Package Managerが思い浮かぶけど。

誰か、非推奨についての詳細知ってる人いる?Appleがこの決定をした理由が気になるな。

まあ、OS X/macOSのcronは20年以上前から非推奨になってるよ。

Claude CodeとCodexは、実行をサンドボックス化するためにsandbox-execとSeatbeltを使ってるよ: - https://developers.openai.com/codex/security/#os-level-sandb... - https://code.claude.com/docs/en/sandboxing

Claudeがセッション中にサンドボックスの外にアクセスできるのはちょっと気持ち悪いな。ドキュメントによると、ユーザーの同意が必要なんだって。もっと厳格な安全策があれば安心できるんだけど、だからこそsandbox-execでClaudeを明示的に呼び出してるんだ。

sandbox-execに「sandbox」って名前が付いてるのがイライラする。実際のサンドボックスとは全然違うし、高レベルのseccompに近いだけで、「App Sandboxes」とは関係ないんだよね。俺の意見では、リアルなサンドボックスはプログラムが外部に影響を与えずに自由に動けるべきだと思う。でも実際には、これらのツールは定義された境界を越えようとすると、ハードな失敗を引き起こすことが多い。しかもドキュメントも不十分で、確か非推奨だったはず。何がそれに代わるのかも分からない。もしmacOSがサンドボックス内でオーバーレイマウントを持っていたら、すごく多くのことができるようになるのに。Linuxのコンテナ(docker、systemd、bubblewrap、unshareでも)と比べると、macOSは冗談みたいなもんだね。

macOSにサンドボックス内でオーバーレイマウントがあれば、すごく便利になるのに。Linuxのコンテナ(docker、systemd、bubblewrap、unshareなど)と比べると、macOSはお笑いだよ。もっと広い世界にアクセスするためにHomebrew(またはMacports)を調べてみて。

君が説明してるのは、プログラムの隔離ではなく、トランザクションの調整を伴うリソースの仮想化だね(MAC/seccompスタイルの拒否とは違う)。プログラムが自由に動けるようにするには、セキュリティに関わる可変リソースをフィルタリングするのではなく、仮想化する必要がある。さらに、ファイルシステムはサンドボックス化すべきものの一つに過ぎない。ネットワーク状態も仮想化するのが理想だけど、プロセスやIPCの名前空間など、漏洩を防ぐための他のシステムも仮想化するべきだよ。サンドボックスが終わった後(または長時間実行されるプログラムの場合は実行中でも)、サンドボックスの状態の差分をすべて公開して、ホストとの選択的な調整を決定できるようにするプロモーションステップを提供する必要がある。そして、検証や適用中にホスト側のドリフトやTOCTOUの危険も考慮しなきゃ。クロスシステムで動くサンドボックスを実装しようとしてるんだけど(カーネルレベルの名前空間のプリミティブは使わない)、ユーザーの快適さを考えると、ポリシー設計やプログラムに提示する合成環境の上に必要な遅延バインドポリシーの注入を考えるのは本当に大変だよ。

Sandbox-execは、私がサンドボックスに期待することをすべてカバーしてるよ: - プロセスが読み書きできるファイルを制御 - プロセスに許可されるネットワークアクセスを制御

"App Sandboxes"とはあまり関係ない、別のmacOSの機能だよ。 アプリサンドボックスは、文字通りSeatbelt + Cocoaの「コンテナ」だ。 secinitdはアプリサンドボックスの権限をSeatbeltプロファイルに変換し、それがXPCを通じてプロセスに戻され、libsystem_secinitの初期化子によってプロセスの初期化の早い段階で適用される。これが、アプリサンドボックスプログラムがsandbox-execの下で実行されるとforbidden-sandbox-reinitでクラッシュする理由だ。macOSはOSレベルの仮想化を行わないんだ。

使ったことがない人に一つ警告を追加したいな:プロファイルの小さなタイプミスが、後でトリガーされたコマンドから遠く離れたところで混乱するランタイムエラーに繋がることがあるよ。ツール自体は便利だけど、フィードバックループが厳しい。

参考までに: https://github.com/obra/packnplay https://github.com/strongdm/leash https://github.com/lynaghk/vibe (サンドボックス化されたコーディングエージェントのためのツールを集めてるんだ)

このスレッドからも見つけたよ: https://github.com/eugene1g/agent-safehouse via CGamesPlay https://multitui.com/ via davidcann

私もサンドボックス関連のプロジェクトのリストを集めてるんだけど、いくつかはレベルが低いものもある。全部評価する時間があればいいのに: - https://github.com/jingkaihe/matchlock - https://github.com/mishushakov/libkrun-go - https://github.com/earendil-works/gondolin - https://github.com/butter-dot-dev/bvisor - https://github.com/amlalabs/amla-sandbox - https://github.com/eryx-org/eryx - https://github.com/containers/bubblewrap (新しくはない) - https://github.com/coplane/localsandbox - https://github.com/sd2k/conch - https://github.com/Gerharddc/litterbox - https://github.com/finbarr/yolobox - https://github.com/coventry/sandbox-codex - https://github.com/osks/ctenv - https://github.com/tianon/gosu - https://github.com/colony-2/shai - https://github.com/rcarmo/agentbox - https://github.com/coder/httpjail - https://github.com/bytecodealliance/componentize-py - https://github.com/tursodatabase/agentfs - https://github.com/always-further/nono - (HNのDeno Sandboxの別リスト: https://news.ycombinator.com/item?id=46876022) - これらがここにあるかどうかは確認してない: https://github.com/arjan/awesome-agent-sandboxes

alias sandbox-no-network='sandbox-exec -p "(version 1)(allow default)(deny network*)"' aliasのプロのヒント: sh準拠のシェルでは、エイリアス文字列の末尾に空白を入れると、次のトークンもエイリアス展開されるんだ。これ、タブ補完のヒントにもなるかもね。こういう時にやりたいことの完璧な例だよ。

macOSでのサンドボックスの仕組みについての詳細は、https://bdash.net.nz/posts/sandboxing-on-macos/を見てね。SBPLスキームのソースコードがユーザースペースでどのように解釈されてポリシーのバイトコード表現が作られるか、そしてサンドボックスカーネル拡張がサンドボックスポリシーを強制するために使うカーネルMACフックについて触れてるよ。

Linuxの同等のものってある?Ubuntu用は?.venvとはどれくらい違うの?