沙箱 API 說明

沙箱化 API (SAPI) 是以成熟的 Sandbox2 專案為基礎建構而成。本頁說明 SAPI 的設計架構和重要概念。

總覽

SAPI 的設計宗旨是為開發人員提供工具,以便準備 C/C++ 程式庫以進行沙箱化,以及提供與 C/C++ 程式庫沙箱化版本通訊所需的 API。

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

SAPI 圖表

SAPI 也提供基本類型,可手動或自動 (根據自訂指標屬性) 在 SAPI 程式庫和主機程式碼之間進行記憶體同步處理 (陣列、結構)。

最後,高階 Transactions API 可監控 SAPI 程式庫,並在程式庫發生故障時重新啟動 (例如因違反安全性規定、當機或資源耗盡)。

Sandbox2

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

沙箱政策

沙箱政策會定義沙箱程式庫的受限執行環境。方法是明確指出可執行的系統呼叫。SAPI 使用與 Sandbox2 相同的機制,如要進一步瞭解如何設計及定義沙箱政策,請參閱 Sandbox Policy (沙箱政策) 專區Getting Started (入門) 頁面

SAPI 會使用預設政策,您也可以在 sandbox.h 標頭檔中定義專屬的沙箱政策,並在 sapi_library 建構規則中將其做為引數傳遞,藉此使用該政策。

沙箱化程式庫

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

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

SAPI 物件和 RPC 存根

SAPI 物件是 C++ 物件,可公開 Sandboxed Library 的 API。這項服務會將呼叫從主機程式碼轉送至 RPC 存根,後者會與沙箱程式庫一起嵌入 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() - 自動產生可納入主機程式碼二進位檔的標頭。

如要進一步瞭解建構規則,請參閱「建構規則」。

變數

SAPI 提供多種特殊型別 (稱為「SAPI 型別」),建議您在主機程式碼中使用。需要 SAPI 類型的主要原因,是主機程式碼和沙箱化程式庫之間的程序 (因此也是記憶體) 隔離。

如要深入瞭解這個主題,並查看一些常用的 SAPI 類型,請參閱「變數」。

交易

如上所述,對沙箱化程式庫的任何 API 呼叫,都會透過 RPC 層傳遞。如要處理這個層級的失敗情形,您需要實作適當的錯誤處理機制。SAPI 交易模組提供必要的機制,確保對沙箱程式庫的所有呼叫作業都能順利完成,不會發生任何 RPC 層級的問題,或傳回相關錯誤。

如要進一步瞭解這個主題,請參閱交易

開始使用

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