A Distributed Sandbox for Untrusted Computation on Secret Data 閱讀筆記

摘要

本文提出了ryoan的設計與原型實現。ryoan提供了一個分佈式沙箱,並利用硬件enclave來保護沙箱實例以免受潛在惡意計算平臺的攻擊。受保護的沙箱實例限制不受信任的數據處理模塊,以防止用戶數據的泄漏。

  1. 它提供了一個沙箱來限制單個數據處理模塊,防止它們泄漏數據;
  2. 它使用可信的硬件允許遠程用戶驗證單個沙箱實例的完整性並保護它們的執行
  3. 沙箱可以配置爲允許受限的代碼模塊以受控的方式進行通信,從而在互不信任的各方之間實現靈活的委託。

在ryoan的模型中,應用程序和服務提供商都是不可信的。它們可能通過隱蔽通道偷走用戶的私密數據。Ryoan的目標是防止這種隱蔽通道,並阻止不受信任的應用程序祕密使用用戶數據。

Ryoan原型實現使用Native Client(NaCl)作爲沙箱,使用Intel SGX作爲硬件飛地。每個SGX enclave包含一個NaCl沙箱實例,該實例加載並執行不受信任的模塊。NaCl實例相互通信,形成一個分佈式沙箱,爲所有參與方(用戶和不同的服務提供者)提供強大的隱私保障。此外,Ryoan還假定了一個面向請求的數據模型,其中受限制的模塊只處理一次輸入,並且在接收到輸入後不能讀寫持久存儲。

論文的貢獻:

  • 一種新的執行模型,允許互不信任的各方在不可信的基礎設施上以分佈式方式處理敏感數據。
  • 分佈式沙箱原型的設計和實現,它限制不可信的代碼模塊(可能在不同的機器上),並強制執行防止機密泄露的I/O策略。

威脅模型

  1. 用戶不信任服務提供商
  2. 服務提供商不信任第三方計算平臺
  3. 服務提供商不信任外包方
  4. 服務提供商信任自身的代碼和計算平臺
  5. 所有人都信任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對不可信代碼施加的屬性,以實現可觀察行爲與祕密輸入數據的安全解耦:

image_110

下圖1是Ryoan分佈式沙箱的一個實例。

image_111

爲了向後兼容,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沙箱使用軟件來加密驗證模塊的初始狀態。

image_112

ryoan原型實現

強制拓撲

用戶要麼定義受限模塊的通信拓撲,要麼明確批准它。拓撲是具有單向鏈接的模塊的有向無環圖(DAG)。DAG規範首先被傳遞到一個初始飛地,我們稱之爲主飛地。它包含Ryoan提供的標準的、受信任的初始化代碼。master請求操作系統啓動包含規範中列出的模塊的ryanan實例的enclaves。這些飛地可以託管在不同的機器上。
主服務器使用SGX執行本地或遠程認證,以驗證單個Ryoan enclaves的有效性,然後讓DAG中的鄰居enclaves通過使用不可信網絡或本地進程間通信作爲傳輸,通過密鑰交換建立加密保護的通信通道。用戶可以通過認證來驗證主服務器的有效性,並詢問它所需要的拓撲是否已經初始化。在此之後,用戶使用DAG的入口和出口區域建立安全通道,並開始數據處理。

通信中的標籤模型

Ryoan Label

Ryoan採用了以前的基於標籤的系統,使多個互不信任的模塊能夠對敏感數據進行合作。Ryoan使用保密標籤來標記機密數據和見過該機密數據的飛地。Ryoan標籤可以被認爲是在飛地級別粒度上跟蹤污染。

文件進行簽名,並使用相關的公鑰作爲這些模塊的標記。該公司還可以使用不同的密鑰對對其模塊二進制文件進行簽名,使它們成爲不同的主體,從而實現特權分離。

label manipulation rules

每個模塊都有能力添加或刪除與其主體相對應的單個標記——每個模塊都可以解密自己的祕密。當模塊讀取帶有非空標籤的數據時(例如,從用戶或其他模塊的輸出中),它將數據標籤與當前標籤合併,後者將成爲模塊和數據的新標籤。Ryoan用模塊的標籤標記模塊的輸出數據。

image_113

如上圖3所示,Alice使用他自己的標籤對數據進行標記,第一個23andMe模塊添加了23andMe標籤,以確保其祕密在交給亞馬遜的機器學習模塊後不能流回用戶手中。這個控制很重要,因爲用戶控制着拓撲。第二個23andMe模塊將其標籤從輸出的數據標籤中移除。

Ryoan 數據審計跟蹤

當數據遍歷模塊的DAG時,Ryoan跟蹤哪些模塊處理每一項用戶工作。每個工作單元的審計跟蹤可以作爲DAG輸出的一部分提供給用戶。雖然Ryoan不能驗證模塊正在執行它們預期的或聲明的功能,但審計跟蹤仍然是有用的。

Data oblivious communication[1]

數據處理模塊可以通過觀察數據流來推斷隱私數據,因此數據流必須要獨立於輸入數據的內容。一旦模塊讀取了它的輸入數據,Ryoan就永遠不會移動數據來響應不受信任模塊控制的活動。

Ryoan通過固定模塊輸出的大小、應用程序確定輸入的大小來保證數據流模式不會泄露隱私數據:

  1. 在模塊開始處理之前,每個ryoan實例從其他input-connected的ryoan實例讀取它的整個輸入
  2. 輸出的大小是輸入大小的多項式函數
  3. 當模塊輸出完成時,它會通知 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對外提供的服務有:

  1. 虛擬文件系統
  2. mmap

processing-time channels

受限模塊不能通過系統調用與不受信任的操作系統通信,但它可以決定何時完成數據處理,根據數據選擇不同的處理時間,從而成爲操作系統泄密的通道。解決方法有:

  • 固定處理時間

  • 量子化處理時間(quantized processing time)
    事先預設好一些固定的執行時間,可以減少潛在的處理時間粒度。

  • 訪問隨機性
    Ryoan 不允許被限制的模塊,從操作系統中獲得隨機性。獲得隨機性意味着惡意模塊可以從輸入中泄漏隨機位,例如隨機選擇一個輸入位並利用其處理時間泄漏它。如果用戶重複輸入數據,那麼具有隨機性的惡意模塊最終會通過其處理時間通道泄漏整個輸入,即使每個輸入工作單元只泄漏一次。使用固定的處理時間消除這個通道。

  • one shot at input data
    Ryoan 被設計成允許每個模塊有一個單一的機會來處理它的輸入數據,沒有機會將狀態從一個輸入傳遞到下一個輸入。這個一次性政策限制了數據泄露。因此,ryoan 必須阻止模塊在重置後再次訪問相同的輸入:

    1. ryoan的拓撲結構必須是有向無環圖
    2. Ryoan 的重置機制在讀取機密數據後,刪除所有依賴於狀態修改的數據
    3. 若連接中斷,ryoan 會重新初始化所有安全連接,以防輸入重放攻擊

防止特權程序入侵

ryoan必須要依賴於不安全的操作系統(可能還有hypervisor)提供的服務。ryoan必須對來自不安全組件的結果進行驗證,ryoan提供了ryoan-libc庫代替libc庫,以防止惡意程序入侵。

參考文獻


  1. Oblivious data structure ↩︎

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章