谷歌開源了一個專案,可為 C/C++ 庫建立安全策略
近日,谷歌 開源了 Sandboxed API(沙箱式 API)。 該專案 用於在 Linux 系統上執行的 C/C++ 庫,是谷歌公司內部多年來一直在資料中心使用的工具,可以幫助開發人員免受惡意使用者的輸入和漏洞利用。
沙箱是什麼?
許多軟體專案需要處理到外部資料,在安全方面會顯得有些不足。當解析外部資料的軟體庫足夠複雜時,軟體會存在著嚴重的安全隱患,容易成為安全漏洞的受害者,從而遭遇記憶體損壞或是像路徑遍歷的邏輯解析問題。
一般的做法是將軟體隔離,這個過程就是“沙箱”。通過“沙箱”,開發人員可以確保在解析使用者生成內容涉及的程式碼時,只訪問必要的資源(檔案、網路連線和其他作業系統資源)。最壞的情況下,當潛在的攻擊者取得軟體專案範圍內的遠端程式碼執行許可權時,沙盒技術可以將這些部分包含,從而保護其餘的軟體基礎結構。
沙盒技術必須具有很強的抵禦攻擊能力,從而充分保護作業系統的其餘部分。同時沙箱必須足夠易於使用,以供軟體開發人員使用。為了幫助完成這項任務,谷歌開源了 Sandboxed API ,一個經過實戰考驗的專案,可以為各個軟體庫建立安全策略。
Sandboxed API 用於訪問沙盒庫中的各個軟體功能,也因此谷歌還公開了核心沙盒專案 Sandbox2 。Sandbox2 現在是 Sandboxed API 的一部分,提供了底層的沙盒原型。它也可以單獨用於隔離任意 Linux 程序,可以視為更低階的 API。
Sandboxed API 怎麼工作?
Sandboxed API 目前是針對用 C 語言編寫的軟體庫實現的,未來可能增加更多程式語言的支援。
從高層次的角度看,Sandboxed API 將要加入沙箱的庫和其呼叫者分成兩個獨立的作業系統程序:主機二進位制檔案和沙箱。具體的工作流程是:實際的庫呼叫由主機端的 API 物件進行編組,通過程序間的通訊傳送到沙箱,沙箱的 RPC stub 會進行解組,並將呼叫轉發到原始庫。
其中,API 物件(即圖中的 SAPI 物件)和 RPC stub 都由專案提供,前者由介面生成器自動生成。使用者只需提供沙盒策略、允許底層庫進行的一組系統呼叫,以及允許訪問和使用的資源。這些準備好了之後,基於沙盒 API 的庫就可以輕鬆地在其他專案中重用了。
生成的 SAPI 物件的 API 類似於原始庫的 API,不過會有額外的程式碼出現。這些程式碼用來設定沙箱,以及將記憶體傳入和傳出沙箱。但除此之外,程式碼流保持不變。
未來計劃
Sandboxed API 和 Sandbox2 已經被谷歌的許多團隊使用。雖然該專案已經成熟,但除了維護之外,谷歌也做了一些未來的計劃:
-
支援更多的作業系統:目前只支援 Linux。開發團隊將研究如何將 Sandboxed API 引入類 Unix 系統,如 BSD(FreeBSD,OpenBSD) 和 macOS。Windows 端是一項更難的任務,還需要更多的基礎工作才能實現。
-
新的沙盒技術:隨著硬體虛擬化技術的流行,用沙盒將程式碼限制在虛擬機器中有了實現的可能性。
-
系統構建:目前是使用 Bazel 構建專案,這其中包括依賴項。但這不是每個人都想要的使用方式,因此 CMake 支援有著很高的任務優先順序。
-
Sandboxed API 的傳播:使用 Sandboxed API 來保護開源專案,有機會參與 補丁獎勵計劃 。