2003年11月上旬Google排名演算法發生劇烈更新。一夜之間成千上萬個網站從搜尋引擎中消失或者從前10名降級到100名以後,使很多網站在即將到來的聖誕節購物黃金季節失去大量的客源。這就是舉世矚目的“Google佛羅里達風暴”。在此之後的2004年3月,谷歌特意為反擊垃圾網站推出沙盒機制。
近日,Google宣稱將開源公司內部多年來一直使用的工具「 Sandboxed API 」,該專案用於在Linux系統上執行C/C++庫,可幫助軟體開發者更容易地在軟體中引入「沙盒」機制來防止惡意使用者輸入及漏洞利用。
同時Google還公開了Sandboxed API的核心專案「 Sandbox2 」。Sandbox2現在是Sandboxed API的一部分,提供底層的沙盒原型。也可以單獨用於隔離任意Linux程式,可視為更低階的API。
什麼是「沙盒」機制?
許多軟體專案需要處理到外部資料,在安全方面會顯得有些不足。當解析外部資料的軟體庫足夠複雜時,軟體會存在著嚴重的安全隱患,容易成為安全漏洞的受害者,從而遭遇記憶體損壞或是像路徑遍歷的邏輯解析問題。
一般的做法是將軟體隔離,這個過程就是“沙箱”。通過“沙箱”,開發人員可以確保在解析使用者生成內容涉及的程式碼時,只訪問必要的資源(檔案、網路連線和其他作業系統資源)。最壞的情況下,當潛在的攻擊者取得軟體專案範圍內的遠端程式碼執行許可權時,沙盒技術可以將這些部分包含,從而保護其餘的軟體基礎結構。
Google指出,沙盒技術既要對攻擊有高度的防禦隔離能力,又要讓開發者可以簡單地引入使用,而不用作煩瑣的設定。就這一點而言,現有的軟體隔離工具未能同時達到以上兩個要求。而通過開源的Sandboxed API,開發者便可以整合個別功能,沙盒函式庫可以輕易地在其他專案上重覆運用。
Sandboxed API如何工作?
從高層次的角度看,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來保護開源專案,有機會參與補丁獎勵計劃。
谷歌ISE沙箱團隊成員解釋稱,“Sandboxed API能夠為單個軟體庫建立安全策略。這種理念能夠為流行軟體庫建立可複用且安全的功能,而且也能保護其他軟體基礎設施的安全。”
谷歌還指出,任何人均可提出自己的建議,以更好地改進Sandboxed API,而它也包含在谷歌的“補丁獎勵計劃”中。
參考來源:
更多資訊: