什麼是 Sandboxed API?

開放原始碼的 Sandboxed API (SAPI) 專案是以 Google 的 Sandbox2 開放原始碼專案為基礎建構,旨在減輕 C/C++ 程式庫的沙箱化負擔。

沙箱化 API 主要有三項優點:

  • 與 Sandbox2 不同,SAPI 不會將整個程式放入沙箱,也不需要變更原始碼,就能將部分程式放入沙箱。SAPI 可將個別 C/C++ 程式庫放入沙箱。因此,透過 SAPI,主程式可與 C/C++ 程式庫中的程式碼執行漏洞隔離。

  • 我們的座右銘是:只要在沙箱中測試一次,即可在任何地方使用。使用 Sandboxed API 進行沙箱處理的程式庫可輕鬆重複使用,減輕日後專案的負擔。在 Sandboxed API 推出前,Google 提供的沙箱需要額外的實作工作,才能用於每個新專案例項 (即使重複使用相同的軟體程式庫,也必須這麼做)。每次都必須重新實作套用至沙箱程序的 Sandbox2 政策和其他限制,且必須從頭設計程式碼中受信任和不受信任部分之間的資料交換機制。

  • 每個 SAPI 程式庫都會使用嚴格定義的安全政策,這與一般沙箱專案不同,因為安全政策必須涵蓋所有使用程式庫的總系統呼叫/資源占用空間。

SAPI 專案是由 Google Sandbox 團隊成員設計、開發及維護。此外,這項技術也採用了經過實地測試的 Sandbox2。目前許多內部專案都使用 SAPI 來隔離生產工作負載。

快速入門

如要開始使用 Sandboxed API,請按照下列步驟操作:

  1. 安裝必要依附元件 (假設您執行的是 Debian 10 Buster):
    $ echo "deb http://storage.googleapis.com/bazel-apt stable jdk1.8" | 
    sudo tee /etc/apt/sources.list.d/bazel.list $ wget -qO - https://bazel.build/bazel-release.pub.gpg | sudo apt-key add - $ sudo apt-get update $ sudo apt-get install -qy build-essential linux-libc-dev bazel python3
    python3-pip libclang-7-dev $ pip3 install clang
  2. 複製並執行建構:
    $ git clone https://github.com/google/sandboxed-api && cd sandboxed-api
    $ bazel build 
  3. 試試下列任一範例
    $ bazel run //sandboxed_api/examples/stringop:main_stringop

可用的說明文件

如要進一步瞭解 Sandboxed API,請參閱:

  • Sandboxed API 說明:說明 Sandboxed API (SAPI) 及其核心概念。

  • 開始使用:提供相關指引,協助您建立 API 的 SAPI 沙箱版本。

  • 建構規則:說明如何使用 sapi_library() 建構規則來建構 SAPI 程式庫。

  • 變數:討論 SAPI 類型的使用方式,將指標傳遞至簡單型別和記憶體區塊時,需要使用這些類型。

  • 交易:說明如何使用 SAPI 交易模組監控函式呼叫。

詞彙

Sandbox2 Google 開放原始碼專案,可在 SAPI 中提供沙箱層。
Sandboxee 在 Sandbox2 沙箱中執行的二進位檔,請參閱 Sandbox2 說明文件。就 SAPI 而言,這是指沙箱化的 C/C++ 程式庫。
SAPI Sandboxed API:Google 開放原始碼專案,提供建構 Sandboxed Library 的功能。
SAPI 程式庫 由 SAPI 產生的程式庫,內含沙箱程式庫、Sandbox2 程式碼和 SAPI 執行階段程式碼。
SAPI 物件 C++ 物件 (包含在主機程式碼中),可使用 SAPI 型別 (而非原始型別) 提供 Sandboxed Library 的介面。
SAPI 類型 SAPI 提供將指標傳遞至簡單型別和記憶體區塊時所需的特殊型別。
SAPI 交易 這個模組用於管理執行間的沙箱化程式庫沙箱狀態。
RPC 存根 遠端程序呼叫 (RPC) 通訊存根,包裝在 Sandbox2 中,用於在 SAPI 物件和沙箱化程式庫之間傳遞資料。
主辦人代碼 使用沙箱化程式庫並包含 SAPI 物件的程式碼。

協助改善 Sandboxed API

如要貢獻心力,請參閱 CONTRIBUTING.md,然後傳送提取要求。您也可以回報錯誤或提出功能要求。

如要與開發人員交流或接收重大產品更新通知,建議加入我們的 Google 群組:sandboxed-api-users