童年的時候,我們許多人都玩過沙箱:可控制的玩耍環境,使我們能安全地建立城堡,而不用挖空后院。在計算機領域,沙箱的功能與此類似。只是在這個沙箱中,研究人員和IT技術人員玩的是比特流,而不是一堆沙子。在這篇文章中,我們會討論應用程序沙箱、或者安全程序沙箱的概念,包括這些程序到底是什么、它們如何工作以及它們帶來的漏洞是否比阻止的漏洞更多。
沙箱提供獨立或者密閉的空間,能像實際的網絡——但并不與實際網絡相連接——一樣工作。在這個孤立空間中,程序應用也可以被下載、解壓和測試,然后再移植到實際的服務器上,從而(希望)能夠防止惡意軟件致使網絡發生紊亂。
圖1:運行沙箱和不運行沙箱的計算機示例
沙箱最初是為開發和測試程序而設計,現在已經演變為一個安全工具,能夠將活動的程序或進程與宿主系統或本地桌面分隔開。因此,安全沙箱已成為保護系統安全的有效方法,能防止未認證或不受信的程序在網絡上肆意破壞。
普通的計算機用戶每天都可能會遇到多個沙箱。Google公司的Chrome瀏覽器使用沙箱隔離JavaScript的執行、HTML的解析以及插件的運行。這是通過讓每個標簽都獨立運行在自己的沙箱中來完成的,從而使得Web應用程序與用戶的機器隔離開。然而,在2011年二月初,Google修補了Chrome中的九個錯誤,包括一個沙箱逃逸漏洞。雖然其他漏洞的細節都公布了,但是Google卻沒有完全透露關于沙箱漏洞的全部信息。信息的不透明使人們對該款瀏覽器的安全性產生懷疑。如果這個漏洞允許程序突破沙箱進入到宿主系統,那么宿主系統就可能被安裝惡意軟件,敏感數據就存在危險。
流行的Web服務貝寶(PayPal)也利用沙箱技術為商戶提供測試環境。該沙箱能在實際接受顧客的網絡交易服務之前為用戶提供產生和管理模擬賬戶的機會。但這樣仍然存在問題——特別是跨站腳本(cross-site-scripting,XSS)漏洞。
Adobe系統公司在其最近發行的Flash版本中加入了沙箱安全功能,防止從本地文件系統加載的Flash文件向遠端發送數據。盡管惡意黑客們已經盡力打破了Adobe的沙箱,但是沙箱功能還是是一種潛在有用的威脅防御策略。
計算機和網絡取證偵查員也能從沙箱技術中獲益。通過讓觀察員檢查惡意執行程序在“自然”環境中解壓和執行的情況,沙箱能限制可能的外部因素——如其他的程序或者服務——影響證據。理論上,這聽起來很驚人,但實際上,沙箱可能會帶來更多的漏洞。
沙箱:技術和用戶實例
諸如Adobe和PayPal之類的公司引入沙箱程序,這會使他們的軟件更安全嗎?還是只是帶來了一個潛在的受攻擊層?在IT安全領域,深度防御(defense-in-depth)的目標在于分層次使用不同的安全防護方法,努力提高整體的安全現狀。然而,在這種情況下,增加一個應用層意味著加入了另一個可滲透的層,可能導致惡意軟件和黑客穿透沙箱并進入宿主計算機系統。
在部署沙箱之前安全管理員應問自己如下四個問題:
沙箱技術阻止哪一類威脅最有效?
對公司來說,要最佳的實現和集成沙箱技術,了解沙箱的能力和局限是必要的。不切實際的期望只會導致公司組織更加的自滿,也更加脆弱。
沙箱技術不能檢測的威脅是什么?
沙箱沙箱不能檢測加密的病毒或其他惡意代碼,迫使網絡管理員不得不增加進一步的安全保護措施,結果是由于增加層次而帶來了復雜性。
沙箱會帶來什么風險?
沙箱會給系統帶入新的安全漏洞,如潛在的堆棧溢出、訪問主機系統的本地庫以及其他因使用Java和C#編程繼承而來的固有缺陷。進一步的風險包括安全措施或數字沙箱本身。
是否有沙箱的替代品可以達到相同的結果?
沙箱技術有助于程序員測試他們所寫的代碼,但依靠沙箱測試未知代碼是有風險的。通常情況下簡單地忽略額外的軟件層會更加安全。
例如,當Adobe的沙箱運行在保護模式時,一些威脅——如鍵盤監視——就可能會被避免,但其他的風險——如對受限區域的訪問,如注冊表——可能會升高。
沙箱的潛在漏洞
沙箱可主要分成三個部分:核心語音解釋器、標準函數庫以及不受信任的應用程序代碼。在這三部分中,標準函數庫包含了執行路徑——如網絡通信和密碼系統的路徑——是最容易受到攻擊的部分。這是使用Java或C#編寫這些庫直接導致的,使得標準庫繼承了這些語言的固有缺陷,如堆棧溢出漏洞。實際上,C#將部分代碼標記為不安全的不僅會弱化系統的安全性,還會輕易允許對主機系統本地庫的訪問。
許多人會把沙箱和虛擬機(VM)混淆,這可能是因為許多公司將虛擬機當做沙箱來使用。在典型的家用計算機上,這么做可能是適宜的,可以增加Web瀏覽時的安全性;但不建議在保存有敏感數據的系統上測試可疑程序。
由于在個人電腦上使用越來越廣泛,虛擬機常被用于產生蜜罐或被當做常用的網絡安全手段,黑帽黑客們正在編寫新的惡意代碼。這種惡意代碼可通過尋找虛擬機在系統內存、正在運行的進程、注冊表和文件系統中留下的典型特征來檢測是否有虛擬機正在運行。它甚至會尋找虛擬機硬件和處理指令。因此,使用虛擬機作為沙箱(或其他安全用途)要冒極大的風險,只能嚇走低級的——或機會主義的——黑客。這些黑客往往不具備相應的能力或工具來檢測是否有虛擬機在運行。
最后,安全沙箱程序不是萬能的。沙箱的設計目的在于分隔代碼和主機系統;然而,如上所述,沙箱會在無意中帶來各種安全漏洞和問題。因此,正如對待其他安全措施那樣,在決定使用何種安全功能時,風險評估和風險減低是至關重要的。沙箱技術的發展不僅能尋找到新的應用場景和提供多種多樣的好處,也可能導致自滿和系統已經完全安全的錯覺。盡管深度防御是個好的策略,但同時我們需要謹記,每增加一個應用層,可利用的漏洞也會增加。
各種新式的安全措施都有意想不到的后果,沙箱也一樣。因此,單獨依靠沙箱來保證程序的完整性將是一個嚴重的錯誤。正確的應用程序安全措施要求多層次的安全防護,這些措施一起工作才能提供堅固的、多方面的應用程序防御體系。正確地使用沙箱能帶來好處,但是要意識到危險的存在,否則,那些有效的應用程序,可能會像昔日童年的沙礫那樣,從你的指尖滑落到地。