前言
Intel Software Guard Extensions(Intel SGX) 提供以硬體為基礎的可信執行環境,與 ARM TrustZone 類似,可在記憶體內隔離特定的應用程式碼與資料,保護隱密資料不會被惡意程式攻擊或竊取。 它允許用戶於記憶體中建立私有區域,稱為「指定位址空間」(enclave),程式碼可於 enclave 中執行, 與其他運行在相同或更高權限級別的程式有效隔離。
Intel SGX & Enclave
Intel SGX 為於 x86 實作 enclave 的 instruction set extension。 Enclave 為程式提供了一個安全的執行環境,不受外界干擾。 該環境建立在三個關鍵點上:
Fully isolated execution
通常在執行程式時,會有大量程式比你的程式擁有更多的特權:像是作業系統等等。他們可以從記憶體中讀取 secret,在其他機器上創建你的程式的副本,並修改你的程式的工作方式。 而在 enclave 中運行的程式與系統的其餘部分完全隔離。一旦 enclave 被加載,保存在 enclave 中的程式和數據就不會被修改,初始記憶體內容代表 enclave 的身份(identity),如果更改 enclave 的程式,其身份也會更改。
使用 Intel SGX 的應用程式會分為兩個部分:
- 可信部分(Trusted component):也就是 enclave。
- 不受信任部分(Untrusted component):這是應用程式的其餘部分及其任何模塊。從 enclave 的角度來看,OS 和 VMM 被視為不受信任的部分。
Sealing
資料並不會永久的儲存在 enclave 中。 Sealing 為將數據加密的過程,以便將數據儲存在不受信任的地方。 Enclave 會獲得和自己身份和 CPU 相關的密鑰,此密鑰稱為密封密鑰(sealing key),它可用於加密數據(sealed blob),以後在完全相同的 CPU 上運行的完全相同的 enclave 程式就能解密數據。
若程式改變,身份會改變,sealing key 也會不同。 如果程式運行在不同的 CPU 上,sealing key 也會不同。
Remote attestation
遠端證明用來確定遠端系統完整性,確定其是否可信。在 SGX 中,enclave 可以使用遠端證明提供其身份及其執行環境的證明,表示硬體有確實使用 SGX 執行特定的 enclave。該證明為由 CPU 使用其私鑰簽署的數位簽章,此私鑰只能用於遠端證明,並可以使用公鑰驗證簽名。
Attesatation 也有 local attestation,即為在同一機器兩個 enclave 互相認證的過程。
Rust EDP
選擇 Rust EDP 來寫 SGX 程式還是因為寫起來比較親民,否則需要寫可信區跟不可信區的程式,好麻煩…
Installation
先看一下 CPU 能不能支援 Intel SGX: 如何知道我的 Intel® 處理器是否支援 Intel® Software Guard Extensions (Intel® SGX)
- 環境 Ubuntu 18.04
Install Rust
|
|
|
|
Install nightly toolchain
|
|
Install EDP components
|
|
Install SGX driver
|
|
Install AESM service
|
|
Install Fortanix EDP utilities
|
|
Configure Cargo integration with Fortanix EDP
Create .cargo
directory with config file in it, in your $HOME
directory with the following content:
|
|
Check your SGX setup
|
|
Run your enclave!
|
|
就像寫一般的 Rust 程式,只差別在 Running 時候的指令。
目錄結構
|
|
Architecture
EDP 提供了介面去啟動 enclave 並由 encalve 取得輸出。
enclave-runner
負責加載 enclave。
ftxsgx-runner
是基於 enclave-runner
的執行檔,也可以自己寫。
Deployment
我們需要將執行檔轉換成 .sgxs
的格式,因為編譯器沒辦法直接輸出 .sgxs
,所以先編譯再轉換過去。
Build
|
|
SGXS conversion
|
|
要特別注意 stack size 以及 heap size 的調整。 如果大小給太小可能會導致 enclave 停止運行:
|
|
但如果大小給太大也會增加 enclave 載入時間,降低效率。
Sign
enclave 在執行前是必需要被簽名的。
|
|
Run
每個 encalve 都需要一個 runner
去執行它,預設使用 ftxsgx-runner
。
|
|
簽名放在與 .sgxs
同個資料夾即可,若無也會生成假的簽名。
Conclusion
還是有很多細節還沒看,還有也還沒探討到爆出的一些漏洞、安全性問題。 將研究加入 Intel SGX 是有很多種可能性的:
- 私鑰管理:使用 enclave 管理私鑰
- 與區塊鏈結合:提高區塊鏈應用的安全性
- 電子硬體錢包:在更安全的環境中執行虛擬貨幣交易
- 多方計算(Multiparty computation)
- IoT:提升通訊安全