OpenAI、Anthropic 和 Chrome 都在使用它。Apple 已棄用它。沒有人記錄它。直到現在。→ sandbox-exec:遺失的手冊

書籍的完整索引與範例章節

sandbox-exec 是 macOS 內建的命令列工具,可讓使用者在沙盒環境中執行應用程式。本質上,它創造了一個安全、隔離的空間,應用程式可以在其中執行,但對系統資源的存取權限有限——只能存取您明確允許的內容。

沙盒化的概念是現代安全性的基礎:透過限制應用程式可以存取的內容,您可以最大限度地減少惡意程式碼或非預期行為造成的潛在損害。可以將其想像成將一個應用程式放在一個安全的房間裡,它只能與您放在那裡的特定物品互動。

在深入探討使用方法之前,讓我們了解為什麼沙盒化很重要:

防止惡意程式碼:如果您正在測試一個不熟悉的應用程式或腳本,沙盒化可以防止它存取敏感檔案或透過網路傳送資料。

損害限制:即使是受信任的應用程式也可能存在漏洞。沙盒化限制了應用程式被入侵時的潛在影響。

隱私控制:您可以明確拒絕應用程式存取個人目錄,例如「文件」、「照片」或「聯絡人」。

測試環境:開發人員可以在實施正式的 App Sandbox 權限之前,測試應用程式在有限權限下的功能。

資源限制:除了安全性,沙盒化還可以限制應用程式的資源消耗或網路存取。

使用 sandbox-exec 需要建立一個沙盒設定檔(組態檔),該檔案定義了安全環境的規則。基本語法是:

sandbox-exec -f profile.sb command_to_run

其中 profile.sb 包含定義沙盒化應用程式可以做什麼和不能做什麼的規則,而 command_to_run 是您要在這些限制下執行的應用程式。

沙盒設定檔使用類似 Scheme 的語法(LISP 方言),並使用括號對表達式進行分組。基本結構包括:

(version "1.0")

(allow ...)

(deny ...)

規則可以使用以下方式針對特定資源:

(allow network ...)

(allow file-read-data ...)

(allow process-exec ...)

請參閱附錄以取得可用規則的更完整列表。

建立沙盒設定檔時,有兩種主要哲學:

預設拒絕 (Deny-by-default)

這種方法從拒絕所有內容開始,然後明確允許僅需要執行的操作:

(version "1.0")

(deny default)

(allow file-read-data /path/to/allowed/file)

(allow network ...)

這是最安全的方法,非常適合執行不受信任的程式碼,但需要仔細的組態才能使應用程式正常運作。

預設允許 (Allow-by-default)

或者,您可以允許所有內容,但排除特定操作:

(version "1.0")

(allow default)

(deny network ...)

(deny file-write ...)

這種方法更容易實施,但安全性較低,因為您必須預期到所有潛在的風險操作。

讓我們探討一些實際範例,以展示自訂沙盒化的威力。

建立一個無法存取網路的沙盒終端機工作階段:

sandbox-exec -f ~/my_sandbox.sb echo "Hello"

其中 my_sandbox.sb 包含:

(version "1.0")

(deny default)

(allow process-exec ...)

(allow file-read-data ".")

(allow network*)

這會建立一個正常運作但無法存取網路或讀取您個人目錄的終端機工作階段。

macOS 在 /System/Library/Sandbox/Profiles 中包含數個預先建置的沙盒設定檔:

/System/Library/Sandbox/Profiles/com.apple.finder.sb

/System/Library/Sandbox/Profiles/com.apple.mail.sb

/System/Library/Sandbox/Profiles/com.apple.safari.sb

這些系統設定檔為常見的限制場景和應用程式提供了組態。其中一些設定檔有相當好的註解,因此您可以將它們作為您未來設定檔的基礎。

當應用程式在沙盒中失敗時,確定原因可能很困難。以下是一些有效的偵錯技巧:

使用 `opensnoop` 進行即時監控:

sudo opensnoop -v -p $(pgrep -f "your_app_name")

若要篩選特定應用程式:

sudo opensnoop -v -p $(pgrep -f "your_app_name") | grep "DENIED"

這些日誌精確顯示了哪些操作被拒絕,幫助您完善沙盒設定檔。

對於頻繁的沙盒化,請將別名新增到您的 shell 組態中:

alias sb="sandbox-exec -f ~/my_sandbox.sb"

但當我對 UI 應用程式執行相同操作時,不知何故卻無效(我仍然可以開啟 Google.com):

您可以匯入並擴展現有的設定檔:

(import "/path/to/existing/profile.sb")

(allow ...)

儘管功能強大,sandbox-exec 仍有一些限制需要考慮:

棄用狀態:雖然功能正常,但 Apple 傾向於開發人員使用 App Sandbox,因此不鼓勵直接使用它。

複雜應用程式:現代應用程式通常有複雜的需求,使得在沒有廣泛測試的情況下進行全面沙盒化變得困難。

試錯:建立有效的沙盒設定檔通常需要反覆測試,以識別所有必要的權限。

無圖形介面:與 Xcode 中的 App Sandbox 不同,sandbox-exec 沒有用於組態的圖形介面。

系統更新:主要的 macOS 更新可能會改變 sandbox-exec 的工作方式或哪些規則有效。

雖然 Apple 已轉向更使用者友善的安全模型,但對於願意投入時間學習其複雜性的人來說,sandbox-exec 仍然是一個強大的工具。它提供了圖形介面解決方案無法比擬的控制和自訂程度。

對於注重安全性的使用者、測試應用程式的開發人員,或任何處理潛在不受信任程式碼的人來說,sandbox-exec 提供了一個原生的 macOS 解決方案,用於建立精細調整的安全環境。儘管它需要了解其所有可能性,並且缺乏文件,但其安全性效益使其非常值得付出努力。

sandbox-exec 最強大的方面是其靈活性——您可以建立針對特定應用程式和使用案例量身定制的自訂安全設定檔,遠遠超出了大多數安全工具的「一刀切」方法。

如果您有興趣進一步了解 macOS 安全工具和技術,請查看 Apple 關於 App Sandbox 的官方文件,或探索 /System/Library/Sandbox/Profiles 中的預建沙盒設定檔,以了解 Apple 如何為系統服務實施沙盒化。