沙箱 API 說明

Sandboxed API (SAPI) 是以廣為發展的 Sandbox2 專案為基礎。此頁面說明 SAPI 的設計架構與關鍵概念。

總覽

專為開發人員提供工具,讓開發人員準備用於沙箱的 C/C++ 程式庫,以及與沙箱 C/C++ 程式庫通訊所需的 API。

下圖顯示 SAPI 採用沙箱機制的 C/C++ 程式庫架構:

SAPI 圖表

SAPI 也為 SAPI 程式庫和主機程式碼之間的手動和自動 (根據自訂指標屬性) 記憶體同步處理 (陣列、結構) 提供基本功能

最後,高階 Transactions API 會啟用監控 SAPI 程式庫,如果發生錯誤 (例如安全性違規事項、當機或資源耗盡),請重新啟動程式庫。

Sandbox2

開放原始碼專案 Sandbox2 由 Google 安全性工程師開發及維護,是 SAPI 採用的核心沙箱技術。Sandbox2 包含沙箱政策執行者沙箱這三個主要元件。

沙箱政策

沙箱政策會為沙箱程式庫定義受限制的執行環境。方法是說明可執行的 Syscall。SAPI 使用的機制與 Sandbox2 相同,請參閱沙箱政策一節和 Sandbox2 的「入門指南」頁面,進一步瞭解如何設計及定義沙箱政策。

SAPI 使用預設政策,或者,您也可以使用專屬的沙箱政策,方法是在 sandbox.h 標頭檔案中定義政策,然後以引數形式在 sapi_library 建構規則中傳遞。

沙箱程式庫

這是沙箱式 C/C++ 程式庫,會在 Sandbox2 提供的受限製沙箱環境中執行。最終,沙箱程式庫公開了可由主機程式碼使用的必要功能。

沙箱程式庫是以 sapi_library 建構規則打造而成,您可以在當中指定自訂沙箱政策來定義受限制的執行環境。視程式庫而定,您可能需要編寫包裝函式或虛設常式程式碼 (請參閱 libcurl),但在準備 SAPI 版本時,您不需要變更 C/C++ 程式庫的原始碼。

SAPI 物件和遠端程序呼叫 (RPC) 虛設常式

SAPI 物件是 C++ 物件,會公開沙箱程式庫的 API,此工具會將主機程式碼的呼叫轉送到 RPC Stub,後者內嵌於 SAPI 程式庫與沙箱程式庫。

建構系統使用 sapi_library() 建構規則自動產生這兩個元素。SAPI 支援兩種建構系統:Google 的 BazelCMake

主機代碼

「主機程式碼」是實作 SAPI 程式庫所提供的邏輯的方法。也就是使用未沙箱的 C/C++ 程式庫版本。因此,主機程式碼會呼叫由 SAPI 程式庫匯出的函式,將資料傳入沙箱,並從沙箱接收資料。

主機程式碼必須調整,才能使用 SAPI 程式庫。最重要的是,由於程式庫位於獨立的沙箱程序,因此無法呼叫程式庫的函式。因此,SAPI 提供的工具可以建立 SAPI 物件,透過 Proxy 呼叫 SAPI 程式庫。

概念

Bazel 建構規則

SAPI 專案提供兩個 Bazel 建構規則來設定 C/C++ 程式庫的沙箱機制:

  • sapi_library() – 建立進行 C/C++ 程式庫沙箱為 Sandbox2 Sandboxee 所需的所有輸出內容。建構輸出內容可以做為 cc_binary() 規則的依附元件,用來建構主機程式碼二進位檔。
  • sapi_interface():自動產生可納入主機程式碼二進位檔的標頭。

如需建構規則的詳盡說明,請參閱建立規則

Variables

SAPI 提供多種特殊類型 (稱為 SAPI 類型),建議在主機程式碼中使用。之所以需要 SAPI 類型,主要是因為這項程序的緣故,進而在主機程式碼和沙箱程式庫之間隔離記憶體。

如需這個主題的詳盡說明,以及一些常用的 SAPI 類型總覽,請參閱「變數」一文。

交易

如上所述,對沙箱程式庫的所有 API 呼叫都會透過 RPC 層傳遞。為了處理這個圖層中的錯誤,您需要採取適當的錯誤處理方式。SAPI 交易模組提供必要的機制,可確保對沙箱程式庫的所有呼叫順利完成,完全沒有 RPC 層級問題,或傳回相關的錯誤。

如需這個主題的詳盡說明,請參閱「交易」一文。

開始使用

參閱「開始使用」頁面,瞭解如何設定第一個 Sandboxed API 專案。