A Distributed Sandbox for Untrusted Computation on Secret Data 閱讀筆記
摘要
本文提出了ryoan的設計與原型實現。ryoan提供了一個分散式沙箱,並利用硬體enclave來保護沙箱例項以免受潛在惡意計算平臺的攻擊。受保護的沙箱例項限制不受信任的資料處理模組,以防止使用者資料的洩漏。
- 它提供了一個沙箱來限制單個數據處理模組,防止它們洩漏資料;
- 它使用可信的硬體允許遠端使用者驗證單個沙箱例項的完整性並保護它們的執行
- 沙箱可以配置為允許受限的程式碼模組以受控的方式進行通訊,從而在互不信任的各方之間實現靈活的委託。
在ryoan的模型中,應用程式和服務提供商都是不可信的。它們可能通過隱蔽通道偷走使用者的私密資料。Ryoan的目標是防止這種隱蔽通道,並阻止不受信任的應用程式祕密使用使用者資料。
Ryoan原型實現使用Native Client(NaCl)作為沙箱,使用Intel SGX作為硬體飛地。每個SGX enclave包含一個NaCl沙箱例項,該例項載入並執行不受信任的模組。NaCl例項相互通訊,形成一個分散式沙箱,為所有參與方(使用者和不同的服務提供者)提供強大的隱私保障。此外,Ryoan還假定了一個面向請求的資料模型,其中受限制的模組只處理一次輸入,並且在接收到輸入後不能讀寫持久儲存。
論文的貢獻:
- 一種新的執行模型,允許互不信任的各方在不可信的基礎設施上以分散式方式處理敏感資料。
- 分散式沙箱原型的設計和實現,它限制不可信的程式碼模組(可能在不同的機器上),並強制執行防止機密洩露的I/O策略。
威脅模型
- 使用者不信任服務提供商
- 服務提供商不信任第三方計算平臺
- 服務提供商不信任外包方
- 服務提供商信任自身的程式碼和計算平臺
- 所有人都信任Ryoan和SGX
Ryoan沒有采取任何措施來防止不信任的各方有意(或通過漏洞)洩露祕密。此模型適用於服務提供商在其自己的計算平臺上部署程式碼的情況。當在不同的平臺提供商上執行時,Ryoan提供了針對惡意作業系統的保護,以及通過加密保護資料。
威脅模型僅考慮了軟體介面的隱蔽通道,但是沒有考慮由於硬體限制(hardware limitations)或執行時間(execution time)導致的隱蔽通道和側通道。
Intel Software Guard Extensions (SGX)
SGX允許程序保護部分地址空間不受特權軟體的侵犯。具有sgx能力的機器上的程序可以構造一個飛地。Ryoan使用SGX來證明所有的飛地都有相同的初始狀態和相同的身份。在將敏感資料傳遞給Ryoan之前,使用者可以向SGX請求證明,確認提供的身份是Ryoan identity。
enclave code可以訪問到所有不屬於其他飛地的記憶體空間,但是enclave code並不能利用到x86的所有feature。所有的enclave code都是unprivileged,特權級是ring3. 所有提升特權級的指令都會產生fault。
硬體安全限制
hardware limitations 是ryoan不能夠處理的,一些hardware security limitations如下:
-
SGX page faults
特權軟體可以操作飛地的頁表 -
cache timing
駐留在同一個核心上的兩個程序可以使用快取計時來獲取彼此的細粒度資訊。 -
Address bus monitoring
儘管SGX對RAM中的資料進行加密,但如果攻擊者通過嗅探器或修改過的RAM晶片監視地址匯流排,它就會形成一個快取粒度的側通道或隱蔽通道。如果不進行新的架構更改,Ryoan就無法防止此類攻擊。 -
processor monitoring
處理器監控單元(pmu)為片上事件提供廣泛的效能計數器資訊。如果在enclave-protected執行中發生的事件更新了PMU,那麼不可信程式碼就能夠獲取到這些資訊並構建出祕密資料。
native client
谷歌的Native Client(NaCl)是一個執行在x86平臺上使用軟體故障隔離(software fault isolation)技術的沙箱。NaCl由一個驗證器(verifier)和一個服務執行時(server runtime)組成。為了保證不受信任的模組無法跳出NaCl的SFI沙箱,驗證者會對二進位制檔案進行分解,並驗證分解後的指令是否可以安全執行。
NaCl會攔截系統呼叫,並代替NaCl執行系統呼叫。
設計
Ryoan是一個分散式沙箱,它執行一個有向無環圖(DAG),用於與操作敏感資料的不可信模組進行通訊。Ryoan通過將外部可見的行為與祕密資料的內容解耦,防止模組洩漏敏感資料。
Ryoan提供了一個受限的IO模型來防止資料洩漏,表1總結了Ryoan對不可信程式碼施加的屬性,以實現可觀察行為與祕密輸入資料的安全解耦:
下圖1是Ryoan分散式沙箱的一個例項。
為了向後相容,Ryoan模組支援為libc編寫的程式,其中可以包括完全編譯的語言和構建在libc之上的執行時。為了減少記憶體使用,我們的Ryoan原型不支援即時編譯器(JIT)。在enclaves中不允許Ring 0執行,因此Ryoan不能直接支援作業系統或hypervisor。一個Ryoan模組可以是一個Linux程式,或者它可以包含一個庫作業系統。
SGX為使用者生成一個不可偽造的遠端認證,證明Ryoan例項正在平臺上的飛地中執行。使用者可以建立一個加密通道,她知道該通道將在該Ryoan例項中終止。SGX保證這塊飛地的密碼機密性和完整性不受特權軟體的操縱。
主enclave建立所有的Ryoan例項並在它們之間依照使用者的指示建立加密通訊。一旦分散式拓撲結構建立,主伺服器將拓撲中每個節點的驗證都會轉發給使用者,由使用者驗證配置是否符合預期。然後使用者輸入機密資料。Ryoan通過在DAG的模組新增標籤來保護機密資料。Ryoan的所有例項形成了一個分散式沙箱。
如下圖2所示,SGX使用硬體來驗證Ryoan沙箱,Ryoan沙箱使用軟體來加密驗證模組的初始狀態。
ryoan原型實現
強制拓撲
使用者要麼定義受限模組的通訊拓撲,要麼明確批准它。拓撲是具有單向連結的模組的有向無環圖(DAG)。DAG規範首先被傳遞到一個初始飛地,我們稱之為主飛地。它包含Ryoan提供的標準的、受信任的初始化程式碼。master請求作業系統啟動包含規範中列出的模組的ryanan例項的enclaves。這些飛地可以託管在不同的機器上。
主伺服器使用SGX執行本地或遠端認證,以驗證單個Ryoan enclaves的有效性,然後讓DAG中的鄰居enclaves通過使用不可信網路或本地程序間通訊作為傳輸,通過金鑰交換建立加密保護的通訊通道。使用者可以通過認證來驗證主伺服器的有效性,並詢問它所需要的拓撲是否已經初始化。在此之後,使用者使用DAG的入口和出口區域建立安全通道,並開始資料處理。
通訊中的標籤模型
Ryoan Label
Ryoan採用了以前的基於標籤的系統,使多個互不信任的模組能夠對敏感資料進行合作。Ryoan使用保密標籤來標記機密資料和見過該機密資料的飛地。Ryoan標籤可以被認為是在飛地級別粒度上跟蹤汙染。
檔案進行簽名,並使用相關的公鑰作為這些模組的標記。該公司還可以使用不同的金鑰對對其模組二進位制檔案進行簽名,使它們成為不同的主體,從而實現特權分離。
label manipulation rules
每個模組都有能力新增或刪除與其主體相對應的單個標記——每個模組都可以解密自己的祕密。當模組讀取帶有非空標籤的資料時(例如,從使用者或其他模組的輸出中),它將資料標籤與當前標籤合併,後者將成為模組和資料的新標籤。Ryoan用模組的標籤標記模組的輸出資料。
如上圖3所示,Alice使用他自己的標籤對資料進行標記,第一個23andMe模組添加了23andMe標籤,以確保其祕密在交給亞馬遜的機器學習模組後不能流回使用者手中。這個控制很重要,因為使用者控制著拓撲。第二個23andMe模組將其標籤從輸出的資料標籤中移除。
Ryoan 資料審計跟蹤
當資料遍歷模組的DAG時,Ryoan跟蹤哪些模組處理每一項使用者工作。每個工作單元的審計跟蹤可以作為DAG輸出的一部分提供給使用者。雖然Ryoan不能驗證模組正在執行它們預期的或宣告的功能,但審計跟蹤仍然是有用的。
Data oblivious communication[1]
資料處理模組可以通過觀察資料流來推斷隱私資料,因此資料流必須要獨立於輸入資料的內容。一旦模組讀取了它的輸入資料,Ryoan就永遠不會移動資料來響應不受信任模組控制的活動。
Ryoan通過固定模組輸出的大小、應用程式確定輸入的大小來保證資料流模式不會洩露隱私資料:
- 在模組開始處理之前,每個ryoan例項從其他input-connected的ryoan例項讀取它的整個輸入
- 輸出的大小是輸入大小的多項式函式
- 當模組輸出完成時,它會通知 ryoan,並將模組的輸出寫入所有與output-connected的 ryoan 例項
Ryoan 將模組輸出封裝在一個包含元資料的訊息中,元資料描述了哪部分資料是模組輸出,哪部分是填充(如果有的話)。
Ryoan 確保輸出大小是輸入的固定函式,所以如果輸出不夠大,就是模組的錯誤。Ryoan 將截斷輸出太大和並對輸出太小的進行資料填充。但是,模組作者應該能夠描述給定大小的輸入請求的最大可能輸出。
Module confinement
模組驗證
Ryoan模組驗證通過對載入的程式碼強制執行一組約束來確保模組可以安全執行。Ryoan使用NaCl的loadtime程式碼驗證器來確保模組的程式碼遵循嚴格的格式。NaCl的程式碼格式設計為高效驗證和高效沙盒,限制控制流目標,並乾淨地將程式碼與資料分離。記憶體訪問被限制在模組佔用的地址空間內。
模組生命週期
模組宣告週期包括:creation、initialization、wait、process、output、destruction/rest。
Ryoan’s confined environment
任何帶有限制標籤的模組,都要在 ryoan 的限制環境中執行。當一個模組接收到一個請求中包含的祕密資料時,它進入了有限的環境,失去了通過任何系統呼叫與不受信任的作業系統通訊的能力。因此,ryoan 必須提供一個足夠的系統 api。
Ryoan對外提供的服務有:
- 虛擬檔案系統
- mmap
processing-time channels
受限模組不能通過系統呼叫與不受信任的作業系統通訊,但它可以決定何時完成資料處理,根據資料選擇不同的處理時間,從而成為作業系統洩密的通道。解決方法有:
-
固定處理時間
-
量子化處理時間(quantized processing time)
事先預設好一些固定的執行時間,可以減少潛在的處理時間粒度。 -
訪問隨機性
Ryoan 不允許被限制的模組,從作業系統中獲得隨機性。獲得隨機性意味著惡意模組可以從輸入中洩漏隨機位,例如隨機選擇一個輸入位並利用其處理時間洩漏它。如果使用者重複輸入資料,那麼具有隨機性的惡意模組最終會通過其處理時間通道洩漏整個輸入,即使每個輸入工作單元只洩漏一次。使用固定的處理時間消除這個通道。 -
one shot at input data
Ryoan 被設計成允許每個模組有一個單一的機會來處理它的輸入資料,沒有機會將狀態從一個輸入傳遞到下一個輸入。這個一次性政策限制了資料洩露。因此,ryoan 必須阻止模組在重置後再次訪問相同的輸入:- ryoan的拓撲結構必須是有向無環圖
- Ryoan 的重置機制在讀取機密資料後,刪除所有依賴於狀態修改的資料
- 若連線中斷,ryoan 會重新初始化所有安全連線,以防輸入重放攻擊
防止特權程式入侵
ryoan必須要依賴於不安全的作業系統(可能還有hypervisor)提供的服務。ryoan必須對來自不安全元件的結果進行驗證,ryoan提供了ryoan-libc庫代替libc庫,以防止惡意程式入侵。