保護與安全

沙盒(sandbox)

兒童的沙坑四周有圍欄是有道理的:不管裡頭弄得多亂,都留在裡面,院子其餘部分平安無事。軟體沙盒對「執行你並不完全信任的程式碼」也是同一個點子。你讓程式跑,但是在一個被嚴密圍起的環境裡,它只能碰一小組受控的資源——這樣即便它後來證明有臭蟲、甚至徹頭徹尾懷有惡意,它能造成的損害也被圈在盒子裡。

沙盒的運作方式是「嚴格限制一個行程能做什麼、能看到什麼」。它由堆疊作業系統的各種保護機制建成:以最小權限執行那段程式碼,使它一開始就幾乎沒有任何權限;限制它能發出哪些系統呼叫(一個無法呼叫網路、無法開啟任意檔案的惡意程式,已被拔去大半利牙);只給它一個受限的檔案系統視角,且不准存取其他行程;並倚賴硬體保護,使它無法觸及自己記憶體之外。網頁瀏覽器就是日常例子:每個網站不受信任的 JavaScript、且往往是每個分頁的算繪引擎,都跑在一個沙盒化的行程裡,它讀不到你的檔案或其他分頁——所以一個利用算繪臭蟲的惡意網頁,仍被困在那一個沙盒裡、搆不到你的文件。手機 App 也以同樣方式執行,各自在自己的沙盒裡,使一個 App 無法翻找另一個的資料。

沙盒之所以是最有效的現代防禦之一,正是因為它假設「裡頭的程式碼可能懷有敵意」並仍將其圍堵——它是最小權限與縱深防禦的實際體現。誠實的提醒是:沙盒的強度只等於它的牆。一次沙盒逃逸——沙盒強制本身、或其底下核心的一個臭蟲——會讓被圈住的程式碼破牆而出,而這類逃逸雖然困難,卻是攻擊者極為看重的。也要注意:沙盒不等於虛擬機器:沙盒通常仍倚賴主機核心來強制那道界線(所以核心的瑕疵能破它),而虛擬機器則執行一整個獨立的客體作業系統,以更高的代價換取更強的隔離。

你開啟一個惡意網頁。它的程式碼利用瀏覽器算繪引擎裡的一個臭蟲、跑起任意指令——但那個引擎坐在一個沙盒化的行程裡,沒有檔案存取、只有一組受限的可用系統呼叫。攻擊者取得了程式碼執行能力,卻讀不到你的文件、也碰不到其他分頁。要真正逃逸,他還需要沙盒或核心裡的第二個臭蟲。

沙盒內取得程式碼執行能力仍被圍堵——要逃逸還需要再一個臭蟲。

沙盒的強度只等於它的牆——一個沙盒逃逸的臭蟲、或其底下核心的瑕疵,就能讓被圍堵的程式碼破牆而出。而且沙盒不是虛擬機器:它通常倚賴共享的主機核心,較輕量但隔離較弱。

又稱
sandboxingisolationapplication sandbox沙箱隔離