Phala技術探悉:在 Intel SGX 環境下實現 Rust 原生 std 支援

Phala Network是基於Substrate技術和波卡生態的首個實現可組合性的機密智慧合約協議,目標是為企業和使用者提供機密計算、資料保護服務,未來將成為波卡隱私計算平行鏈。Phala透過釋放帶有TEE功能的CPU中的算力,為整個波卡生態提供隱私保護技術底層設施。

Phala技術探悉:在 Intel SGX 環境下實現 Rust 原生 std 支援

§。01 簡介

Intel SGX 是一個把應用與 OS 完全隔離的可信執行環境,應用無法直接訪問 OS 提供的資源。我們採用的 Teaclave-SGX-SDK 只提供了 no_std 環境,導致 crates 生態下大量的庫都無法被使用。我們

透過新增 libc 函式模擬 linux 平臺特性,實現依賴 std 的 Rust 生態庫無需修改即可在SGX環境使用

。為了保證儘可能小的安全邊界,我們

對每個增補的 libc 函式做了許可權控制

。同時引入了

二進位制分析

,確保程式不會出現 SGX 非法指令。

§。02 背景

Phala Network 的隱私雲計算服務基於 teaclave-sgx-sdk 開發

,由於 Intel CPU 的 SGX 執行環境相當於裸機無系統,自然地基於 teaclave-sgx-sdk 開發的 rust 程式也只能用 no_std 開發。

teaclave-sgx-sdk

:https://github。com/apache/incubator-teaclave-sgx-sdk

但當專案複雜後,我們還是希望能夠充分利用 Rust 的 crate 生態,這個生態裡大部分 crate 是依賴 rust std 的。我們 no_std 環境想要使用這些 std 的 crate 的話那就得做移植了。

如果單純地將 std 的 crate 移植到 no_std 環境,那每一個crate都會有比較大的工作量。teaclave-sgx-sdk 為了方便移植,給我們準備了一個 sgx_tstd(一個sgx環境的std仿製品)。sgx_tstd 保留了 rust std 中的大部分功能,因此,一般簡單的 crate 移植到 sgx_tstd 僅需要改動數行程式碼,比如在 crate 根部新增,以及新增一些。這樣移植 rust crate 生態就方便了許多,teaclave-sgx-sdk 團隊甚至將一些常用的 crate 都移植好了放到 github。com/mesalock-linux 中。

mesalock-linux

:https://github。com/mesalock-linux/

§。03 sgx_tstd 的問題

移植一個 crate 看上去工作量並不大,但我們很多時候引入一個 crate 並不是單純的一個 crate,他背後的依賴樹連根拔起可能有數十個 crate。原本正常 Rust 生態使用一個第三方 crate 只需要在 Cargo。toml 中新增一行程式碼,而現在變成要去移植一大車 crate 到 sgx 環境。

這種開發模式已經事實上導致了 Rust 生態被分叉成了 和 兩個互不相容世界。這種分裂甚至讓一些 no_std 的 crate 也受影響,比如混用一些依賴 log 或 serde 的 no_std crate 就不能正常編譯,不得不修改他們使用 log-sgx 和 serde-sgx。如果哪天有人再為 arm/AMD的TEE 做一個類似的 rust sdk,難道我們要將 繼續分叉下去?

這種分叉行為同時會導致被移植的生態可能程式碼更新不及時,一些針對 , 的安全掃描公共設施可能也會漏掉 mesalock-linux 生態中的隱患,從而影響下游開發或帶來安全威脅。

§。04 讓 SGX 支援 Rust 原生 std

teaclave-sgx-sdk 開發應用目前標準做法是開啟 並編譯 target 到 。

既然已經 target 到了 ,那麼我們如果不開啟 編譯會有什麼問題呢?

簡單嘗試會得到類似如下連結錯誤:

Rust 的 std 會依賴 libc 來和 OS 互動,intel sgx-sdk 裡面有一個不完全實現的 sgx libc。但 Rust 需要的和系統互動這部分 libc函式往往是SGX不信任的,所以 sgx libc 沒有直接提供,而是大部分實現在 ocall 模組下以 rust ABI 函式的方式提供對等功能,以此提醒開發者這是不受信任的操作。

因此,我們想提供一個轉接層,把這些缺失 libc 函式都補齊,並代理到 sgx-sdk 的對等實現基本就能正常編譯使用原生std了。比如,上圖缺失 write 函式,我們就補一個 write 函式:

這樣,我們轉接層對上模擬一個 linux glibc 的行為,對下轉接到 sgx 特別實現,可讓針對 linux 的編譯的 Rust 應用程式跑在 sgx 內。

經驗證的確如此,在添加了

