Sandbox2 設計以知名且成熟的技術、政策架構和兩個程序為基礎:Sandbox Executor 和 Sandboxee。
相關技術
以下各節將介紹構成 Sandbox2 基礎層的技術。
Linux 命名空間
Linux 命名空間是為了提供作業系統層級的虛擬化功能而設計。雖然多個使用者空間看似彼此獨立運作,但其實共用單一核心執行個體。Sandbox2 使用下列命名空間:
- 處理序間通訊 (IPC)
- 網路 (除非呼叫
PolicyBuilder::AllowUnrestrictedNetworking()
明確停用) - 掛接 (使用檔案系統樹狀結構的自訂檢視畫面)
- PID
- 使用者
- UTS
如要進一步瞭解 Linux 命名空間,請參閱 Wikipedia 或相關的手冊頁面。
處理序間通訊 (IPC)
Sandbox2 允許在沙箱執行器和不受信任的沙箱之間交換任意資料。這個介面支援 Type-Length-Value (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 (程序追蹤) 系統呼叫提供功能,可讓追蹤器程序觀察及控管受追蹤程序。附加追蹤器後,追蹤器程序就會完全掌控追蹤對象。如要進一步瞭解 ptrace,請參閱 Wikipedia 或相關手冊頁面。
沙箱政策
沙箱政策是沙箱最重要的部分,因為這項政策會指定 Sandboxee 可執行和不可執行的動作。沙箱政策分為 2 個部分:
- 系統呼叫政策
- 設定命名空間
預設系統呼叫政策
預設政策會封鎖一律危險的系統呼叫,且優先順序高於使用者提供的擴充政策。
擴充系統呼叫政策
您可以使用我們的 PolicyBuilder 類別建立擴充的系統呼叫政策。這個類別定義了許多便利規則 (例如 AllowStaticStartup
、AllowDynamicStartup
、AllowOpen
),可用於提升政策的可讀性。
如要進一步限制系統呼叫或需要更複雜的規則,可以使用 AddPolicyOnSyscall
和 AddPolicyOnSyscalls
指定原始 BPF 巨集。crc4 範例會使用這項機制,限制 read
、write
和 close
系統呼叫的引數。
一般來說,沙箱政策越嚴格越好,因為政策會限制程式碼中任何漏洞遭到利用的行為。如果您能準確指定程式正常運作所需的系統呼叫和引數,那麼任何利用程式碼執行安全漏洞的攻擊者,也會受到相同限制。
如果 Sandbox 政策非常嚴格,可能會拒絕所有系統呼叫,但標準輸入和輸出檔案描述元上的讀取和寫入作業除外。在沙箱中,程式可以接收輸入內容、處理內容,然後傳回輸出內容。不過,如果程序嘗試進行任何其他系統呼叫,就會因違反政策而終止。因此,如果程序遭到入侵 (惡意使用者執行程式碼),除了產生錯誤輸出內容外,無法做出任何更惡意的行為 (執行器和其他人仍需正確處理)。
設定命名空間
PolicyBuilder 物件也可用於設定 Sandboxee 的個別檔案系統檢視畫面。單一檔案 (AddFile
/ AddFileAt
)、整個目錄 (AddDirectory
/ AddDirectoryAt
) 和暫時儲存空間 (AddTmpfs
) 都可以對應至 Sandboxee 的環境。此外,AddLibrariesForBinary
可用於自動對應指定動態連結可執行檔所需的所有程式庫。
指令列旗標
如要停用任何 Sandbox2 政策,請指定下列其中一個指令列標記。這些標記僅供測試之用 (例如在修正擴充系統呼叫政策時)。
--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 接著會套用政策。除非另有設定 (請參閱沙箱政策),否則違反政策將導致程序終止。