使用 Rust EDP 撰寫 Intel SGX 程式

前言

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

1
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
1
2
3
4
5
6
7
1) Proceed with installation (default)
2) Customize installation
3) Cancel installation
>2
...
Default toolchain? (stable/beta/nightly/none)
nightly

Install nightly toolchain

1
rustup default nightly

Install EDP components

1
rustup target add x86_64-fortanix-unknown-sgx --toolchain nightly 

Install SGX driver

1
2
3
echo "deb https://download.fortanix.com/linux/apt xenial main" | sudo tee -a /etc/apt/sources.list.d/fortanix.list >/dev/null curl -sSL "https://download.fortanix.com/linux/apt/fortanix.gpg" | sudo -E apt-key add 
sudo apt-get update 
sudo apt-get install intel-sgx-dkms

Install AESM service

1
2
3
echo "deb https://download.01.org/intel-sgx/sgx_repo/ubuntu $(lsb_release -cs) main" | sudo tee -a /etc/apt/sources.list.d/intel-sgx.list >/dev/null curl -sSL "https://download.01.org/intel-sgx/sgx_repo/ubuntu/intel-sgx-deb.key" | sudo -E apt-key add 
sudo apt-get update 
sudo apt-get install sgx-aesm-service libsgx-aesm-launch-plugin

Install Fortanix EDP utilities

1
2
sudo apt-get install pkg-config libssl-dev protobuf-compiler
cargo install fortanix-sgx-tools sgxs-tools

Configure Cargo integration with Fortanix EDP

Create .cargo directory with config file in it, in your $HOME directory with the following content:

1
2
[target.x86_64-fortanix-unknown-sgx] 
runner = "ftxsgx-runner-cargo"

Check your SGX setup

1
sgx-detect  

Run your enclave!

1
2
3
cargo new --bin hello-world 
cd hello-world 
cargo run --target x86_64-fortanix-unknown-sgx 

就像寫一般的 Rust 程式,只差別在 Running 時候的指令。

目錄結構

1
2
3
4
5
6
hello-world/
├── Cargo.lock
├── Cargo.toml      # 套件管理
├── src
│   └── main.rs     # 你的程式
└── target

Architecture

EDP 提供了介面去啟動 enclave 並由 encalve 取得輸出。

enclave-runner 負責加載 enclave。

ftxsgx-runner 是基於 enclave-runner 的執行檔,也可以自己寫。

Deployment

我們需要將執行檔轉換成 .sgxs 的格式,因為編譯器沒辦法直接輸出 .sgxs ,所以先編譯再轉換過去。

Build

1
cargo build --target x86_64-fortanix-unknown-sgx

SGXS conversion

1
ftxsgx-elf2sgxs myapp --heap-size 0x20000 --stack-size 0x20000 --threads 10 --debug

要特別注意 stack size 以及 heap size 的調整。 如果大小給太小可能會導致 enclave 停止運行:

1
2
Error while executing SGX enclave.
Enclave panicked: memory allocation of 590032 bytes failed

但如果大小給太大也會增加 enclave 載入時間,降低效率。

Sign

enclave 在執行前是必需要被簽名的。

1
2
3
4
5
# 使用 OpenSSL 產生 signing key:
openssl genrsa -3 3072 > my_key.pem

# To sign an enclave using sgxs-sign
sgxs-sign --key my_key.pem myapp.sgxs myapp.sig -d --xfrm 7/0 --isvprodid 0 --isvsvn 0

Run

每個 encalve 都需要一個 runner 去執行它,預設使用 ftxsgx-runner

1
ftxsgx-runner myapp.sgxs

簽名放在與 .sgxs 同個資料夾即可,若無也會生成假的簽名。

Conclusion

還是有很多細節還沒看,還有也還沒探討到爆出的一些漏洞、安全性問題。 將研究加入 Intel SGX 是有很多種可能性的:

  • 私鑰管理:使用 enclave 管理私鑰
  • 與區塊鏈結合:提高區塊鏈應用的安全性
  • 電子硬體錢包:在更安全的環境中執行虛擬貨幣交易
  • 多方計算(Multiparty computation)
  • IoT:提升通訊安全

Reference

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus