概要
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 - ネットワークや個人ディレクトリへのアクセスを遮断したシェル環境
- プロファイル例(terminal-sandbox.sb):
-
システム標準プロファイルの利用
/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セキュリティのさらなる知識習得