Sandbox2 設計以知名且成熟的技術、政策架構和兩項程序為基礎:Sandbox 執行工具和 Sandboxee。
涉及的技術
以下各節介紹了構成 Sandbox2 基礎層的技術。
Linux 命名空間
Linux 命名空間旨在提供作業系統層級的虛擬化。雖然多個使用者空間看似獨立運作,但它們共用單一核心執行個體。Sandbox2 使用下列命名空間:
- 處理序間通訊 (IPC)
- 網路 (除非呼叫
PolicyBuilder::AllowUnrestrictedNetworking()明確停用) - 掛接 (使用檔案系統樹狀結構的自訂檢視畫面)
- PID
- 使用者
- UTS
如要進一步瞭解 Linux 命名空間,請參閱 Wikipedia 或相關的手冊頁面。
處理序間通訊 (IPC)
Sandbox2 允許在 Sandbox 執行器和不受信任的 Sandboxee 之間交換任意資料。支援類型長度值 (TLV) 訊息、傳遞檔案描述元,以及透過權杖和控制代碼交換憑證。
Seccomp-BPF
Sandbox2 仰賴 seccomp-bpf,這是安全運算模式 (seccomp) 的擴充功能,可使用 Berkeley Packet Filter (BPF) 規則篩選系統呼叫。
seccomp 是 Linux 核心功能,可限制程序的系統呼叫,僅允許 exit、sigreturn、read 和 write。如果程序嘗試執行其他系統呼叫,就會遭到終止。與 seccomp 相比,seccomp-bpf 擴充功能提供更多彈性。seccomp-bpf 不會允許固定的系統呼叫集,而是對系統呼叫資料執行 BPF 程式,並根據程式的回傳值執行系統呼叫、略過系統呼叫並回傳虛設值、終止程序、產生信號或通知追蹤器。
Ptrace
ptrace (程序追蹤) syscall 提供的功能,可讓追蹤程式程序觀察及控制追蹤對象程序的執行。追蹤程式程序附加後,可完全控制追蹤程式。如要進一步瞭解 ptrace,請參閱維基百科或相關手冊頁面。
沙箱政策
沙箱政策是沙箱最重要的部分,因為這項政策會指定 Sandboxee 可執行和不可執行的動作。沙箱政策包含 2 個部分:
- Syscall 政策
- 命名空間設定
預設 Syscall 政策
預設政策會封鎖一律具有危險性的系統呼叫,且優先順序高於使用者提供的擴充政策。
擴充系統呼叫政策
您可以使用 PolicyBuilder 類別建立擴充系統呼叫政策。這個類別定義了許多便利規則 (例如 AllowStaticStartup、AllowDynamicStartup、AllowOpen),可用於提升政策的可讀性。
在大多數情況下,建議您先使用 DefaultPolicyBuilder (sapi::Sandbox2Config::DefaultPolicyBuilder()),這會傳回預先設定的 PolicyBuilder,其中包含一般單一執行緒程式庫的基準政策,並可透過其他規則進一步自訂 (例如在沙箱化二進位檔時使用 .AllowDynamicStartup() 和 .AddLibrariesForBinary())。在 Sandboxed API (SAPI) 中,DefaultPolicyBuilder() 會與 sapi::SandboxConfig::DefaultConfig() 一起使用,以及 sapi::SandboxConfig::DefaultFlags()、sapi::SandboxConfig::DefaultEnvironmentVariables() 和 sapi::Sandbox2Config::DefaultLimits()。只有在無法使用 DefaultPolicyBuilder() 或需要精確設定時,才應直接建構 PolicyBuilder。
如要進一步限制系統呼叫或要求更複雜的規則,可以使用 AddPolicyOnSyscall 和 AddPolicyOnSyscalls 指定原始 BPF 巨集。crc4 範例會利用這項機制,限制 read、write 和 close syscall 的引數。
一般來說,沙箱政策越嚴格越好,因為政策會限制程式碼中任何安全漏洞的利用。如果您能準確指定程式正常運作所需的系統呼叫和引數,那麼任何利用程式碼執行安全漏洞的攻擊者也會受到相同的限制。
非常嚴格的沙箱政策可能會拒絕所有系統呼叫,但標準輸入內容和輸出檔案描述元的讀取和寫入除外。在沙箱中,程式可以接收輸入內容、處理內容,然後傳回輸出內容。不過,如果程序嘗試執行任何其他系統呼叫,就會因違反政策而終止。因此,如果程序遭到入侵 (惡意使用者執行程式碼),最多只會產生錯誤輸出內容 (執行者和其他人仍需正確處理),不會造成其他危害。
命名空間設定
PolicyBuilder 物件也用於設定 Sandboxee 的個別檔案系統檢視畫面。單一檔案 (AddFile / AddFileAt)、整個目錄 (AddDirectory / AddDirectoryAt) 和暫時儲存空間 (AddTmpfs) 都可以對應至 Sandboxee 的環境。此外,AddLibrariesForBinary 可用於自動對應指定動態連結執行檔所需的所有程式庫。
指令列旗標
指定下列任一指令列旗標,即可停用任何 Sandbox2 政策。這些標記僅供測試之用 (例如調整擴充 Syscall 政策時)。
--sandbox2_danger_danger_permit_all--sandbox2_danger_danger_permit_all_and_log
沙箱執行工具
沙箱執行器本身不是沙箱程序,這是附加至 Sandboxee (ptrace tracee 程序) 的 ptrace 追蹤器程序。Sandbox Executor 也會設定並執行 Monitor 執行個體,追蹤 Sandboxee 並提供狀態資訊。
Sandbox2 支援三種執行模式:獨立、Sandbox2 Forkserver 和自訂 Forkserver。如果您使用 forkserver,Sandboxee 會建立為 Sandbox Executor 的子程序。如要瞭解這些模式的詳細說明,請按這裡。
Sandboxee
Sandboxee 是在沙箱政策定義的受限沙箱環境中執行的程序。Sandbox Executor 會透過 IPC 將政策傳送至 Sandboxee。接著,Sandboxee 會套用政策。除非另有設定 (請參閱沙箱政策),否則任何違反政策的行為都會導致程序終止。