相應 libc 函式

並拆掉一部分特殊程式碼後,我們 enclave 程式就執行起了。

相應 libc 函式

:https://github。com/Phala-Network/phala-blockchain/blob/550843a14bbc96bdf59033dfa2850429cf9b039e/standalone/pruntime/enclave/src/patch。rs

§。05 std 和 sgx_tstd 共存

上面提到,拆掉了一部分程式碼,主要這些程式碼依賴 sgx_tstd 裡面特有功能,比如 。而開啟原生 std 後 sgx_tstd 就因為 rust 的 lang_item 衝突而不能編譯了。要想恢復使用這些功能,我們要麼自己重新實現(copy)一份,要麼讓 sgx_tstd 和 std 共存。顯然,後者更符合可持續發展原則。因此,我們給 sgx_tstd 打個

補丁

,讓 lang_item 變成一個 feature,不開啟它就能與原生 std 共存了。

補丁

:https://github。com/Phala-Network/incubator-teaclave-sgx-sdk/commit/ec42fc49ccbfd1174b60c96548de009647ab1f9d

§。06 安全考慮

我們 enclave 程式是安全敏感的,如果一股腦將 libc 代理到 ocall 函式,顯然是粗魯的不安全的。因此,我們對每個代理的函式都會根據我們業務需求對其安全性做思考,調整其實現行為。

§。07 getrandom

隨機數安全性尤其重要,直接關係到我們的金鑰安全。rust 的 rand crate 會呼叫 getrandom 函式來獲取隨機熵源。我們將 getrandom函式代理到 sgx_read_rand,sgx_read_rand 在HW 模式下會透過 CPU 硬體獲取真隨機數。實現如下:

§。08 小結

新增 std 支援後,我們用 Rust 開發 SGX 程式變得和開發普通 Rust 應用程式無太大差異,也能直接使用 Rust 標準工具鏈的單元測試等設施,開發效率上升一個臺階。

Phala技術探悉:在 Intel SGX 環境下實現 Rust 原生 std 支援

Phala生態可信網路

Phala是波卡隱私計算基礎設施。Phala Network是波卡上的隱私計算平行鏈,基於類POW的經濟激勵模式,Phala釋放無數CPU中隱私算力並運用於波卡平行鏈,進而服務於波卡上的Defi、資料服務等其他應用。基於Phala的應用pLibra和Web3。0 Analytics已經獲得web3。0基金會grant。

Phala Network生態鏈介紹

Phala旨在成為Web3。0隱私保護基礎設施,基於Substrate開發並透過TEE區塊鏈架構實現機密智慧合約,可以為波卡生態提供隱私計算服務。

為什麼Phala值得重點關注?

1。 熱度長期佔據波卡生態前三名位置,是波卡生態的5大基本專案之一;

2。 迄今為止唯一獲得過三次Web3基金會獎勵的專案,被波卡創始人盛讚為“技術最靠譜團隊”;

3。 專案技術白皮書和經濟白皮書完備,所有資料公開透明,便於投資分析;

4。 專案落地簡單,解決當前資料隱私遭洩露風險高的商業痛點。

Phala技術探悉:在 Intel SGX 環境下實現 Rust 原生 std 支援

作為行業頭部加密資料運營商,中科區塊鏈集團深耕數字貨幣領域,結合市場需求面向全球投資者開放多種數字貨幣儲存開採服務。所設計運營的中科雲系列伺服器,不僅有效保證產能,且封裝時長低於行業平均水平,可搭配組合式叢集方案,儲存海量擴容,算力迴圈使用,大幅降低能耗成本。中科區塊鏈集團,掘金財富時代,點亮數字未來,賦予夢想以力量!

關注中科區塊鏈,圈內資訊盡掌握!

中科

作為中國最早從事區塊鏈技術研究與商業應用、行業內落地場景最豐富的區塊鏈企業之一,秉持「構建開放式價值流通網路平臺,引領區塊鏈技術進步與有效應用」這一發展理念,積極開拓行業生態,助力數字化轉型,憑藉在區塊鏈基礎設施、共識演算法、數字資產、商業積分、供應鏈溯源、智慧合約、資料安全等領域所擁有的自主智慧財產權與核心技術實力,自創立以來,已與金融、電商、民生、康養、政務、能源、製造等關鍵性領域展開深度合作,利用技術和生態優勢為各行業客戶提供全方位、多層次、立體化、安全綠色、高效經濟的區塊鏈成熟解決方案和系統整合服務產品,並承擔國家重大科技專項,完成多個專案的實際落地,所支撐業務規模達數千億人民幣,切實做到了以區塊鏈賦能國內實體經濟的發展。