日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

小谈Intel SGX

發(fā)布時間:2024/3/7 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 小谈Intel SGX 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目錄

Intel SGX簡介

背景

為什么要Intel SGX?

Intel SGX尚處于學(xué)術(shù)討論

Intel SGX和可信啟動什么關(guān)系?

開發(fā)者眼中SGX長什么樣子?

SGX訪問控制是什么?

MEE與SGX EPC內(nèi)存加密

CPU里面SGX長什么樣子?

有Enclave的APP的虛擬地址空間長什么樣?

SGX目錄、文件初體驗

SGX和它的小伙伴

SGX應(yīng)用

第一種,SGX應(yīng)用于服務(wù)器端,云端

第二種,應(yīng)用于客戶端

第三點,SGX應(yīng)用于分布式客戶端

SGX應(yīng)用的總結(jié)

SGX保護框架(SGX Shield Framework)

SGX軟件層改進

SGX攻防

Intel SGX發(fā)展趨勢

SGX軟硬件棧

基本介紹

背景知識

SGX的可信保障及優(yōu)點

SGX的不足

SGX與TrustZone區(qū)別

SGX內(nèi)存布局及訪問控制

SGX軟硬件棧圖示

硬件

驅(qū)動

不可信運行

可信運行時

應(yīng)用程序

Enclave程序

硬件指令

內(nèi)核權(quán)限硬件指令-ENCLS

用戶權(quán)限硬件指令-ENCLU

SGX初始化過程

EINIT指令過程

驅(qū)動接口

SGX API

1. 可信運行時庫函數(shù)

2. 不可信運行時庫

3. SGX API應(yīng)用舉例——本地DH會話建立

SGX開發(fā)特點

橋函數(shù)總結(jié)

SGX參數(shù)及函數(shù)屬性

SGX Switch模式及Switchless模式

SGX初始化

基本介紹

環(huán)境檢查總結(jié)

uRTS端構(gòu)建Enclave總結(jié)

uRTS維護Enclave、tRTS端構(gòu)建Enclave總結(jié)

收尾及Switchless模式初始化步驟總結(jié)

Intel SGX ECALL

ECALL Switch/Ordinary總結(jié)

ECALL Switchless總結(jié)

OCALL Switch/Ordinary總結(jié)

OCALL Switchless總結(jié)


Intel SGX簡介

背景

為什么要Intel SGX?

Intel SGX的目標(biāo)就是為了解決目前日益受關(guān)注的“遠程計算的安全問題”。

以云環(huán)境為例子,云租戶會將自己的產(chǎn)品部署在云平臺中,但是云平臺現(xiàn)在普遍認為是一個不可信的地方,因為可能會有云平臺管理者、同一云主機其他租戶的惡意攻擊,也可能云平臺本身存在漏洞,使得黑客輕易的攻擊并拿到Ring0權(quán)限(就好比我租了房東的一間臥室,我害怕房東、其他租戶、陌生人對我房間東張西望,甚至搞破壞。)。這種情況下,云租戶就開始擔(dān)心了。

與此同時,Intel SGX出現(xiàn)了,它對自己做了一個安全內(nèi)存Enclave的概念,對安全內(nèi)存實施權(quán)限控制、加密等安全措施,防止別人(Ring0級別的攻擊者)非法對安全內(nèi)存內(nèi)的敏感數(shù)據(jù)代碼進行機密性、完整性、真實性的破壞(Intel SGX對可用性并不保障),其中完整性主要通過可信建立Enclave保證,真實性通過由硬件背書的本地/遠程認證來確保。就好比我租了房東臥室后,我對自己臥室的墻進行加固,并且對門加上自己的鎖(內(nèi)存訪問控制),甚至讓房間內(nèi)的東西也進行上鎖(內(nèi)存加密),不讓人家偷窺、搞破壞。

除了云環(huán)境,Intel SGX旨在防所有Ring0級別的攻擊者(OS、VMM等),服務(wù)器中也可以對敏感部分就行加固。開發(fā)商下放版權(quán)也可以放到客戶端的SGX保證版權(quán)保護。此外還有對區(qū)塊鏈這種分布式客戶端的形式就行客戶端本地的SGX保護。

Intel SGX尚處于學(xué)術(shù)討論

Intel SGX在學(xué)術(shù)圈屬于非常熱門的一個點,論文很多,這說明大家感覺Intel SGX的安全特性很有意義,也說明Intel SGX目前也有不少值得探討的問題存在。

由于Intel SGX會導(dǎo)致應(yīng)用開發(fā)方式的不同,使得Intel SGX很難真正用于實際生產(chǎn),這里主要指無法將原有的產(chǎn)品直接放到SGX中,這是第一點。第二點,對于未來將開發(fā)的產(chǎn)品,由于產(chǎn)品往往依賴于某些庫,但是實際中,這些庫并沒有人將它費勁的搬到SGX中,導(dǎo)致SGX只有Intel維護的標(biāo)準(zhǔn)C/C++庫等,并沒有豐富的庫,導(dǎo)致Enclave內(nèi)部開發(fā)起來也費勁。此外,Enclave內(nèi)部目前應(yīng)該只支持C、C++的開發(fā),Python、Java這種個人感覺更適合上層開發(fā)的語言目前沒有支持。

上述說明SGX是個學(xué)術(shù)寵兒,但是實際應(yīng)用中,除非工業(yè)界非常感興趣,不然沒有那么多人力物力將不重要的產(chǎn)品搬到SGX中。所以就看產(chǎn)品是否敏感到非用SGX不可。

此外也有Graphene-SGX等能夠讓傳統(tǒng)APP不需要改代碼就能跑在SGX中,但是其會引入LibOS等相關(guān)內(nèi)容,使得Enclave內(nèi)部冗雜,TCB變大;并且效率受影響,SGX本身由于進出Enclave刷新TLB等安全措施導(dǎo)致效率有損耗;兼容性值得考量,個人不是很了解LibOS,但是對LibOS能夠提供的兼容性值得考慮。

以我現(xiàn)在觀察發(fā)現(xiàn),基于Graphene-SGX等的產(chǎn)品數(shù)量貌似不如直接用SGX開發(fā)的多,(這個觀察不一定準(zhǔn)確),一方面是Graphene-SGX知名度不如SGX,一方面是Graphene-SGX出現(xiàn)時間也略晚,還有一方面就是Graphene-SGX某些特性上并不如直接從SGX開發(fā)來的高效,穩(wěn)定。

Intel SGX的好伙伴——ARM上的TrustZone,我們似乎也沒有觀察到TrustZone也有很普遍的應(yīng)用,一般還是敏感到需要用到了才不得不用。(觀察不一定準(zhǔn)確)或許未來又是另一番場景,我便不得而知了,但是可以肯定的是SGX想要廣泛應(yīng)用,必須要SGX支持足夠的中間件、庫,能讓上層便捷的開發(fā)。

Intel SGX還有一點比較要命的就是,它對性能會帶來一定程度的影響,出入Enclave會有3k+ Cycle,而系統(tǒng)調(diào)用也就0.2k+Cycle,另一個由于EPC容量有限,目前最大只支持256M,EPC的Swap相對會比較頻繁,并且會引起40K+Cycle。

希望有一天,若為安全故,兩者皆可拋?畢竟解決遠程計算安全問題的需求還是很大的。

Intel SGX和可信啟動什么關(guān)系?

在SGX之前,可信計算中可信啟動其實挺火,主要是說從底層Bootloader->BIOS->OS/VMM->APP的一步步遞進的可信度量和啟動。但是這種模式局限程度高,而且也有人說這限定了就幾個大廠的產(chǎn)品滿足可信啟動的條件,相當(dāng)于某種壟斷。而且這種效率其實也有影響,且TCB大。

SGX主要還是CPU硬件里面強制將某塊內(nèi)存定義為安全內(nèi)存,并施加硬件級別的訪問控制等,這樣的話,就不要求整個主機都是可信的,只要SGX所管理的Enclave安全內(nèi)存是可信就行(包括Enclave代碼的可信度量和建立)。

開發(fā)者眼中SGX長什么樣子?

下面這個是畫的舊圖。

簡單來說SGX就是提供了一個安全內(nèi)存及其相關(guān)。下面稍微講一下SGX軟件棧結(jié)構(gòu)(具體見《SGX軟件棧》文檔)

總的來說,SGX是劃分兩個世界的——可信世界和不可信世界。每一個世界中,想要使用SGX的開發(fā)都需要開發(fā)哪一個世界的代碼,一般來說,不可信世界開發(fā)非敏感代碼(稱為APP,另一種理解就是APP也包含Enclave,這樣為了區(qū)分,就把不可信的叫做APP),可信世界開發(fā)敏感代碼(Enclave),或者說敏感代碼移入了可信世界。

既然有了兩個世界,他們之間的連接就需要有一個叫做橋函數(shù)的東西,ECALL橋能讓APP可以調(diào)用橋函數(shù)間接調(diào)用Enclave中寫好的API函數(shù)。反向的有個叫OCALL橋的東西。橋函數(shù)上承載著兩個世界間傳遞的參數(shù),而且ECALL中,Enclave并不信任APP傳給Enclave的ECALL參數(shù),所以需要參數(shù)的消毒檢查。OCALL有點類似。

既然要開發(fā)程序,就要用到SDK(我這里是把可信Enclave使用的SDK稱為SDK,這也符合Intel的叫法,另一種理解是SDK包括給不可信APP使用的PSW、給可信Enclave使用的SDK、橋函數(shù))和PSW,這兩個都是Intel提供的(linux下見github.com/intel/linux-sgx)。由于Enclave要保證自己內(nèi)部開發(fā)的函數(shù)盡可能不會離開Enclave,所以Enclave內(nèi)部用的SDK都是用靜態(tài)庫鏈接,除非萬不得已,比如系統(tǒng)調(diào)用等,那么就得同OCALL橋到不可信世界完成任務(wù)。然后頂多是啟發(fā)式的對OCALL返回值進行檢查(而且目前Intel并無消毒檢查,除非Enclave開發(fā)者自己做檢查)。

PSW、SDK一部分功能是用于我們傳統(tǒng)的那種為了具有某個功能而開發(fā)的函數(shù),還有一部分是對CPU提供的SGX功能指令的包裝,主要用于SGX特性的支持,為了讓你真正和CPU溝通,并獲得SGX特性支持。SGX特性是通過CPU向外面提供Ring0指令和Ring3指令,其中Ring0指令ENCLS主要有一些比如創(chuàng)建Enclave這種生命周期管理、頁權(quán)限管理的指令。Ring3指令ENCLU主要是讓控制流能夠在兩個世界之間流動,比如進出Enclave這種。

這一塊的細節(jié)可以看《SGX軟件棧》。

SGX訪問控制是什么?

SGX訪問控制是說對Enclave安全內(nèi)存進行訪問控制,不能讓攻擊者非法訪問敏感內(nèi)存。這主要還是通過CPU內(nèi)部實現(xiàn)的。有SGX特性CPU能夠讓不可信APP只有滿足進入它的Enclave的條件時才能放行,而且Enclave A和Enclave B之間是互相不可訪問的。這種邏輯是CPU里面的EPCM和內(nèi)存RAM中被CPU定義為EPC里面的SECS結(jié)構(gòu)體、TCS結(jié)構(gòu)體這些單元連動完成的。

《SGX技術(shù)的分析和研究》有介紹具體有哪幾則訪問控制。

MEE與SGX EPC內(nèi)存加密

EPC,Enclave Page Cache,是被加密的安全內(nèi)存頁,由MEE加密。

MEE是Memory Encrypt Engine,內(nèi)存加密引擎,會對從CPU緩存、寄存器之類的地方往其他如內(nèi)存(比如EPC)、硬盤運輸之前都加密,因此在內(nèi)存、硬盤的敏感數(shù)據(jù)都是加密的。

這種好處就是能夠抗總線攻擊,防止攻擊者直接物理連接總線竊取敏感數(shù)據(jù)。劣勢,就是或多或少會有加密導(dǎo)致效率的影響,雖然說MEE已經(jīng)是一個專門的用來加密的模塊。

CPU里面SGX長什么樣子?

這張圖主要是講SGX初始化過程的,也可以拿來講解CPU里面多了哪些部件。下面中間RAM這個是內(nèi)存,內(nèi)存里面一部分EPC就是存放Enclave的安全內(nèi)存池,里面有多個安全內(nèi)存頁,每個Enclave按需從這里拿取Enclave安全內(nèi)存頁。

最左下角EPCM(Enclave Page Cache Map)是一個安全內(nèi)存管控的內(nèi)置微架構(gòu)結(jié)構(gòu)體(internal micro-architecture structure ),會由PMH硬件模塊進行查EPCM,進行訪問控制。PMH和EPCM主管對EPC的訪問控制,會依賴SECS、TCS聯(lián)動判斷。

圖片右下角就是CPU及其MMU、MEE部件,MMU是傳統(tǒng)的地址翻譯部件,MEE是說SGX能夠做到在EPC中的敏感數(shù)據(jù)能夠明文存在(因為有訪問控制,不擔(dān)心被偷窺),但是EPC中的數(shù)據(jù)一旦會轉(zhuǎn)到普通硬盤中的(由于EPC大小一般是256M,因此會出現(xiàn)換入換出到硬盤的情況),那么MEE就加密那個明文,只讓密文存在于硬盤中。其實MEE不單單是對換入換出到硬盤就行加密,它對任何離開CPU安全邊界的明文都進行加密。

最左上角是Enclave代碼,這里代表的意思是Enclave代碼已經(jīng)放到了EPC中,然后圖片上講原來在RAM的EPC中的Enclave,單獨畫出到外面來,它本質(zhì)是存在于EPC中的。

上面這個APP和Enclave代碼是一個二進制文件,最終會被加載到內(nèi)存的普通內(nèi)存(APP部分代碼)和安全內(nèi)存中(Enclave部分代碼)。

中間OS是在Enclave啟動過程中(從無到有),完成對安全內(nèi)存頁申請,代碼復(fù)制進安全內(nèi)存頁等一系列操作的管理(《SGX軟件棧》文檔中有專門講這個)。我之前說了OS是不可信的,所以通過OS啟動Enclave會需要一些額外的措施:Architectural Enclave這個特殊的Enclave(由Intel簽名并啟動起來的Enclave)會對Enclave的完整性進行簽名保證,Enclave被OS啟動過程中,相應(yīng)的啟動過程的度量會放在EPC的SECS中,最后會對AE簽名的那個度量值比對,為了防止OS對Enclave啟動過程中做小動作。

總結(jié)一下,CPU本身擴充了很多硬件指令,可以分為兩大類ENCLS、ENCLU。上圖可以看到CPU所增加的硬件部件,有MEE、PMH(查EPCM)、Intel ME(粗粗了解到它提供可信輸入和可信時間)(其他暫且沒想到,似乎還有)。

SGX初始化過程大概就是建立時候申請安全內(nèi)存頁,然后將Enclave代碼放進去,并且度量建立過程是否可靠。(細節(jié)見《SGX軟件棧》)

有Enclave的APP的虛擬地址空間長什么樣?

APP依然還是那個APP,有著常見的虛擬地址空間(比如4G,32位地址下),然后其中有一整塊,比如0X700-0X800(通過觀察一般都是高地址,這里只是隨便寫了)是給Enclave的,因為Enclave是一個.so動態(tài)庫鏈接給APP的,Enclave虛擬地址的起始地址依賴于ALSR地址空間隨機化給定。

那我們假設(shè)訪問某個Enclave函數(shù)時,我們用的這個函數(shù)的虛擬地址(和正常虛擬地址空間里面調(diào)用函數(shù)一樣),然后會經(jīng)過MMU的虛實地址轉(zhuǎn)換,變成物理地址,這個物理地址會指向EPC,前面講了EPC是RAM中的一部分(而且是靠前的一部分,存在于PRM中,由BIOS和范圍寄存器來決定EPC的大小),所以EPC也是有物理地址的,這也很正常。物理地址拿到后,想要訪問EPC物理頁,那么請先經(jīng)過EPCM的訪問控制檢查。如果通過了,那么IP寄存器就會給到那個Enclave函數(shù)了。

SGX目錄、文件初體驗

?

和傳統(tǒng)應(yīng)用開發(fā)不同,上圖可以看到APP、Enclave是分開編寫的。命名倒是無所謂,具體會通過Makefile里面說明把哪些編程Enclave。

?

此外,通過這個EDL文件可以清楚的看到光是進出Enclave的接口就分開了。一部分trusted括起來的是ECALL用來進入Enclave,untrusted括起來的是OCALL,用來離開Enclave。

SGX和它的小伙伴

要知道可信執(zhí)行環(huán)境不止Intel SGX一家,所以很多思想可能值得借鑒的地方,并且,應(yīng)該是能夠以可信執(zhí)行環(huán)境一個更高的高度來看待這些應(yīng)用攻防的問題。

硬件比如還有TrustZone、RISC-V KeyStone、AMD SEV、RISC-V 蓬萊TEE。軟件有Virtual Ghost、SP3、Overshadow、InkTag、CHAOS、AppShield(這個不一定準(zhǔn)確),他們都或多或少有類似Enclave的可信執(zhí)行環(huán)境的概念。

SHIELDING SOFTWARE FROM PRIVILEGED SIDE-CHANNEL ATTACKS(SEC’18)這篇是關(guān)于Virtual Ghost的工作。它做了兩個工作。第一,針對已有的頁表側(cè)信道,它的做法是將頁表機制由Virtual Ghost內(nèi)部來完成,OS所保管的Direct Map中對于Virtual Ghost內(nèi)部安全有用戶空間的映射被刪除。第二,針對LLC側(cè)信道,利用Intel Cache Allocation Technology,從硬件層面對LLC實施隔離,不讓OS窺探Virtual Ghost內(nèi)部的存放于LLC中隱私。Intel CAT技術(shù)是Intel RDT的子模塊,我目前感覺和SGX一樣是向用戶態(tài)提供Ring3指令用于CPU特性管理(可能存在錯誤)。

接下來我們講講現(xiàn)在有哪些SGX的研究了。分類方法主要依賴于CCS’17中,關(guān)于SGX的三篇綜述

SGX應(yīng)用

第一種,SGX應(yīng)用于服務(wù)器端,云端

這一類個人覺得很需要結(jié)合代碼、它們所描述的行業(yè)需求和以前的行業(yè)產(chǎn)品去考慮問題,畢竟是應(yīng)用,不然可能體會不到精髓。

我對SGX應(yīng)用的理解也停留在表層,就是他們拿SGX大概做了個啥,但是有些細節(jié),我目前也說不太上來。

?DelegaTEE(SEC’18)?Sini?a Mateti? (ETH Zurich)下一篇也是他?

?

以前Alice(Owner)想將自己部分Paypal中的資產(chǎn)給Bob(Delegatee),需要將賬戶密碼交給對方,這很不安全。(我們不考慮錢能直接通過轉(zhuǎn)賬,因為有的資產(chǎn)并不像轉(zhuǎn)賬那樣可以簡單實現(xiàn),那樣單純是金額的加減。我們討論的是一大類授權(quán)的問題)。

那么現(xiàn)在用上一個憑證和對憑證以及用戶身份信息驗證的一個服務(wù)器Brokered System。Brokered System能夠根據(jù)Alice具體將多少資產(chǎn)以怎么樣的形式分享給Bob這件事生成憑證,并且憑證一方面分享給Bob,另一方面儲存在服務(wù)器中,Bob登錄服務(wù)器后,證明自己是Bob,并且把憑證給服務(wù)器一看,服務(wù)器覺得OK并且Bob想用掉這筆資產(chǎn)的時候,服務(wù)器就讓Paypal去完成比如支付Money的操作,可以看到驗證的事情被放到了Brokered System服務(wù)器上面去做,Paypal直接和Brokered System合作,而不再和用戶直接接觸。帶來的好處是什么呢?是Paypal和Bob、Alice之前不需要互相信任,再無瓜葛,只需要信任Brokered System即可。這里可能看起來是一個妖異的設(shè)定:我的理解是因為本來Paypal沒有這個功能,Brokered System作為第三方模塊來實現(xiàn)這個功能,想盡辦法完成這種類似可信紅娘的牽線工作。

那么我們似乎還沒說到SGX。我們可以看到這時Brokered System中憑證的存儲、驗證、使用非常敏感,同時Alice和Bob的個人信息也需要被嚴(yán)格保護,作者就想到使用SGX來對這個服務(wù)器來進行保護。所以這里應(yīng)該來說時SGX在服務(wù)器端的簡單嘗試,更多的是授權(quán)的內(nèi)容,但是授權(quán)的方式已經(jīng)就有類似的(Kerberos系統(tǒng)也是授予ticket,和使用ticket的模式),所以它討論的亮點還是SGX的應(yīng)用,難度可能在于SGX的開發(fā)并且做成一個實際產(chǎn)品。

這篇論文通過視頻看的,可能理解不到位,有錯誤歡迎反饋。

?BITE(SEC’19)?Sini?a Mateti? (ETH Zurich)?

?

區(qū)塊鏈中,我們知道手機等資源有限設(shè)備是不可能承載一個區(qū)塊鏈的完全節(jié)點,所以手機上一般都是輕節(jié)點,并且輕節(jié)點是根據(jù)需求向完全節(jié)點申請當(dāng)前涉及的區(qū)塊等信息。但是Light Node向Full Node請求地址對應(yīng)內(nèi)容時,Full Node勢必要知道你所請求的啥,導(dǎo)致信息泄露。之前有個Bloom Filter試圖通過一個類似哈希表(或者是個承載多個對等數(shù)據(jù)單元的數(shù)據(jù)結(jié)構(gòu))并且模糊化訪問這個數(shù)據(jù)結(jié)構(gòu)的過程來解決這個信息泄露的問題,但是作者說共享Bloom Filter依然會導(dǎo)致信息泄露(Bloom Filter這一塊我只是大概聽說過,不了解)。

那么有了SGX這個東西,作者就利用SGX內(nèi)部部署Full Node端用來接收Address請求的模塊,這樣部署在服務(wù)器上也不用擔(dān)心Ring0攻擊者的迫害了。所以本質(zhì)也是SGX對原有產(chǎn)品的改進。此外有一些細節(jié)是說:通過Scan Window或者ORAM來返回結(jié)果值,為了保證SGX執(zhí)行中的側(cè)信道問題。ORAM已經(jīng)有挺多論文用來防止訪存?zhèn)刃诺绬栴},后面也會提到(【寫到后面時把名字貼上來】)。現(xiàn)實中,走路時拐七繞八的方式讓陌生人不知道我們具體要去哪里。你可能說,陌生人會看到我們最終進入哪個建筑,那么如果說有那么一個傳送門,進的看起來是A建筑,實際傳送到了B建筑,(這是通過查表轉(zhuǎn)換實現(xiàn)),那么陌生人就只能犯糊涂了。這里需要知道的就是說ORAM可以通過類似上述方式讓攻擊者無法得知受害者的訪存情況。

(可以看到目前SGX應(yīng)用在某些知名產(chǎn)品上,對原有模塊的替換或改進,會受到大家很大的關(guān)注。)

EnclaveDB(S&P18)微軟和倫敦帝國學(xué)院合作的

?

數(shù)據(jù)庫DB可以說是大部分產(chǎn)品都要依賴的東西,計算機世界基礎(chǔ)中的基礎(chǔ)。但是現(xiàn)在服務(wù)器里面大家都考慮Ring0攻擊者的威脅了,那么DB里面的資料可不能讓Ring0攻擊者偷取,因為人們對于敏感信息的保密要求是越來越高。以前有通過加密方式的DB,加密的方式效率低,這個可想而知,加密算法固有的缺陷。

那么服務(wù)器有了SGX,我們就干脆將部分敏感的數(shù)據(jù)庫放入Enclave,通過SGX而不是加密方式來保證安全,同時通過完善的日志記錄模式和事務(wù)備份恢復(fù)來保證完整性。上圖藍色是可信的部分,客戶端默認是可信的,一般用戶自己不會坑自己,這里不考慮自己電腦被攻擊了,只考慮服務(wù)端有Ring0攻擊。第一步,我們在右上角的東西比如可信DB、預(yù)編譯的Stored Procs會被通過簽名加密等安全措施,被部署到服務(wù)器端的Enclave。第二步,其他客戶端申請查詢請求時候,通過自己的Client庫通過左邊Host Process間接和Enclave搭上勾并進行真正的查詢操作。

這一篇從視頻上來看,它告訴我們SGX應(yīng)用要考慮部署和使用兩件事。

小結(jié)

上圖是CCS’17上一位大佬講的SGX服務(wù)端應(yīng)用的論文列表(部分文章其實也可以歸于SGX Shield Framework類,后面單獨拎出來),和我隨機看的那幾篇有交集。但是我有一個明確的感受就是,想要做SGX應(yīng)用,得有原來那種產(chǎn)品的很清楚的了解,我光看視頻沒法深入理解SGX應(yīng)用的真正意義。以后若有需求會去看論文或者相關(guān)的代碼框架。

不過總的來說,SGX應(yīng)用是真正體現(xiàn)SGX價值的地方,現(xiàn)階段的SGX應(yīng)用可能思路上簡單(實現(xiàn)可能也復(fù)雜),但是這將代表SGX這項技術(shù)是有意義的。并且服務(wù)端的SGX應(yīng)用你需要考慮SGX應(yīng)用部署和使用兩件事。

另外值得一題的是,我們多多少少可以看出SGX是同態(tài)加密的一個好的替換品。同態(tài)加密是通過密碼學(xué)的方法讓你無法感知(秘密+秘密=秘密)這個過程,而SGX就是在保險箱里面完成(秘密明文+秘密明文=秘密明文)的工作,明文算起來就很快。

第二種,應(yīng)用于客戶端

這一塊的內(nèi)容相對少一些,目前大家所能想到的就是比如游戲開發(fā)商在下放游戲許可證等版權(quán)信息的時候,那么就用SGX內(nèi)部來保存版權(quán)信息,你想玩游戲,得通過SGX內(nèi)部版權(quán)信息的驗證。但是我覺得這一點上,可能對于很強的逆向工程高手來說,可能無意義,因為逆向工程逆向的是代碼,SGX內(nèi)部的敏感數(shù)據(jù)顯得不重要了。除非游戲里面的部分關(guān)鍵代碼也在SGX里面(個人猜測,正常情況下,Enclave代碼是公開可見的,SGX保護的是代碼完整性,SGX保護的機密性是隱私數(shù)據(jù)的機密性,不過也有論文是能夠?qū)nclave代碼秘密地加載到SGX中),那么逆向工程會變得極其困難。

這張圖大概展示了客戶端SGX應(yīng)用的大概樣子,主要我個人對OTP不懂,所以不太好闡述,但是我們可以看到這個框架就是客戶端SGX和開發(fā)商之間有安全授權(quán)、配置的過程,那么Enclave可以看作開發(fā)商的飛地了(可以聯(lián)想領(lǐng)事館這個概念)

第三點,SGX應(yīng)用于分布式客戶端

這類的論文和工作也不多,主要可能大家想法有限。我自己有一個想法就是分布式SGX客戶端下,我們可以將服務(wù)端的某些貼近客戶端的部分功能(或者全部功能)給移到客戶端來降低服務(wù)端的攻擊范圍和單點失效問題。有一點像客戶端冗余來彌補服務(wù)端單點的種種問題。

分布式SGX可能的應(yīng)用模式

有了SGX,我們可以將中心化任務(wù)做成分布式,而不用擔(dān)心分布式客戶端上的用戶會故意不按照預(yù)期流程執(zhí)行,因為SGX已經(jīng)不能被Ring0攻擊了。這有點像我有個公司,我把我們公司的會計、法務(wù)都給派到了顧客家里,而且這會計和法務(wù)是絕對忠誠的。

以前也有分布式相關(guān)的工作,但是方式都通過加密、冗余備份來實現(xiàn)可靠性。而我們通過SGX先天提供可信執(zhí)行環(huán)境,那么就不再需要加密、冗余備份的操作,而且將流程化簡,功能性和擴展性也可以很好的提升。因此又體現(xiàn)了:SGX是加密方案的高效替代品

中心化任務(wù)分布式程度理論上是可以調(diào)節(jié)的,就是具體有多少模塊貼近客戶端。借此我們可以可以根據(jù)分布式SGX的計算資源和存儲資源的多少來進行一個具體的中心化任務(wù)分布式程度的界定。

其實上述這種抗Ring0攻擊的Enclave其實不單單只有SGX可以做到,還有其他SGX的小伙伴也能。有一篇【SecTEE】講的是Trust Zone下提供Enclave的概念,它里面說只要提供隔離機制的CPU均有望實現(xiàn)Enclave。

上面大概講了下SGX分布式應(yīng)用的一種可能模式,那么具體的可能可以用于分布式存儲、分布式計算、分布式授權(quán)。

有一個功能這里也值得一提,【VC3、SGX-Shield】能夠做到Enclave代碼隱蔽載入Enclave內(nèi)存(通過遠程載入具體代碼),或者我想有可能本地Enclave代碼加殼也能夠做到Enclave代碼保密的效果【目前可能尚未實現(xiàn)】(但是一般來說代碼加殼可以抗靜態(tài)分析,能否抗動態(tài)分析尚不清楚,而且可能有賴于具體實現(xiàn))。對此我想利用的點是說,可以將Enclave代碼對分布式客戶端隱藏,就是悄悄地帶入分布式客戶端的SGX內(nèi),避免不必要的Enclave代碼公開。

現(xiàn)在,我們再考慮分布式客戶端會有Enclave被開、關(guān)、重啟的情況,為了保證Enclave內(nèi)數(shù)據(jù)在不同時間段依然一致且有效,可以通過密封操作來保證狀態(tài)連續(xù)性。目前密封操作有回滾攻擊的危險。對此,密封操作的抗回滾方案有【SGX Monotone Counter、ROTE……】。

單獨考慮分布式授權(quán)案例,將授權(quán)和驗證的功能(相當(dāng)于公司工作人員)派到客戶端。為了防止分布式SGX某個節(jié)點被攻陷然后對全局產(chǎn)生危害,那就依然可以采用中心化+分布式相結(jié)合的方案,也就是說有多少功能下放到分布式SGX的程度進行考量(比如分布式SGX節(jié)點只被賦予有限的權(quán)限,但也能很大程度滿足正常驗證需求,使得攻擊者攻破分布式SGX節(jié)所能獲得的權(quán)力有限)。

最后,審計的需求、日志的維護可以參考【EnclaveDB、ROTE】的做法。此外,日志管理細節(jié)上可以做冗余備份,然后借鑒Counter【SGX Monotone Counter、ROTE……】實現(xiàn)一致性維護。

SGX應(yīng)用的總結(jié)

現(xiàn)在SGX漸漸應(yīng)用于傳統(tǒng)模塊的替換,然后提下SGX價值,目前的工作應(yīng)該說不多。不過也恰恰體現(xiàn)了SGX的潛力,然后未來還有很多SGX的工作可以做。

(其實SGX應(yīng)用也包括,SGX保護框架,SGX軟件層改進,單獨拎出來)

SGX保護框架(SGX Shield Framework)

Haven(OSDI14)?微軟

SGX已經(jīng)硬件實現(xiàn)了,但是,很多老的APP并沒有用上SGX。并且SGX的代碼開發(fā)和原來不太一樣了,得把代碼劃分成Enclave內(nèi)外兩個部分。那么意味著老的APP很難用上SGX了,因為不是所有人都愿意花力氣把原來的APP移到SGX上。那么怎么把老的APP放到SGX上呢?微軟提供了Haven方案。

?

?

Haven架構(gòu)如圖:Enclave(APP->LibOS->Shield模塊)->uRTS->OS的棧結(jié)構(gòu)(LibOS在這里的作用相當(dāng)于自己租的臥室內(nèi)搭建一個小廚房等設(shè)施,盡可能的不與外界打交道,盡可能不用外面的大廚房)。這樣子,整個APP都是Enclave內(nèi)部的,APP和LibOS打交道就行,LibOS或者直接滿足APP的需求,或者向外讓Host OS完成具體需求。總之APP就不用改代碼了。

如上所說,Enclave仍然會有小部分的比如系統(tǒng)調(diào)用需要與外界接觸(好比小廚房的電、氣還是得走總的房子的電、氣)。此外,SGX還有一些細節(jié)限制:EPC大小有限(比如256M),頁錯誤等異常仍然由外界OS來處理,還有很多硬件指令Enclave內(nèi)不能調(diào)用……。

上述這種有Enclave與外界接觸的情況,就有被攻擊的風(fēng)險,只要SGX與外部有啥共享的機制,就可能被攻擊,SGX側(cè)信道很多就是基于共享機制(后面會講)。

LibOS和庫直接塞入SGX會導(dǎo)致TCB過大的問題,小結(jié)處會討論Haven和他的小伙伴們,進行一個橫向?qū)Ρ取?/p>

SCONE(OSDI16)

?

SCONE的初衷應(yīng)該就是想讓容器能夠由SGX進行安全加固。同時最好就是容器可以直接在Enclave中跑,不需要修改,因此它提出如上圖架構(gòu)。

它發(fā)現(xiàn)其實并不需要整個LibOS都移進來也能完成對容器的支撐,因此將LibOS概念移除,移除了包含網(wǎng)絡(luò)和文件Shield層、多線程(不支持多進程)、MUSL等。

另外它還實現(xiàn)了一套異步系統(tǒng)調(diào)用的機制(可能是處于安全考慮?目前尚不清楚)。

可以看到SCONE的架構(gòu)和Haven就有一些區(qū)別了,SCONE的TCB相對Haven更小(Haven的LibOS代碼、庫的代碼量很大),同時效率也得到了提升。不過SCONE架構(gòu)中,Enclave與外界的接口更多了,因為SCONE里面刪除了很多東西,意味著這些東西都得找HostOS提供。

Ryoan(OSDI16)

作者認為SGX原來的機制主要是為了保護Enclave免受Enclave外部的攻擊,但是Enclave本身可能有意或無意的將Enclave內(nèi)的信息泄露給Enclave外部(偏主動式的)。于是作者在Enclave內(nèi)放置一個沙箱來執(zhí)行代碼(比如與外界的輸入輸出(包括內(nèi)存拷貝等)進行加密或管控、系統(tǒng)調(diào)用的管控、檢查點),在SGX基礎(chǔ)上增強安全性,并且還能防御部分軟件側(cè)信道。

Panoply(NDSS17)

?

為了讓傳統(tǒng)程序能夠不改代碼的移植到Enclave中,Haven、Graphene-SGX中將LibOS移入Enclave,并仿真地提供系統(tǒng)調(diào)用、線程、事件處理、Forking等功能(最終會轉(zhuǎn)換到Host OS的系統(tǒng)調(diào)用),但是也會導(dǎo)致TCB太大(主要是庫比較大),效率低等。SCONE、Ryoan使用容器、沙箱來向上支撐傳統(tǒng)程序,但是如Fork/Exec等功能無法仿真(因為本身并不是像Haven那樣整個LibOS都搬進SGX),這種選擇一般來說TCB很小(主要是庫不在Enclave內(nèi)),效率個人猜測會高于Haven這種。

Panoply另辟蹊徑,或者說上述兩種綜合一下,將Libssl等庫(Haven中將其放在Enclave中)專門用一個Enclave來執(zhí)行,目的是為了實現(xiàn)復(fù)用(不需要每個Enclave保留一份,降低TCB),然后想要調(diào)庫,就向庫Enclave發(fā)出申請,庫Enclave返回結(jié)果。可以放心的是Enclave間的調(diào)用(通信)走的是加密信道,同時彼此實現(xiàn)相互認證。

另一個點和SCONE還是有點像,就是Enclave留一個Shim來執(zhí)行系統(tǒng)調(diào)用來實現(xiàn)各種豐富的功能,具體實現(xiàn)放到不可信的Host OS中。

Panoply這種庫Enclave的想法一定程度實現(xiàn)代碼復(fù)用,降低TCB,不過應(yīng)該會導(dǎo)致面向HostOS的接口變多,Haven中Enclave與HostOS的接口只有20+。

總之,Haven、Panoply都能幫助傳統(tǒng)程序不改代碼移植,間接提供系統(tǒng)調(diào)用、線程等功能,區(qū)別在于Haven通過LibOS實現(xiàn)了很多OS功能,Panoply留了個接口給Enclave,讓有些功能由HostOS來做。Panoply庫Enclave的概念挺新穎,用來實現(xiàn)代碼復(fù)用。

?

Panoply的庫Enclave思想其實和RPC有點接近。

Graphene-SGX(ATC17)

?

個人覺得這個和Haven類似,或者說Haven架構(gòu)的Linux下實現(xiàn),Haven是Win下的實現(xiàn)。Haven應(yīng)該是20個固定系統(tǒng)調(diào)用,Graphene-SGX是28個固定系統(tǒng)調(diào)用(18個系統(tǒng)調(diào)用會有檢查)。除了向上支持Linux傳統(tǒng)軟件,后來還能夠支持容器(這一點可能挺有意思),未來將支持EDMM(Enclave Dynamic Memory Management)。

EDMM這是個SGX v2新增的機制,背后由新增的硬件指令實現(xiàn),目的是說SGX v1時候,我一開始聲明Enclave多大,那加載起來的Enclave就那么大,大小不能再改了,SGX v2增加EDMM,讓Enclave可以建立以后,也就是運行的時候動態(tài)申請新的EPC頁,滿足Enclave大小的變化。

SGX軟件層改進

Eleos(EuroSys17)

文章首先講了SGX帶來的開銷。第一點,SGX帶來的直接開銷:進出Enclave要3300/3800周期,而系統(tǒng)調(diào)用也就250周期;LLC Miss開銷是非Miss下的5.6~9.5倍;EPC頁換入換出硬盤Swap區(qū)需要40,000周期。第二點,SGX帶來的間接開銷:由于安全期間進出Enclave會刷新TLB(LLC我忘了是否刷新,L1在Intel的微碼補丁之前是不刷新,Foreshadow的出現(xiàn)導(dǎo)致Intel也做L1的刷新了。),LLC污染會造成2倍延遲、TLB污染可能造成6倍延遲。

上述實驗結(jié)果主要說明了進出Enclave開銷大。無論是正常的Enclave退出還是頁錯誤之類的問題導(dǎo)致Enclave退出(AEX)都會帶來很大的延遲,因此通過非Enclave退出的方式——RPC,來替換Enclave退出的功能;而關(guān)于頁錯誤則通過一個安全的用戶空間頁表機制SUVM(見下圖,大概是說軟件實現(xiàn)了虛實地址翻譯工作,Enclave頁表也放在Enclave內(nèi)部,原來都是統(tǒng)一用的內(nèi)核頁表,如果發(fā)現(xiàn)有頁被換出到普通內(nèi)存,那么就Enclave內(nèi)部仿真一個錯誤處理機制,將換出到普通內(nèi)存的EPC頁再放回EPC中,并完成完整性度量。也就是說Enclave內(nèi)部做了一個軟件的用戶態(tài)頁表機制,將硬件頁表機制架空。)來避免Enclave退出。相比與改進之前的SGX,Eleos RPC增加23%帶寬,Eleos RPC+SUVM增加50%帶寬,可喜可賀。

?

這里讓我聯(lián)想到了SGX的Switchless模式,Switchless模式大概是說我先專門弄一個線程出來讓他們直接跑在Enclave環(huán)境,然后把他們稱為ECALL工人線程,工人線程自然是用來干活的。現(xiàn)在我們運行APP,然后APP調(diào)用一個ECALL函數(shù),那么ECALL任務(wù)放到任務(wù)池,并通知(通過發(fā)送Signal)之前一直空轉(zhuǎn)的ECALL工人起床干活了,然后ECALL工人將ECALL任務(wù)跑起來。

CoSMIX(ATC19)

以前,SQLite的fast_read_db之類的函數(shù)依賴內(nèi)存映射文件(mmap),這會通過調(diào)用OS錯誤句柄將內(nèi)容從硬盤帶到內(nèi)存,但是OS不可信,因此OS的錯誤處理也不可信。如果使用請求頁面指令,這個指令的功能和流程定死了,不靈活。如果使用用戶自定義處理句柄,由于會通過OS來調(diào)用Enclave內(nèi)部用戶自定義句柄,流程很長,效率低(而且個人認為給了OS攻擊的可能性)。

CoSMIX在Enclave內(nèi)部仿真了頁表機制來完成虛實地址轉(zhuǎn)換,目標(biāo)虛擬地址轉(zhuǎn)變成不可信的物理地址,然后將內(nèi)容取回EPC,該頁的數(shù)據(jù)同時會保留到緩存(Foreshadow中說,可以利用這個緩存造成攻擊)中,可以加快訪問“內(nèi)存”(怎么聽著很像SUVM)。

總的感覺是將頁表機制移入Enclave,通過LibOS來實現(xiàn),并完成加密內(nèi)存的解密等操作。會想起Sectum將頁表移入Enclave的做法。

這也體現(xiàn)了有些SGX漏洞就是由于Enclave部分功能需要通過OS來完成(比如頁表機制)產(chǎn)生泄露。通過LibOS實現(xiàn)部分機制可以緩解此類漏洞。

Rust-SGX SDK(CCS19)百度

Rust語言號稱是一個能夠?qū)崿F(xiàn)內(nèi)存安全(不會出現(xiàn)指針越界之類由于指針這個東西導(dǎo)致的問題)的語言,SGX又是個能抵抗特權(quán)攻擊CPU特性,兩者優(yōu)勢互補,就是Rust-SGX了。不過當(dāng)然不只是這樣,除了能夠用上Rust語言的內(nèi)存安全性和SGX提供的安全內(nèi)存,Rust-SGX還讓開發(fā)者多了一個使用Rust語言的機會。

?

看上圖,Rust-SGX下,Enclave可以使用Rust語言書寫,然后會調(diào)用Rust庫來使用SGX,Rust庫通過Rust-to-C FFI調(diào)用C語言的SGX SDK。

Rust-SGX有一個近親,Fortanix的Rust EDP SDK方案,它將SGX SDK也用Rust重寫,這可以將Rust的內(nèi)存安全特性實現(xiàn)地更充分。但是百度的Rust-SGX SDK能夠避免SGX SDK的上游更新導(dǎo)致后續(xù)又要用Rust重寫,同時C語言的SGX SDK效率比Rust更高(安全性降低)。

百度的Rust-SGX能夠保證除SGX SDK以外的其他部件都是安全的,不會引入新的漏洞,且經(jīng)過形式化驗證。

Fortanix Rust EDP SDK

SGX攻防

SGX攻防是SGX論文中非常多的一大塊,不過目前的我沒有太多時間來寫這塊。先留坑。

Intel SGX攻防工作是為了讓Intel SGX更加完善。目前很多的SGX攻防工作的思想是從CPU攻防、其他TEE攻防和軟件攻防借鑒的。如從Intel SGX架構(gòu)、微架構(gòu)、軟件棧攻擊。

Intel SGX軟件層攻防。對SGX SDK等軟件層發(fā)動攻擊,對軟件層攻擊進行防御。代表工作有Iago attacks(ASPLOS’13)【惡意構(gòu)造系統(tǒng)調(diào)用返回值對Enclave攻擊】、A Tale of Two Worlds(CCS’19)【首先對SGX SDK中ABI、API攻擊進行系統(tǒng)調(diào)研,然后實現(xiàn)了新型ABI、API攻擊】、COIN Attacks(ASPLOS’20)【首先分析了軟件層SGX常見攻擊模型,然后根據(jù)攻擊模型實現(xiàn)了漏洞自動挖掘框架】……

微架構(gòu)數(shù)據(jù)采樣(Micro-architectural Data Sampling)指利用推測執(zhí)行導(dǎo)致微架構(gòu)信息泄露給攻擊者。SGX下代表的MDS工作有Foreshadow(SEC’18)【SGX版Meltdown,觸發(fā)異常提供瞬態(tài)執(zhí)行窗口,使信息泄漏到緩存被攻擊者竊取。與Meltdown不同,Foreshadow需額外構(gòu)造異常繞過SGX中止頁面語義并提供瞬態(tài)執(zhí)行窗口】、RIDL(S&P’19)【攻擊者竊取泄漏到微架構(gòu)LFB的信息,SGX下也有該問題。相較L1攻擊,LFB攻擊只要更少的地址位匹配】、Strong and efficient...(SEC’17)【Intel TSX事務(wù)入口加載冗余緩存,增加緩存?zhèn)刃诺涝肼暋俊?/p>

超線程攻防。超線程下利用兄弟核的微架構(gòu)信息泄露進行攻擊,及相關(guān)防御。Racing in Hyperspace(SP’18)【受害者通過度量它的兩個線程間通訊時長確定兩個線程是否在兄弟核上,避免攻擊者線程和受害者線程處于兄弟核上】、Varys(ATC’18)……

內(nèi)存安全攻防。SGX下,以內(nèi)存安全問題為主的攻防。代表工作有SGX-Shield(NDSS’17)【Enclave內(nèi)部署加載器將代碼加密帶入Enclave,并在Enclave內(nèi)實現(xiàn)ASLR】、SGXBOUNDS(EuroSys’17)【利用EPC的地址Bits中空余Bits,對緩沖區(qū)Load/Store邊界進行檢查】、Dark-ROP(SEC’17)【利用側(cè)信道等手段定位Gadgets,通過Gadgets鏈實現(xiàn)ROP攻擊。二進制代碼復(fù)用攻擊】、The Guard’s Dilemma(SEC’18)【源碼代碼復(fù)用攻擊,利用程序原有的內(nèi)存漏洞,實現(xiàn)控制流、棧、寄存器的劫持】……

未初始化的Padding Bits:利用傳參數(shù)據(jù)結(jié)構(gòu)中的Padding?Bits實現(xiàn)數(shù)據(jù)偷偷傳輸。Leaking Uninitialized...(arXiv’17)【利用E/OCALL參數(shù)的Padding Bits將數(shù)據(jù)傳入/出Enclave】……

執(zhí)行流痕跡——頁表痕跡。通過頁地址泄露信息反推執(zhí)行流。Controlled-channel attacks(S&P’15)【頁錯誤泄露頁地址,利用頁地址鏈反推控制流】、SGX-PTE(SEC’17)【緩存?zhèn)刃诺婪赐票患虞d進緩存的PTE,進一步反推頁地址鏈及控制流】、T-SGX(NDSS’17)【利用Intel TSX的特性,使攻擊者只能獲取Abort Handler的頁地址信息,避免真正的控制流泄露,Abort Handler還能記錄AEX頻率】……

執(zhí)行流痕跡——影子分支。利用分支預(yù)測器的共享進行側(cè)信道信息泄露。代表工作有Branch Shadowing(SEC’17)【退出Enclave時不刷新分支預(yù)測器,SGX內(nèi)外共享分支預(yù)測器,攻擊者通過(地址碰撞的)影子分支反推受害者分支選擇,反推SGX內(nèi)控制流】、BranchScope(ASPLOS’18)……

執(zhí)行流痕跡——指令時延。Nemesis(CCS’18)【利用APIC時間中斷,單步中斷Enclave代碼并計算代碼執(zhí)行時長,通過時延序列反推控制流】……

執(zhí)行流痕跡——其他防護。ZeroTrace(NDSS'18)【本文針對ORAM低效率問題使用SGX進行性能提升】、OBFUSCURO(NDSS’19)【將代碼、數(shù)據(jù)訪問模式固定避免控制流痕跡泄露】……

Intel SGX發(fā)展趨勢

云計算是一種基于互聯(lián)網(wǎng)的計算方式,通過這種方式,共享的軟硬件資源和信息可以按需求提供給計算機各種終端和其他設(shè)備,使用服務(wù)商提供的電腦基建作計算和資源。【維基百科】

云計算非常契合各個實體對計算資源的定制需求,同時是一種典型的遠程計算場景。Intel SGX是一種良好的遠程計算安全方案,非常有應(yīng)用前景。不過SGX開發(fā)細節(jié)有別于傳統(tǒng)開發(fā),因此工程實現(xiàn)存在阻力。目前已有部分SGX應(yīng)用誕生,體現(xiàn)了SGX的價值,未來SGX應(yīng)用將更加豐富。

Intel SGX目前很多安全細節(jié)仍處于討論之中,隨著SGX應(yīng)用豐富,SGX的安全性將會受到更多的討論。

此外,其他芯片廠商未來可能也將學(xué)習(xí)Intel SGX來解決遠程計算安全問題,以滿足遠程計算安全需求。

SGX軟硬件棧

基本介紹

背景知識

1. Intel SGX

Intel SGX狹義上是指一組CPU指令,該組指令增強應(yīng)用程序代碼和數(shù)據(jù)的安全性,為它們提供更強的保護以防泄漏或修改。開發(fā)人員可將敏感信息放入Enclave中,Enclave是內(nèi)存中具有更強安全保護性的執(zhí)行區(qū)域。

Intel SGX廣義上是指以SGX指令為基礎(chǔ)所構(gòu)建的包括Intel CPU等硬件、CPU提供的硬件指令、驅(qū)動、Platform Software(用于構(gòu)建不可信運行時環(huán)境uRTS)、SDK(用于構(gòu)建可信運行時環(huán)境tRTS)等在內(nèi)的一種新的安全機制,既Intel SGX軟硬件棧。

SGX平臺需要Intel 6代及以上處理器,并且BIOS支持并開啟了SGX選項。

2. 常用名詞

Intel ?SGX:Intel Software Guard Extensions的簡稱。

Enclave:下述條目針對Enclave不同的角度來表述,實際表述中不太加以區(qū)分,并且更側(cè)重于指Enclave實例。

Enclave內(nèi)存:Enclave是內(nèi)存中具有更強安全保護性的執(zhí)行區(qū)域。

Encalve環(huán)境:通過Enclave內(nèi)存及硬件保護機制、可信運行時共同來保護敏感代碼數(shù)據(jù)的環(huán)境,或者說安全世界。

Enclave代碼:希望放在Enclave中執(zhí)行的敏感代碼數(shù)據(jù)。

Enclave文件:保存著Enclave代碼數(shù)據(jù)的鏡像文件。與實例的區(qū)別好比程序代碼與進程的區(qū)別,一個靜態(tài),一個動態(tài)。

Enclave實例:指從Enclave文件具體執(zhí)行起來的進程。

EPC:Enclave Page Cache。Enclave的物理內(nèi)存是一種抽象的表示,Enclave物理內(nèi)存會最終落實到一個個具體的物理頁,這些頁就是來自于EPC。也就是說EPC是一塊加密的處于系統(tǒng)保留內(nèi)存的物理內(nèi)存區(qū)域,用來存放Enclave的頁和SGX數(shù)據(jù)結(jié)構(gòu)。

EP:Enclave Page。EPC中一個個具體的頁。為了方便讀者理解,也可稱為EPC頁

SGX世界觀:SGX將軟硬件資源等劃分成安全世界和不安全世界

安全世界:包括可信運行時和用戶的Enclave實例,安全世界中Enclave實例會利用可信運行時提供的API完成敏感功能等。而每個開發(fā)者進程都有自己的獨立的Enclave環(huán)境,不同Enclave的安全世界相互隔離。

不安全世界:包括不可信運行時和用戶的非敏感代碼以及具有內(nèi)核權(quán)限的驅(qū)動。

uRTS:Untrusted Runtime Service,不可信運行時環(huán)境,不安全世界、普通世界的一部分。

tRTS:Trusted Runtime Service,可信運行時環(huán)境,安全世界、Enclave環(huán)境的一部分。

AE:Architectural Enclave。由SGX平臺提供完成特定功能的特殊的Enclave,包括:Launch Enclave,用于決定在當(dāng)前SGX平臺上運行哪些其他Enclave(主要指用戶的Enclave實例);Provisioning Enclave,提供長期平臺證明密鑰;Quoting Enclave,使用非對稱平臺證明密鑰,用于為遠程使用者簽署本地證明報告;Platform Service Enclave,平臺服務(wù)Enclave,用于提供如可信的時間等安全功能。

OCALL:從安全世界進入不安全世界所用到的橋函數(shù)。

ECALL:從不安全世界進入安全世界所用到的橋函數(shù)。

ISV:Individual Software Vendor個體軟件廠商

SgxEdger8r:SGX Edge Routine,主要用于在編譯過程中對.edl文件中的ecall和ocall重新封裝編寫,即將用戶編寫的e/ocall改寫成實際執(zhí)行的e/ocall

3. 常用結(jié)構(gòu)體

SECS:SGX Enclave Control Structure。每個Enclave實例都具有一個該結(jié)構(gòu)體,用于保存關(guān)于該實例的信息,如Enclave的線性基址(對于整個程序而言)和大小。保存在EPC中該Enclave的內(nèi)存空間,只能由CPU訪問。

TCS:Thread Control Structure。每個Enclave實例可以擁有很多個具體執(zhí)行Enclave函數(shù)的Worker Thread,每個線程都對應(yīng)一個TCS,用于描述這個線程的信息,如線程執(zhí)行flag、SSA的位置、當(dāng)前使用的SSA(若干個SSA組成一個棧)。存儲在EPC中,只能由處理器訪問。

SIGSTRUCT:ENCLAVE SIGNATURE STRUCTURE。每個Enclave文件具有一個SIGSTRUCT來證明它是被某個SGX平臺簽署的。(見后續(xù)“EINIT指令過程”章節(jié))

EINITTOKEN:EINIT TOKEN STRUCTURE。從Enclave文件創(chuàng)建Enclave實例時,需要向AE申請一個令牌,后續(xù)EINIT指令使用EINITTOKEN結(jié)構(gòu)來檢查是否允許執(zhí)行Enclave。(見后續(xù)“EINIT指令過程”章節(jié))

EPCM:ENCLAVE PAGE CACHE MAP。被硬件用來跟蹤EPC內(nèi)容,每一個Entry對應(yīng)一個EP。軟件不可訪問。每個Entry會說明EPC頁的線性地址等。

SGX的可信保障及優(yōu)點

  • Enclave這塊特殊內(nèi)存采用加密技術(shù),保障內(nèi)存代碼、數(shù)據(jù)的機密性和完整性。
  • 任何對Enclave進行的訪問都需要經(jīng)過嚴(yán)格地訪問控制。
  • 可信計算基礎(chǔ)(TCB)縮小到CPU的SGX Enclave這一硬件保障設(shè)施,而不再要求操作系統(tǒng)和特權(quán)程序是可信的。
  • 支持虛擬化技術(shù)和容器技術(shù)。
  • SGX不足

  • Enclave處于用戶態(tài),如果Enclave中的代碼數(shù)據(jù)依賴于Enclave外部數(shù)據(jù),則存在安全隱患,需要Enclave代碼對傳入的外部數(shù)據(jù)檢查。
  • SGX 本身無法抵御側(cè)信道攻擊,因為不是為側(cè)信道防御而設(shè)計的,但是可以在程序開發(fā)過程中進行設(shè)計防御。
  • Enclave 需要對原程序進行改造,通過特殊的.edl文件聲明將敏感代碼放入Enclave中執(zhí)行,將不敏感代碼放在普通內(nèi)存中執(zhí)行。
  • Enclave所支持的特殊加密內(nèi)存的大小很小,因此開發(fā)者應(yīng)該只將至關(guān)重要的敏感的代碼數(shù)據(jù)放入其中。
  • SGX會產(chǎn)生一定程度的系統(tǒng)開銷。
  • SGX與TrustZone區(qū)別

    TrustZone將系統(tǒng)劃分為安全世界和普通世界,實現(xiàn)了執(zhí)行環(huán)境以及存儲、網(wǎng)絡(luò)和屏幕等設(shè)備的安全隔離,敏感代碼放入安全世界執(zhí)行。TrustZone里面程序是直面硬件資源的,并且TrustZone內(nèi)部的多個程序間并沒有安全隔離,直到有相關(guān)工作在TrustZone里面安置了一個安全內(nèi)核,如T6安全微內(nèi)核(上海瓶缽主導(dǎo)的工作,在Trustzone里實現(xiàn)了安全操作系統(tǒng)的功能,實現(xiàn)了敏感應(yīng)用之間的隔離,還可以讓開發(fā)者更好地使用物理硬件,安全微內(nèi)核只有六千行代碼,非常輕量級,同時經(jīng)過安全審計)。【SecTEE】等工作也試圖在TrustZone內(nèi)部提供Enclave的概念(包括了SGX所提供的可信度量、加密、訪問控制、密封、本地認證、遠程認證中的部分功能),之前也聽到有相關(guān)工作在ARM芯片的普通世界構(gòu)建Enclave,而不是在TrustZone內(nèi)部,似乎硬件實現(xiàn)機制有一些區(qū)別,忘記了。

    SGX中,對于每一個進程,可以創(chuàng)建多個類似于“安全世界”的Enclave,并且不同進程之間的Enclave是互相硬件隔離的——通過MEE使用獨立的密鑰加密Enclave內(nèi)存進行保障。

    SGX內(nèi)存布局及訪問控制

    這一塊很多資料來源于:

    王鵑, 樊成陽, 程越強, 等. SGX 技術(shù)的分析和研究[J]. Journal of Software, 2018, 9: 2778-2798.

    1. SGX結(jié)構(gòu)簡介

    每個進程可以創(chuàng)建若干個Enclave實例(不過比較常見的情況是一個實例),Enclave執(zhí)行程序的敏感代碼,保護敏感數(shù)據(jù)。Enclave之間、Enclave與普通世界之間都存在訪問控制(后續(xù)“SGX訪問控制”章節(jié)會講述)。基本結(jié)構(gòu)如圖4所示(詳細的軟件棧構(gòu)造會在后續(xù)“SGX軟件棧”章節(jié)中描述)。

    • 硬件暴露的功能。硬件向外暴露Enclave Page Cache(EPC是一塊加密的處于系統(tǒng)保留內(nèi)存的物理內(nèi)存區(qū)域,用來存放 Enclave的頁和SGX數(shù)據(jù)結(jié)構(gòu),也就是說Enclave的物理內(nèi)存會最終落實到EPC)和EPCM(用于管理EPC頁的訪問控制,EPCM只能由硬件訪問)及硬件指令。
    • 內(nèi)核權(quán)限環(huán)境(既驅(qū)動)的功能。內(nèi)核權(quán)限環(huán)境有一個管理分配給Enclave的EPC頁的頁表,此外還能利用內(nèi)核權(quán)限硬件指令管理Enclave的生命周期,并把生命周期管理的功能向上提供給不可信運行時環(huán)境。
    • 用戶權(quán)限環(huán)境的功能。用戶權(quán)限下的不可信運行時可以管理Enclave生命周期。用戶權(quán)限下的可信運行時幫助Enclave環(huán)境執(zhí)行敏感代碼以及調(diào)用用戶權(quán)限硬件指令,所提供的庫必須是經(jīng)過安全審計的庫,而且只能通過靜態(tài)鏈接。

    圖1:SGX基本結(jié)構(gòu)

    2. Processor Reserved Memory布局

    如圖2所示,BIOS通過配置一組范圍寄存器分配Processor Reserved Memory(PRM)。其中包括EPC和其他保留給硬件使用的內(nèi)存。EPC中會分配Page給SGX數(shù)據(jù)結(jié)構(gòu)供Enclave使用。

    圖2:Processor Reserved Memory布局

    3. Enclave內(nèi)存結(jié)構(gòu)

    如圖3所示,每個Enclave內(nèi)存由EPC中分出的若干Page構(gòu)成,用于存儲Enclave代碼、Enclave數(shù)據(jù)——比如涉及金融等敏感操作的代碼數(shù)據(jù)、TCS。

    線程控制信息TCS。Enclave代碼的執(zhí)行是由某個具體線程(進程只有一個線程時就是指進程對應(yīng)的主線程,或者說進程)來執(zhí)行,那么這個線程在Enclave中需要保存一份描述其針對于Enclave管理用的相關(guān)控制信息,既Thread Control Structure(TCS),換句話說,TCS保存著進出Enclave時候所恢復(fù)或保存的Enclave線程信息。舉個例子就是,線程1從普通世界進入安全世界,需要佩戴安全世界的工作證,當(dāng)離開安全世界,需要放下安全世界工作證,拿上linux環(huán)境的工作證。

    圖3:Enclave結(jié)構(gòu)

    4. Enclave Page Cache Map結(jié)構(gòu)

    如圖4所示。Enclave Page Cache Map(EPCM)是一個硬件結(jié)構(gòu),保存著分配給Enclave的Page的控制信息,一個Page對應(yīng)一個 EPCM 表項,控制信息包括頁面是否已被使用、該頁的擁有者、頁面類型、地址映射和權(quán)限屬性等。EPCM 結(jié)構(gòu)由 PMH(Page Miss Handler)硬件模塊訪問,這個模塊通過查詢頁表、范圍寄存器、EPCM 進行內(nèi)存訪問。

    圖4:Enclave Page Cache Map結(jié)構(gòu)

    5.? SGX訪問控制

    Enclave基本訪問控制如圖5所示。

    • Enclave 外部的應(yīng)用程序按照段頁保護機制訪問PRM外部內(nèi)存(普通內(nèi)存)。
    • Enclave 外部的應(yīng)用程序不能訪問 Enclave 內(nèi)存
    • Enclave 內(nèi)部的代碼在EPC范圍內(nèi)只能訪問屬于自己的內(nèi)存區(qū)域,不能訪問別的Enclave內(nèi)存。
    • Enclave 內(nèi)部的代碼按照段、頁保護機制訪問PRM外的內(nèi)存。
    • Enclave 內(nèi)部的代碼不能訪問其他PRM內(nèi)存。

    圖5:Enclave基本訪問控制

    SGX軟硬件棧圖示

    SGX軟件棧如圖所示。下面將先對硬件、驅(qū)動、Platform Software提供的不可信運行時、SDK提供的可信運行時、開發(fā)者的應(yīng)用程序、開發(fā)者的Enclave程序這六個模塊進行介紹,之后將對硬件指令、驅(qū)動接口、API接口、橋函數(shù)這四個接口進行介紹。

    下面這張為舊圖

    硬件

    最下層是SGX硬件,主要指支持SGX特性的CPU(需要Intel 6代CPU及以上),此外還包括PRM、EPCM、PMH等(具體見上文“SGX硬件原理”章節(jié))。CPU向上提供硬件指令ENCLS(內(nèi)核權(quán)限級Enclave硬件指令)及ENCLU(用戶權(quán)限級Enclave硬件指令),其中內(nèi)核權(quán)限指令提供對Enclave的生命周期管理等功能,用戶權(quán)限指令提供環(huán)境切換等功能。

    驅(qū)動

    驅(qū)動處于內(nèi)核權(quán)限,向上會接收不可信運行時要求調(diào)用ENCLS的命令,然后向下調(diào)用ENCLS硬件指令,并將結(jié)果反饋給不可信運行時。因此驅(qū)動一種功能是不可信運行時想要調(diào)用ENLCS指令的代理(主要是Enclave生命周期管理以及EP的部分管理),并完成與該指令相關(guān)工作,其中一個非常重要的工作就是sgx_encl結(jié)構(gòu)體的管理(其中包括保管每個Enclave所被分配到的EP集合)。另一方面,由于SGX不信任驅(qū)動,要求驅(qū)動通過調(diào)用內(nèi)核權(quán)限指令完成如TLB刷新、EP頁交換等安全性和高效性的保障,只有如此,程序才能繼續(xù)正常運行。

    不可信運行

    不可信運行時處于用戶態(tài)權(quán)限。一方面,不可信運行時向下調(diào)用驅(qū)動接口來管理Enclave生命周期,向上將該功能以API形式提供給開發(fā)者。另一方面,還能調(diào)用用于進入Enclave的用戶態(tài)權(quán)限硬件指令,提供不可信環(huán)境下SGX設(shè)備能力查詢、不可信密鑰交換API等功能(見下文“SGX API”章節(jié))。

    可信運行時

    可信運行時同樣處于用戶態(tài)權(quán)限。可信運行時向下能夠調(diào)用用戶態(tài)權(quán)限硬件指令用于離開可信世界、創(chuàng)建加密報告等。可信運行時向上能夠給開發(fā)者提供Enclave開發(fā)的API。由于安全原因以及環(huán)境隔離,Enclave代碼不能調(diào)用外部任何庫,只能靜態(tài)鏈接安全庫,同時SGX設(shè)計者希望能夠讓Enclave代碼開發(fā)能夠滿足常規(guī)的開發(fā)需求,提供良好的開發(fā)環(huán)境,因此可信運行時包含了很多經(jīng)過安全審計的標(biāo)準(zhǔn)庫和開發(fā)庫,比如C\C++標(biāo)準(zhǔn)庫、加密庫等(具體見下文“SGX API”章節(jié))。

    應(yīng)用程序

    應(yīng)用程序處于用戶態(tài)權(quán)限,并屬于不可信世界,能夠利用不可信運行時API完成Enclave生命周期管理,還能調(diào)用普通世界的任意庫函數(shù),也就是說應(yīng)用程序開發(fā)與傳統(tǒng)的程序開發(fā)沒有區(qū)別。

    Enclave程序

    需要執(zhí)行的敏感程序,利用可信運行時提供的API來完成開發(fā),同時由于EPC大小有限,開發(fā)者應(yīng)該保證Enclave程序規(guī)模不能太大。

    硬件指令

    硬件指令分為內(nèi)核權(quán)限硬件指令和用戶權(quán)限硬件指令。內(nèi)核權(quán)限硬件指令指的是指令需要通過內(nèi)核態(tài)下才能訪問,縮寫是ENCLS。用戶權(quán)限硬件指令指的是指令用戶態(tài)下便能訪問,縮寫是ENCLU。每一個具體的功能指令被稱為葉功能,如EADD葉功能,因為葉功能之間的區(qū)分是硬件指令(如ENCLS指令:0x 0F 01 CF)的EAX值不同,因此ENCLS指令的EAX在輸入時都是用作葉功能號。

    內(nèi)核權(quán)限硬件指令-ENCLS

    如圖2所示,SGX 1代指令中,ENCLS主要用于管理Enclave生命周期等。比如下文將介紹的Enclave初始化,ECREATE指令創(chuàng)建Enclave,主要是創(chuàng)建SECS,然后EADD添加EP(Enclave Page)并把Enclave文件內(nèi)容拷貝到EP中,EEXTEND度量EP,最后EINIT確定這個Enclave建立是否合法可信。

    如圖3所示,SGX 2代指令在1代基礎(chǔ)上添加了動態(tài)增加EP、修改EP權(quán)限類型的功能,在1代中,在Enclave初始化以后,不能動態(tài)增加EP或者修改EP權(quán)限屬性。

    圖2:SGX 1代內(nèi)核權(quán)限硬件指令

    圖3:SGX 2代新增內(nèi)核權(quán)限硬件指令

    • EADD

    這個葉功能將源頁面從非Enclave內(nèi)存復(fù)制到EPC中,將EPC頁面與EPC中駐留的SECS頁面相關(guān)聯(lián),并將線性地址和安全屬性存儲在EPCM中。Enclave偏移量和安全屬性作為關(guān)聯(lián)內(nèi)容的一部分被度量并擴展到SECS.MRENCLAVE。此指令只能在當(dāng)前特權(quán)級別為0時執(zhí)行。

    RBX包含PAGEINFO結(jié)構(gòu)的有效地址,而RCX包含EPC頁面的有效地址。

    • EBLOCK

    這個葉功能導(dǎo)致EPC頁面被標(biāo)記為阻塞。此指令只能在當(dāng)前特權(quán)級別為0時執(zhí)行。

    RCX的內(nèi)容是EPC頁面的有效地址。DS段用于創(chuàng)建線性地址。不支持段重寫。在RAX中返回一個錯誤代碼。

    • ECREATE

    ENCLS[ECREATE]是Enclave構(gòu)建過程中執(zhí)行的第一條指令。ECREATE將EPC外部的SECS結(jié)構(gòu)復(fù)制到EPC內(nèi)部的SECS頁面。SECS的內(nèi)部結(jié)構(gòu)是軟件無法訪問的。

    ECREATE將在受保護的SECS中設(shè)置字段,并在EPC中將頁面標(biāo)記為有效。ECREATE初始化或檢查未使用的字段。

    軟件在源結(jié)構(gòu)中設(shè)置以下字段:SECS:BASEADDR, SECS:SIZE(以字節(jié)為單位)和屬性。SECS:BASEADDR必須按照SECS.SIZE范圍自然對齊。SECS.SIZE最小是2頁(8192字節(jié))。

    源操作數(shù)RBX包含一個PAGEINFO結(jié)構(gòu)的有效地址。PAGEINFO包含源SECS的有效地址和SECEINFO的有效地址。PAGEINFO中的SECS字段未被使用。RCX寄存器是目標(biāo)SECS的有效地址。它是EPC中的一個空槽的地址。SECS結(jié)構(gòu)必須是頁面對齊的。SECINFO標(biāo)記必須將頁面指定為SECS頁面。

    • EDBGRD

    這個葉功能將一個四字/雙字從屬于調(diào)試Enclave的EPC頁面復(fù)制到RBX寄存器中。在64位模式下讀取8個字節(jié),在非64位模式下讀取4個字節(jié)。無法重寫讀取的數(shù)據(jù)的大小。

    EPC內(nèi)部源位置的有效地址在寄存器RCX中提供。

    • EDBGWR

    這個葉功能將EBX/RBX中的內(nèi)容復(fù)制到屬于調(diào)試Enclave的EPC頁面。8個字節(jié)以64位模式寫入,4個字節(jié)以非64位模式寫入。無法重寫數(shù)據(jù)的大小。EPC內(nèi)部源位置的有效地址在寄存器RCX中提供

    • EEXTEND

    這個葉功能通過測量一個擴展字符串來更新一個SECS的MRENCLAVE測量寄存器。此指令只能在當(dāng)前特權(quán)級別為0且未初始化enclave時執(zhí)行。

    RCX包含要測量的EPC頁面的256字節(jié)區(qū)域的有效地址。DS段用于創(chuàng)建線性地址。不支持段重寫。

    • EINIT

    這個葉功能是在Enclave構(gòu)建過程中執(zhí)行的最后一條指令。EINIT之后,MRENCLAVE度量完成,Enclave準(zhǔn)備使用EENTER指令開始執(zhí)行用戶代碼。

    EINIT接收SIGSTRUCT和EINITTOKEN的有效地址。SIGSTRUCT描述了包含MRENCLAVE、ATTRIBUTES、ISVSVN、一個3072位RSA密鑰和使用所包含密鑰的簽名的Enclave。SIGSTRUCT必須填充兩個值,q1和q2:

    q1 = floor(Signature2 / Modulus);

    q2 = floor((Signature3 - q1 * Signature * Modulus) / Modulus);

    EINITTOKEN包含MRENCLAVE、MRSIGNER和屬性。這些值必須與SECS中的對應(yīng)值匹配。如果使用調(diào)試啟動鍵創(chuàng)建EINITTOKEN,則Enclave也必須處于調(diào)試模式。

    具體過程可以參考下文“EINIT指令過程”章節(jié)。

    • ELDB/ELDU

    這個葉功能將頁面從常規(guī)主存復(fù)制到EPC。作為復(fù)制過程的一部分,對頁面進行密碼學(xué)驗證和解密。此指令只能在當(dāng)前特權(quán)級別為0時執(zhí)行。

    ELDB葉功能在復(fù)制后在EPC中的目標(biāo)頁面的EPCM條目中設(shè)置BLOCK位。復(fù)制后,ELDU葉功能清除EPC中的目標(biāo)頁的EPCM條目中的BLOCK位。

    RBX包含一個PAGEINFO結(jié)構(gòu)的有效地址;RCX包含目的地EPC頁面的有效地址;RDX包含保存頁面版本的版本數(shù)組槽的有效地址。

    • EPA

    這個葉功能在EPC頁面中創(chuàng)建一個空版本數(shù)組,其邏輯地址由DS:RCX提供,并為該頁面設(shè)置EPCM屬性。在執(zhí)行這條指令時,寄存器RBX必須設(shè)置為PT_VA。

    • EREMOVE

    這個葉功能使EPC頁面與其SECE解除關(guān)聯(lián),并被標(biāo)記為未使用。此指令葉僅在當(dāng)前特權(quán)級別為0時才能執(zhí)行。

    RCX的內(nèi)容是EPC頁面的有效地址。DS段用于創(chuàng)建線性地址。不支持段重寫。

    如果操作數(shù)沒有正確對齊、或沒有引用該EPC頁面、或頁面被另一個線程使用、或其他線程在頁面所屬的Enclave中運行,則該指令將失敗。此外,如果操作數(shù)指向所關(guān)聯(lián)的SECS,則指令失敗。

    • ETRACK

    這個葉功能提供了一種機制,讓硬件跟蹤軟件是否成功地完成了所需的TLB地址清除。該指令只能在當(dāng)前特權(quán)級別為0時執(zhí)行。

    RCX的內(nèi)容是EPC頁面的有效地址。

    • EWB

    這個葉功能將一個頁面從EPC復(fù)制到常規(guī)主存。作為復(fù)制過程的一部分,頁面受到加密保護。此指令只能在當(dāng)前特權(quán)級別為0時執(zhí)行。

    • EAUG

    這個葉功能為已存在的Enclave新分配EPC頁,將使EPC頁面清零,將EPC頁面與EPC中駐留的SECS頁面相關(guān)聯(lián),并將線性地址和安全屬性存儲在EPCM中。作為關(guān)聯(lián)內(nèi)容的一部分,將安全屬性配置為阻止訪問EPC頁面,直到EACCEPT葉或EACCEPTCOPY葉的相應(yīng)調(diào)用確認將新頁面添加到Enclave為止。此指令只能在當(dāng)前特權(quán)級別為0時執(zhí)行。

    RBX包含PAGEINFO結(jié)構(gòu)的有效地址,而RCX包含EPC頁面的有效地址。

    • EMODPR

    此葉功能限定已初始化的Enclave中的EPC頁面的訪問權(quán)限。SECINFO參數(shù)的RWX位被視為一個權(quán)限掩碼;沒指定頁面權(quán)限的值將無效。此指令只能在當(dāng)前特權(quán)級別為0時執(zhí)行。

    RBX包含SECINFO結(jié)構(gòu)的有效地址,而RCX包含EPC頁面的有效地址。

    • EMODT

    這個葉功能修改EPC頁面的類型。將安全屬性配置為:在調(diào)用EACCEPT確認修改之前,阻止作為新類型訪問EPC頁面。此指令只能在當(dāng)前特權(quán)級別為0時執(zhí)行。

    RBX包含SECINFO結(jié)構(gòu)的有效地址,而RCX包含EPC頁面的有效地址。

    用戶權(quán)限硬件指令-ENCLU

    如圖4所示,SGX 1代指令中,ENCLU主要用于進出Enclave、創(chuàng)建用于Enclave驗證的報告等。

    如圖5所示,SGX 2代指令在1代基礎(chǔ)上讓用戶決定是否接受的ENCLS對EP權(quán)限類型的修改、擴展EP權(quán)限、EP拷貝到EAUG新創(chuàng)建的EP。

    圖4:SGX 1代用戶權(quán)限硬件指令

    圖5:SGX 2代新增用戶權(quán)限硬件指令

    • EENTER

    ENCLU[EENTER]指令將執(zhí)行轉(zhuǎn)移到Enclave。在指令結(jié)束時,邏輯處理器以Enclave模式在EnclaveBase+TCS.OENTRY的RIP上執(zhí)行。

    如果目標(biāo)地址不在CS段(32位)內(nèi),或者不在標(biāo)準(zhǔn)的地址范圍(64位),則會得到一個#GP(0)結(jié)果。

    • EEXIT

    ENCLU[EEXIT]指令從當(dāng)前執(zhí)行的Enclave和分支退出到RBX中指定的位置。

    RCX接收當(dāng)前的AEP(異步退出指針)。如果RBX不在CS(32位模式)或不在標(biāo)準(zhǔn)的地址范圍(64位模式),則會產(chǎn)生#GP(0)結(jié)果。

    • EGETKEY

    ENCLU[EGETKEY]指令從處理器特定的密鑰層次結(jié)構(gòu)中返回一個128位的密鑰。寄存器RBX包含KEYREQUEST結(jié)構(gòu)的有效地址,指令據(jù)此決定被請求的密鑰。RCX寄存器包含將返回密鑰的有效地址。RBX和RCX中的地址都應(yīng)該是Enclave中的位置。EGETKEY使用處理器唯一的值根據(jù)許多可能的輸入創(chuàng)建特定的鍵來派生鍵。這個指令葉只能在一個Enclave內(nèi)執(zhí)行。

    EGETKEY使用處理器唯一的值根據(jù)多種可能的輸入創(chuàng)建特定密鑰來派生密鑰。這個指令葉只能在一個Enclave內(nèi)執(zhí)行。

    • EREPORT

    這個葉功能創(chuàng)建一個描述Enclave內(nèi)容的加密報告。這個指令葉只能在Enclave內(nèi)部執(zhí)行。其他Enclave可以使用密碼報告來確定Enclave是否在相同的平臺上運行。

    RBX包含Enclave的MRENCLAVE值的有效地址,MRENCLAVE使用REPORT密鑰驗證輸出的REPORT。RCX包含一個64字節(jié)的REPORTDATA結(jié)構(gòu)的有效地址,該結(jié)構(gòu)允許指令的調(diào)用者將數(shù)據(jù)與目標(biāo)Enclave相關(guān)聯(lián)。RDX包含指令輸出的REPORT的地址。

    • ERESUME

    ENCLU[ERESUME]指令使用之前存儲在SSA中的機器狀態(tài),繼續(xù)執(zhí)行由于異常或中斷而中斷的ENCLU指令。

    • EACCEPT

    通過驗證SECINFO中指定的安全屬性與EPCM中頁面的安全屬性匹配,這個葉函數(shù)接受對運行中的Enclave中的頁面的更改。這個指令葉只能在Enclave內(nèi)部執(zhí)行。

    RBX包含SECINFO結(jié)構(gòu)的有效地址,而RCX包含EPC頁面的有效地址。

    • EACCEPTCOPY

    這個葉功能將現(xiàn)有EPC頁面的內(nèi)容復(fù)制到未初始化的EPC頁面(由EAUG創(chuàng)建)。初始化之后,該指令還可以修改與目標(biāo)EPC頁面關(guān)聯(lián)的訪問權(quán)限。這個指令葉只能在Enclave內(nèi)部執(zhí)行。

    RBX包含SECINFO結(jié)構(gòu)的有效地址,而RCX和RDX分別包含EPC頁面的有效地址。

    • EMODPE

    這個葉功能擴展了運行中的Enclave現(xiàn)有EPC頁面的訪問權(quán)限。SECINFO參數(shù)的RWX位被視為一個權(quán)限掩碼;若值表示不擴展頁面權(quán)限,那么指令將不起作用。這個指令葉只能在Enclave內(nèi)部執(zhí)行。

    RBX包含SECINFO結(jié)構(gòu)的有效地址,而RCX包含EPC頁面的有效地址。

    SGX初始化過程

    這里將以SGX初始化為例,使讀者能夠?qū)GX指令有更直觀的感受。SGX初始化過程如圖6所示。

  • 應(yīng)用程序會請求將其Enclave加載到內(nèi)存中。
  • ECREATE指令負責(zé)創(chuàng)建并填充SECS結(jié)構(gòu),SECS具體保存在一個EP中。
  • 使用EADD指令將每個頁面加載到受保護的內(nèi)存中,添加過程會記錄到SECS的日志中。
  • 使用EEXTEND指令將度量每個添加的EP,度量過程會記錄到SECS的日志中。
  • EINIT指令最終完成對Enclave的創(chuàng)建,如圖4-3-2-12所示。
  • 圖6:SGX初始化流程

    EINIT指令過程

    EINIT指令的執(zhí)行過程體現(xiàn)了Enclave實例是如何被可信的啟動起來,因此這里將對EINIT指令過程展開描述。

    如圖7講述了EINIT指令的執(zhí)行過程,既EINIT如何最終完成Enclave創(chuàng)建,用到了三個結(jié)構(gòu):SIGSTRUCT、EINITTOKEN和SECS。

  • EINIT先檢查Enclave文件的SIGSTRUCT中的公鑰是否能夠成功驗證之前硬件平臺對這個Enclave文件的SIGSTRUCT的簽名,如果成功說明,這個公鑰和這個簽名是匹配的。
  • 之后,當(dāng)加載起Enclave實例時,需要向Architectural Enclave(完成特定功能由SGX平臺提供的特殊的Enclave)根據(jù)Enclave文件的各項加載特性和最后運行起來的Enclave的各項特性申請一個EINITTOKEN。SIGSTRUCT中的公鑰HASH以后將成為簽名者的標(biāo)識MRSIGNER,然后與EINITTOKEN中的MRSIGNER比對,如果配對,說明,這個公鑰的確是這個SGX平臺所認證的開發(fā)者的,這個Enclave文件確實是這個SGX平臺所認證的開發(fā)者簽名的。
  • MRENCLAVE代表著Enclave可信啟動的度量結(jié)果,或者說Enclave啟動日志。EINIT指令將SIGSTRUCT中的MRENCLAVE與SECS中的、EINITTOKEN中的比對,如果匹配,說明這個Enclave啟動過程時可信的。
  • 驅(qū)動接口

    驅(qū)動接口的主要功能還是向不可信運行時uRTS提供管理Enclave生命周期的功能,會在內(nèi)核權(quán)限硬件指令基礎(chǔ)之上完成具體的生命周期管理能力。

    SGX API

    這里將介紹運行時環(huán)境(uRTS由Platform Software提供、tRTS由SDK提供)向開發(fā)者提供了哪些API供使用。這是SGX開發(fā)者直接接觸的部分。

    1. 可信運行時庫函數(shù)

    由于Enclave程序會被放在Enclave Page中,與其他內(nèi)存存在隔離,因此無法鏈接動態(tài)鏈接庫來實現(xiàn)各種豐富的傳統(tǒng)開發(fā)能有的功能,只能鏈接靜態(tài)鏈接庫,也就是將需要用到的靜態(tài)鏈接庫函數(shù)一并放到Enclave內(nèi)存中。因此靜態(tài)鏈接庫的豐富程度決定了Enclave程序開發(fā)的便利程度。為了滿足Enclave程序盡可能能夠像傳統(tǒng)開發(fā)一樣便利,因此提供了一系列包括C/C++標(biāo)準(zhǔn)庫、可信密碼學(xué)庫等源碼用于靜態(tài)鏈接。由于靜態(tài)鏈接庫一旦出現(xiàn)安全性問題會直接影響Enclave程序,因此所能使用的庫函數(shù)是需要經(jīng)過安全審計的,所以需要剔除或者重新實現(xiàn)不安全的庫函數(shù),此外為了便于開發(fā)提供可信的密碼學(xué)相關(guān)操作的庫函數(shù)。總而言之,可信庫函數(shù)的提供需要滿足安全性及便利性。

    a. 可信運行時系統(tǒng)服務(wù)

    一些起到幫助性質(zhì)的庫函數(shù)。

  • sgx_is_within_enclave、sgx_is_outside_enclave:可以幫助開發(fā)人員判斷一個地址是否在Enclave內(nèi)存中。
  • sgx_read_rand:提供一個真隨機函數(shù)。Enclave不支持鏈接C/C++標(biāo)準(zhǔn)庫里的rand、srand,因為它們是偽隨機函數(shù),從庫中被剔除。
  • b. 自定義異常處理函數(shù)

    當(dāng)Enclave中發(fā)生了硬件異常,將由異常處理鏈來逐級處理硬件異常。tRTS提供了函數(shù)使得開發(fā)者的Enclave程序能通過注冊處理函數(shù)來具體處理部分硬件異常,然后再將異常交給原來的異常處理鏈處理,或者說將這個異常處理句柄追加到異常處理鏈中。

  • sgx_register_exception_handler:注冊一個異常處理句柄,將它追加到異常處理鏈。
  • sgx_unregister_exception_handler:注銷一個異常處理句柄。
  • c. 為CPUID準(zhǔn)備的自定義異常處理函數(shù)

    Enclave中不支持直接使用CPUID指令,若想在Enclave中操作CPUID指令,得通過libsgx_tstdc.a中的函數(shù)sgx_cpuid、sgx_cpuid_ex或內(nèi)聯(lián)函數(shù)__cpuid、__cpuidex調(diào)用ocall進入uRTS具體實現(xiàn)。由于是uRTS下執(zhí)行,所以最好檢查CPUID指令返回值和Ocall返回值。如果Enclave中用到第三方庫用到了CPUID指令,需要開發(fā)者做分析檢查,處理CPUID異常或者開發(fā)者直接給出CPUID結(jié)果而不去真正調(diào)用CPUID。

    d. 可信服務(wù)庫

    可信服務(wù)庫sgx_tservice主要用于安全的數(shù)據(jù)操作和保護。第一部分函數(shù)是對SGX硬件指令包裝。

  • sgx_get_key:產(chǎn)生一個128位的私鑰,是對EGETKEY硬件指令的包裝。
  • sgx_create_report:創(chuàng)建一個目標(biāo)Enclave的報告,是對EREPORT硬件指令的包裝。
  • sgx_verify_report:對sgx_create_report產(chǎn)生報告提供軟件驗證。
  • sgx_self_report:創(chuàng)建自身Enclave的密碼學(xué)報告。
  • sgx_self_target:函數(shù)sgx_self_target使用Enclave的自身的加密學(xué)報告生成自身的“目標(biāo)信息”(另一種實用的結(jié)構(gòu),更加豐富地描述Enclave的信息)。可以使用它來獲取在Enclave間的認證過程所用到的“目標(biāo)信息”。
  • 第二部分函數(shù)是用于將數(shù)據(jù)密封到SGX平臺的不可信存儲中的函數(shù)。Enclave被關(guān)閉或重啟的情況下,Enclave中數(shù)據(jù)將隨Enclave銷毀而消失,如果有些數(shù)據(jù)未來需要被用到,那么就需要加密存儲不可信存儲中。

  • sgx_seal_data、sgx_seal_data_ex:sgx_seal_data函數(shù)找到一個Enclave獨有的用于Seal(封裝數(shù)據(jù))的密鑰,并使用該密鑰加密輸入數(shù)據(jù)緩沖區(qū)。在銷毀enclave之后,可以使用這個函數(shù)來保存機密數(shù)據(jù)。密封的數(shù)據(jù)塊可以在Enclave的未來實例化時打開。sgx_seal_data_ex在sgx_seal_data基礎(chǔ)上,可以自定義Seal密鑰的導(dǎo)出過程。
  • sgx_unseal_data:實用Enclave的Seal密鑰來解密之間Seal過的數(shù)據(jù)塊。
  • sgx_mac_aadata、sgx_mac_aadata_ex:對密封數(shù)據(jù)使用Enclave獨有的密鑰生成AES-GMAC,用于標(biāo)識這個密封數(shù)據(jù)對應(yīng)于該Enclave。
  • sgx_unmac_aadata:通過比對密封數(shù)據(jù)(計算MAC)及其之前生成的AES-GMAC數(shù)據(jù)判斷是否是這個密封數(shù)據(jù)是否是同個Enclave之前的實例生成的。
  • 第三部分函數(shù)用于幫助計算密封數(shù)據(jù)的大小、加密文本長度和消息驗證碼(MAC)文本長度。

    • sgx_calc_sealed_data_size、sgx_get_add_mac_txt_len、sgx_get_encrypt_txt_len:幫助密封庫函數(shù)確定在具體操作時為一些關(guān)鍵結(jié)構(gòu)分配內(nèi)存的大小

    e. 可信平臺服務(wù)函數(shù)

    允許開發(fā)者使用平臺服務(wù)(PSE,Paltform Service Enclave)或者獲得平臺服務(wù)安全屬性。.

  • sgx_create_pse_session、sgx_close_pse_session:創(chuàng)建和關(guān)閉與PSE之間的會話,會話用于請求平臺服務(wù)。
  • sgx_get_ps_sec_prop、sgx_get_ps_sec_prop_ex:用于獲得平臺服務(wù)的安全屬性的描述。
  • sgx_get_trusted_time:從AE獲取可信的時間
  • sgx_create_monotonic_counter_ex、sgx_create_monotonic_counter:用于創(chuàng)建一個處于非易失性內(nèi)存(Non-volatile Memory)的有安全保障的單調(diào)計數(shù)器,用于比如密封數(shù)據(jù)版本號等維護,防止密封數(shù)據(jù)的回滾攻擊等。
  • sgx_destroy_monotonic_counter:銷毀單調(diào)性計數(shù)器。
  • sgx_increment_monotonic_counter:對單調(diào)性計數(shù)器進行加一操作。
  • sgx_read_monotonic_counter:讀取單調(diào)性計數(shù)器當(dāng)前的值。
  • ?f. Diffie–Hellman (DH)會話建立函數(shù)?

    幫助開發(fā)者使用ECDH密鑰交換協(xié)議在兩個Enclave間建立安全會話。

  • sgx_dh_init_session:用于初始化會話建立的請求方和應(yīng)答方。
  • sgx_dh_responder_gen_msg1、sgx_dh_initiator_proc_msg1、sgx_dh_responder_proc_msg2、sgx_dh_initiator_proc_msg3:用于具體的ECDH密鑰交換過程。
  • ?g. C?標(biāo)準(zhǔn)庫?

    sgx_tstdc提供了可信標(biāo)準(zhǔn)C庫,同時這個庫只能在Enclave中使用。目前支持C99子集,代碼來自O(shè)penBSD項目。不支持部分函數(shù)的原因:

  • 函數(shù)定義用到了受限制的CPU指令。
  • 函數(shù)定義已知是不安全的。
  • 函數(shù)定義太大了或者函數(shù)定義嚴(yán)重依賴于不可信世界的數(shù)據(jù)。
  • 需要特定編譯器
  • 具體的函數(shù)支持情況:

  • Locale函數(shù):地域設(shè)置,如中文操作系統(tǒng)下,顯示中文、中國人習(xí)慣的日期格式等,Localization數(shù)據(jù)過大,不適合放Enclave。
  • 隨機數(shù)生成函數(shù):不安全的為隨機函數(shù),提供了一個真隨機sgx_read_rand。
  • 字符串函數(shù):不安全的字符串操作函數(shù),安全的字符串操作函數(shù)仍然可用(strncpy等)。
  • Abort函數(shù):語義有區(qū)別,一旦一個Enclave線程發(fā)出abort,那么Enclave處于Unusable狀態(tài),不再啟動新的Enclave線程,當(dāng)所有Enclave線程都退出后,這個Enclave就被鎖定不再被發(fā)現(xiàn)。
  • 線程同步基元:提供互斥量同步、條件變量同步、線程管理但不支持Enclave內(nèi)部創(chuàng)建線程。
  • 在Enclave內(nèi)查詢CPUID:sgx_cpuid、sgx_cpuidex。
  • 安全函數(shù):_s后綴的函數(shù),在mbusafecrt.h中。
  • GCC?內(nèi)建函數(shù):為了優(yōu)化代碼,GCC可能將如malloc替換成內(nèi)建的__bultin_malloc,這樣可能使得Enclave中的代碼內(nèi)聯(lián)了不安全的內(nèi)建函數(shù)。可以通過fno-builtin or -fno-builtin-function編譯選項來禁止。
  • Non-Local Jumps:標(biāo)準(zhǔn)C庫提供了setjmp(記錄程序狀態(tài))、longjmp(恢復(fù)在之前記錄的程序狀態(tài)),longjmp可能破壞棧結(jié)構(gòu),在C程序使用中要保證這些指令被用在未知行為上。
  • h. C++ 語言支持

    C++語言特性支持情況。ISO/IEC 14882:SGX對定義的C++庫大部分語言特性完全支持,包括:

  • 動態(tài)內(nèi)存分配:new/delete
  • 支持全局的Initializers,通常用于構(gòu)建全局對象
  • Run-time Type Identification (RTTI)
  • Enclave內(nèi)部C++異常處理函數(shù)
  • × 不支持全局Destructors,因為Enclave銷毀時,EPC會被回收。

    × Enclave接口定義中不支持C++對象,如果需要外部往Enclave傳參,需要另外保存成C結(jié)構(gòu)體。

    C++標(biāo)準(zhǔn)庫支持情況:支持了一套遵循C++11標(biāo)準(zhǔn)的可信C++標(biāo)準(zhǔn)庫(包括STL)。有多個版本的C++標(biāo)準(zhǔn)庫可以被鏈接:

  • sgx_tcxx.a(默認):從libc++移植,支持大部分C++11特性。
  • sgx_tstdcxx.a(較老的):源自STLport,支持有限的C++11特性。
  • 不支持的函數(shù)如下:

  • I/O相關(guān)的函數(shù)和類,如<iostream>
  • 依賴locale庫的函數(shù)
  • 需要系統(tǒng)調(diào)用的函數(shù)
  • 只有C語言函數(shù)可以作為Enclave與外部的橋接函數(shù)。

    i. 密碼學(xué)庫

    SDK提供了可信密碼學(xué)庫sgx_tcrypto,這同時會被其他可信庫如sgx_tservice用到。可信密碼學(xué)庫基于Intel Integrated Performance Primitives (Intel IPP)或Intel Software Guard Extensions SSL cryptographic library (Intel SGX SSL)。sgx_tcrypto庫函數(shù)包括(除IPP、SGX SSL外的函數(shù),一類適用于單獨的直接對單數(shù)據(jù)集進行密碼學(xué)運算,另一類是構(gòu)建管理句柄對多個數(shù)據(jù)集進行管理和運算):

  • sgx_sha256_msg:提供標(biāo)準(zhǔn)的SHA256散列。
  • sgx_sha256_init、sgx_sha256_update、sgx_sha256_get_hash、sgx_sha256_close:用于多數(shù)據(jù)集的SHA256的管理及運算。
  • sgx_rijndael128GCM_encrypt、sgx_rijndael128GCM_decrypt:用于單獨的Rijndael AES-GCM的加解密操作。
  • sgx_aes_gcm128_enc_init、sgx_aes_gcm128_enc_update、sgx_aes_gcm128_enc_get_mac、sgx_aes_gcm_close:用于多數(shù)據(jù)集的AES-GCM128位的管理和運算。
  • sgx_rijndael128_cmac_msg:提供獨立的標(biāo)準(zhǔn)的CMAC散列計算。
  • sgx_cmac128_init、sgx_cmac128_update、sgx_cmac128_final、sgx_cmac128_close:用于多數(shù)據(jù)集之上的CMAC128位散列的管理和運算。
  • sgx_aes_ctr_encrypt、sgx_aes_ctr_decrypt:提供單獨的Rijndael AES-CTR加解密運算。
  • sgx_ecc256_open_context、sgx_ecc256_close_context、sgx_ecc256_create_key_pair、sgx_ecc256_compute_shared_dhkey、sgx_ecc256_check_point:提供ECC256操作的管理和具體運算。
  • sgx_ecdsa_sign、sgx_ecdsa_verify、sgx_ecdsa_verify_hash:用于ECDSA簽名和驗證。
  • sgx_rsa3072_sign、sgx_rsa3072_verify:用于RSA3072的簽名和驗證。
  • sgx_create_rsa_key_pair、sgx_create_rsa_priv2_key、sgx_create_rsa_pub1_key、sgx_free_rsa_key:用于構(gòu)建和銷毀RAS密鑰。
  • sgx_rsa_priv_decrypt_sha256、sgx_rsa_pub_encrypt_sha256:RSA-OAEP加密模式的SHA256算法的加解密。
  • sgx_calculate_ecdsa_priv_key:利用隨機種子產(chǎn)生ECDSA私鑰。
  • sgx_ecc256_calculate_pub_from_priv:利用ECC私鑰計算ECC公鑰。
  • sgx_hmac_sha256_msg:提供標(biāo)準(zhǔn)的HMAC散列。
  • sgx_hmac256_init、sgx_hmac256_update、sgx_hmac256_final、sgx_hmac256_close:提供多數(shù)據(jù)集上的HMAC256散列的管理和運算。
  • j. 可信密鑰交換函數(shù)

    • sgx_ra_init、sgx_ra_init_ex、sgx_ra_get_keys、sgx_ra_close:用于遠程驗證和交換密鑰的管理和操作。

    ?k. Intel受保護文件系統(tǒng)庫?

    提供了常規(guī)C語言文件操作API的子集,寫過程中,文件被加密存儲在不可信磁盤中,讀取過程中會驗證文件的機密性和完整性,功能上總體接近傳統(tǒng)的文件庫函數(shù)。

  • sgx_fopen、sgx_fopen_auto_key、sgx_fclose、sgx_fread、sgx_fwrite、sgx_fflush、sgx_ftell、sgx_fseek、sgx_feof、sgx_remove:用于受保護文件的開關(guān)、創(chuàng)建、讀寫、定位、刪除等功能。
  • sgx_ferror、sgx_clearerr:返回或清除文件錯誤
  • sgx_fexport_auto_key、sgx_fimport_auto_key:用于導(dǎo)入導(dǎo)出最新的用于文件加解密操作的密鑰
  • sgx_fclear_cache:清除內(nèi)部的文件緩沖。
  • l. TCMalloc

    • malloc、free、realloc、calloc、memalign:提供了可信的經(jīng)過安全審計的TCMalloc庫版本(sgx_tcmalloc庫,從gperftools-2.5移植)

    m. Switchless調(diào)用庫

    不可信世界包含switchless調(diào)用的不可信部分,如sgx_create_enclave_ex使用switchless模式創(chuàng)建enclave;可信世界中l(wèi)ibsgx_tswitchless.a庫提供switchless調(diào)用的可信部分,主要是維護可信世界中switchless調(diào)用的特性,能夠讓不可信世界switchless調(diào)用能夠進入到可信世界正常運作。(見下文“SGX Switch模式及Switchless模式”章節(jié))

    n. 受保護代碼加載器庫

    維護不可信世界的“受保護代碼加載”

    2. 不可信運行時庫

    a. Enclave創(chuàng)建與銷毀

  • sgx_create_enclave、sgx_create_enclave_ex、sgx_create_enclave_from_buffer_ex、sgx_create_encrypted_enclave:用于創(chuàng)建Enclave,傳入?yún)?shù)有所不同。
  • sgx_destroy_enclave:用于銷毀Enclave。
  • b. 證明函數(shù)

    向應(yīng)用程序或Enclave程序證明目標(biāo)Enclave程序的確運行在SGX環(huán)境中。

  • sgx_init_quote、sgx_calc_quote_size、sgx_get_quote_size、sgx_get_quote、sgx_report_attestation_status、sgx_check_update_status:采用Intel EPID(增強隱私標(biāo)識)方案的證明的管理和獲取。
  • sgx_select_att_key_id、sgx_init_quote_ex、sgx_get_quote_size_ex、sgx_get_quote_ex:采用Intel EPID及ECDSA方案的證明的管理與獲取。
  • c. 不可信密鑰交換函數(shù)

    用于不可信環(huán)境下遠端服務(wù)器和Enclave程序的秘密交換

  • sgx_ra_get_msg1、sgx_ra_proc_msg2:不可信環(huán)境下采用Intel EPID證明方案的遠端服務(wù)器和Enclave程序的秘密交換。
  • sgx_get_extended_epid_group_id:Intel EPID證明方案下,告訴遠端服務(wù)器用的哪一個Intel EPID組。
  • sgx_ra_get_msg1_ex、sgx_ra_proc_msg2_ex:不可信環(huán)境下采用Intel EPID證明及ECDSA證明方案的遠端服務(wù)器和Enclave程序的秘密交換。
  • d. 不可信平臺服務(wù)函數(shù)

    sgx_get_ps_cap:說明平臺服務(wù)PSE支持哪些功能

    e. Intel SGX 使能和啟動控制函數(shù)

  • sgx_cap_enable_device:讓應(yīng)用程序能夠動態(tài)開啟SGX設(shè)備。
  • sgx_register_wl_cert_chain:如果開發(fā)者有一個最新的Enclave簽名密鑰白名單證書鏈,則需要先調(diào)用此函數(shù)才能啟動Enclave。
  • sgx_get_whitelist_size:告訴應(yīng)用程序白名單證書鏈的大小
  • sgx_get_whitelist:告訴應(yīng)用程序當(dāng)前AE服務(wù)所支持的白名單證書鏈。
  • f. Intel SGX 設(shè)備能力函數(shù)

  • sgx_is_capable:告訴應(yīng)用程序SGX設(shè)備是否可用。
  • sgx_cap_get_status:幫助開發(fā)者檢查客戶端平臺的SGX狀態(tài),既SGX是否能用、是否能被開啟。
  • 3. SGX API應(yīng)用舉例——本地DH會話建立

    想象這樣一個場景,一個應(yīng)用程序啟動了若干不同Enclave實例,我們想讓實例間構(gòu)建起可信的會話通道,既ECDH密鑰交換及會話建立(API函數(shù)見上文“Diffie–Hellman (DH)會話建立函數(shù)”章節(jié))。

    下文“橋函數(shù)”章節(jié)將會具體講述應(yīng)用程序如何進出Enclave。這里將簡化此細節(jié),直接表述為應(yīng)用程序從不可信環(huán)境切換環(huán)境進入Enclave。

    如圖8所示,這里描述Enclave1、Enclave2(簡稱E1、E2)之間的會話建立。創(chuàng)建E1、E2實例,線程從APP切換至E1,然后調(diào)用sgx_dh_init_session這個API函數(shù)進入可信運行時(tRTS,由SDK提供,tRTS和Enclave同處于安全世界,不需要環(huán)境切換),將自己標(biāo)記為會話請求方。E1會繼續(xù)要求外部應(yīng)用程序轉(zhuǎn)告E2它想要和E2建立通訊。

    切換至E2后,E2調(diào)用sgx_dh_init_session進入tRTS將自己初始化為應(yīng)答方,然后調(diào)用sgx_dh_responder_gen_msg1,這樣會調(diào)用硬件指令EREPOTE產(chǎn)生E2的報告,此外創(chuàng)建E2的公私鑰對,把公鑰、報告封裝成Msg1用于返回給E1。

    E1調(diào)用sgx_dh_initiator_proc_msg1處理Msg1產(chǎn)生Msg2:E1創(chuàng)建自己的公私鑰對,通過指令創(chuàng)建E1報告,用Msg1的E2公鑰和E1私鑰創(chuàng)建共享密鑰,將E1公鑰、報告等封裝成Msg2交給E2。

    E2最終會返回Msg3:E2調(diào)用sgx_dh_responder_proc_msg2處理Msg2,既用E1公鑰和E2私鑰構(gòu)建共享密鑰,并用Msg2中的共享密鑰散列值驗證之。

    E1調(diào)用sgx_dh_initiator_proc_msg3處理Msg3。最后驗證對方身份完成會話建立。

    (可以見博客——SGX本地認證)

    SGX開發(fā)特點

    與傳統(tǒng)的C++程序開發(fā)不同,SGX應(yīng)用程序會分為兩塊,一塊是執(zhí)行在Enclave中的代碼,一塊是執(zhí)行在普通環(huán)境中的代碼。此外,需要在.edl文件中的trusted標(biāo)記中寫上在Enclave中執(zhí)行的函數(shù)的聲明,在untrusted標(biāo)記中寫上在普通環(huán)境中執(zhí)行的函數(shù)的聲明。

    SgxEdger8r(SGX Edge Routine,主要用于在編譯過程中對.edl文件中的ecall和ocall重新封裝編寫,即將用戶編寫的e/ocall改寫成實際執(zhí)行的e/ocall)工具會在應(yīng)用程序編譯過程中根據(jù)edl文件將可信與不可信函數(shù)聲明重新封裝成給Enclave環(huán)境、普通環(huán)境下代碼所調(diào)用的橋函數(shù),實現(xiàn)兩種環(huán)境之間的切換。如普通環(huán)境下代碼調(diào)用橋函數(shù)會進而通過sgx_ecall進入Enclave環(huán)境,Enclave環(huán)境下代碼調(diào)用橋函數(shù)進而通過sgx_ocall進入普通環(huán)境,其中調(diào)用sgx_e/ocall的代碼由SgxEdger8r根據(jù)用戶編寫在edl文件中trusted/untrusted標(biāo)記下的函數(shù)聲明來自動生成,即具體的進出Enclave代碼不需要用戶來實現(xiàn),只需要打上標(biāo)記即可。

    環(huán)境切換步驟如下:第一步,通過工具生成的橋函數(shù)會調(diào)用sgx_ecall、sgx-ocall進而調(diào)用硬件指令來切換環(huán)境;第二步,由于那些打上標(biāo)記的函數(shù)本身有用戶定義的執(zhí)行代碼,因此在切換環(huán)境后會進入真正的函數(shù)定義。舉個例子,Main()->不可信環(huán)境ECALL_A()->sgx_ecall()->EENTER->可信環(huán)境ECALL_A()。

    總而言之,這些打上標(biāo)記的函數(shù)聲明會最終由SgxEdger8r工具在編譯過程中改造成橋函數(shù),用于切換環(huán)境,然后執(zhí)行函數(shù)聲明對應(yīng)的函數(shù)定義。

    此外在普通環(huán)境中的代碼需要顯式地管理Enclave的生命周期,如調(diào)用“創(chuàng)建初始化Enclave的函數(shù)”之后才能調(diào)用Enclave中的函數(shù),最后需要調(diào)用“銷毀Enclave的函數(shù)”。

    如果想要將在普通環(huán)境和Enclave環(huán)境中傳遞一個“指向緩沖區(qū)的指針”等參數(shù),需要在.edl文件的函數(shù)形參前面聲明如[in]、[out]等參數(shù)標(biāo)記,這是因為普通環(huán)境的內(nèi)存往往是不可信的,通過比如將普通環(huán)境下的緩沖區(qū)拷貝一份到Enclave環(huán)境中,然后Enclave代碼在拷貝進Enclave的緩沖區(qū)上進行操作等才是放心的,不會中途被惡意篡改等,最后可能再拷貝到普通環(huán)境供普通環(huán)境下的程序使用(具體見下文“SGX參數(shù)”章節(jié))。

    橋函數(shù)總結(jié)

    通過上文的引入,現(xiàn)在總結(jié)一下橋函數(shù):橋函數(shù)是指在SGX平臺下,唯一能夠切換可信環(huán)境與不可信環(huán)境的方式,調(diào)用硬件指令ENCLU中的EENTER、EEXIT來具體實現(xiàn),是由SgxEdger8r工具來生成。

    代碼層面的環(huán)境切換過程大概是這樣,以傳統(tǒng)Switch模式ecall為例(這種模式便于理解,另一種Switchless模式Ecall見“SGX Switch模式及Switchless模式”章節(jié)):

    不可信環(huán)境->假裝調(diào)用由用戶定義的ecall函數(shù)->對應(yīng)的橋函數(shù)(SGX Edger8r重新封裝的)>sgx_ecall()->_sgx_ecall()->CEnclave::ecall()->do_ecall()->enter_enclave()->__morestack(匯編)->ENCLU(調(diào)用硬件指令)->切換到tRTS->可信環(huán)境->enclave_entry(匯編)->enter_encalve()->do_ecall()->trts_ecall()->真正調(diào)用由用戶定義的ecall函數(shù)。

    SGX參數(shù)及函數(shù)屬性

    SGX將參數(shù)從不可信環(huán)境傳入可信環(huán)境的方法是將保存在不可信環(huán)境的棧上的參數(shù)拷貝到寄存器,EENTER葉功能會將不可信環(huán)境的RSP、RBP保存到SSA結(jié)構(gòu)中,并完成地址的切換進入可信環(huán)境。

    這里將描述.edl文件中的SGX橋函數(shù)(接口)中參數(shù)或函數(shù)的修飾符說明,用來具體說明函數(shù)傳參或函數(shù)聲明的具體屬性。ECALL為例子,OCALL類似。

    • public void ecall_array_user_check([user_check] int arr[4]);

    這里是對函數(shù)傳參屬性的說明,下同。

    [user_check]:Enclave程序使用數(shù)組時該數(shù)組不會被驗證、數(shù)組對應(yīng)緩沖區(qū)不會拷貝到Enclave內(nèi)存中,Enclave可以直接修改應(yīng)用程序中數(shù)組對應(yīng)的緩沖區(qū)。(這個例子中參數(shù)為數(shù)組,指針類似)

    • public void ecall_array_in([in] int arr[4]);

    [in]:Enclave會在內(nèi)部分配相同大小的緩沖區(qū),外部緩沖區(qū)的內(nèi)容被拷貝到內(nèi)部緩沖區(qū),內(nèi)部緩沖區(qū)內(nèi)容修改不會導(dǎo)致(不影響)外部緩沖區(qū)任何變化。

    • public void ecall_array_out([out] int arr[4]);

    [out]:內(nèi)部緩沖區(qū)的修改在函數(shù)返回時拷貝到外部緩沖區(qū)。

    • public void ecall_array_in_out([in, out] int arr[4]);

    [in, out]:Enclave內(nèi)部會分配一個緩沖區(qū),將數(shù)組緩沖區(qū)拷貝進來,同時在函數(shù)返回時,將內(nèi)部緩沖區(qū)內(nèi)容拷貝到外部緩沖區(qū),雙向。也就說緩沖區(qū)的改造過程被隱藏了,外部應(yīng)用程序只能知道函數(shù)的輸入輸出。

    • public void ecall_array_isary([user_check, isary] array_t arr);

    [isary]:告訴Edger8r用戶自定義結(jié)構(gòu)體array_t的變量是一個數(shù)組。

    • public void ecall_pointer_string([in, out, string] char *str);

    [string]:告訴Edger8r,變量str參數(shù)是一個NULL結(jié)尾的字符串。可以用于strlen等功能。

    • public void ecall_pointer_string_const([in, string] const char *str);

    const:說明字符串str不可修改,所以不適用[out]屬性。

    • public void ecall_pointer_size([in, out, size=len] void *ptr, size_t len);

    [size]:告訴Edger8r?ptr對應(yīng)的緩沖區(qū)的字節(jié)數(shù)。不能對[string]屬性施加[size]屬性。

    • public void ecall_pointer_count([in, out, count=cnt] int *arr, size_t cnt);

    [count]:告訴Edger8r需要拷貝的arr的長度。

    • public void ecall_pointer_isptr_readonly([in, isptr, readonly, size=len] buffer_t buf, size_t len);

    [isptr]:告訴Edger8r自定義類型是一個指針。

    [readonly]:禁止Enclave內(nèi)部分配的緩沖區(qū)被拷貝到外部去,因此不能與[out]同時使用。

    • public void ecall_function_public(void);

    這里是對函數(shù)聲明屬性的描述,下同。

    [public]:外部可以直接調(diào)用該Ecall

    • int ecall_function_private(void);

    [private]:默認,外部不可以直接調(diào)用該Ocall,除非有Ocall調(diào)用這個Ecall并且是[allow]屬性

    • void ocall_function_allow(void) allow(ecall_function_private);

    [allow]:允許OCALL在外部調(diào)用[private]?ECALL。

    SGX Switch模式及Switchless模式

    (可以見博客——ECALL Switch模式和ECALL Switchless模式)

    由上文可見,SGX是通過Ecall來進入Enclave環(huán)境,類似的,通過Ocall離開Enclave環(huán)境。關(guān)于Ecall效率方面,傳統(tǒng)的Switch模式,應(yīng)用程序?qū)?yīng)的線程(該進程只有一個Main線程)會切換進入Enclave環(huán)境,然后拿上它在Enclave環(huán)境的“工作證”,也就是綁定上TCS這個結(jié)構(gòu)體,進行具體的用戶定義的Ecall函數(shù)的執(zhí)行。

    但是這種模式,只能使用一個線程來完成具體任務(wù)(我們將這種調(diào)用用戶定義的Ecall函數(shù)稱為Ecall任務(wù),此外還有Ocall任務(wù)),效率很低,同時還有伴隨開銷,比如進入Enclave環(huán)境需要拿起TCS“工作證”。因為目前還不支持unix的線程庫,因此在Enclave中不支持創(chuàng)建線程,只能支持互斥量、條件變量等的維護(用于外部應(yīng)用程序創(chuàng)建多個線程分別進入Enclave的場景),目前不支持線程庫的原因是一方面Enclave程序旨在保護敏感代碼,而遠不需要創(chuàng)建線程等功能,另一方面出于數(shù)據(jù)依賴性、安全性等考量。

    為了提高效率問題,定義了Switchless模式,如圖9所示。以Ecall為例,uRTS為外部應(yīng)用程序提供了Ecall任務(wù)池,以及聯(lián)合tRTS初始化了多個可信Worker線程來具體執(zhí)行Ecall任務(wù)。舉例來說,外部應(yīng)用程序調(diào)用了Ecall_A、Ecall_B,Switch做法是只有一個線程,它執(zhí)行Ecall_A之后后回到不可信環(huán)境繼而執(zhí)行Ecall_B,是一種上下文環(huán)境切換的概念;Switchless做法是構(gòu)建好Ecall Table管理器保存可能執(zhí)行的Ecall函數(shù),同時構(gòu)建一個任務(wù)池用于記錄每個Ecall具體執(zhí)行的先后順序,uRTS線程會喚醒空閑的可信Worker線程從任務(wù)池中取任務(wù),然后查詢Call Table,進而完成具體任務(wù),因此省去了上下文環(huán)境切換的開銷。Ocall方向的類似。

    圖9:Switchless模式調(diào)用架構(gòu)

    SGX初始化

    基本介紹

    這張圖改自Intel SGX手冊的一張圖(一年前看的,實在記不住在哪個位置了)。相對于那張圖,我把PMH、ME兩個硬件模塊畫上去了。

    下圖是Enclave初始化時硬件間關(guān)系圖,Enclave初始化大致經(jīng)歷了(1)申請Enclave內(nèi)存,(2)創(chuàng)建SECS數(shù)據(jù)結(jié)構(gòu),(3)加載Enclave代碼進Enclave內(nèi)存,(4)度量Enclave代碼,(5)完成初始化。

    圖中最下面的內(nèi)存中一塊特定區(qū)域用作Enclave內(nèi)存(一般稱為Enclave Page Cache,EPC)。SECS是存儲在EPC中的一個重要數(shù)據(jù)結(jié)構(gòu),用于Enclave管理。EPCM是存儲于EPC中實施EPC訪問控制的數(shù)據(jù)結(jié)構(gòu)。CPU中的MEE硬件模塊負責(zé)對EPC加密,防止物理攻擊。CPU中的PMH硬件模塊負責(zé)查詢EPCM項并實施EPC訪問控制。

    以sgx_create_enclave為例初始化Enclave,源碼流程如圖所示。sgx_create_enclave擴展支持SGX?PCL、Switchless Calls 初始化和Key Separation & Sharing (KSS).

    環(huán)境檢查總結(jié)

    SGX初始化過程中部分?jǐn)U展特性的聲明、驗證和配置(Switchless特性、PCL特性、KSS特性)。

    ex_features_p數(shù)組項說明
    0

    pointer to an Intel? SGX PCL sealed key

    1pointer to the sgx_uswitchless_config_t structure
    2pointer to the sgx_kss_config_t structure
    3:31reserved, must be NULL

    將Enclave文件映射到進程的虛擬地址空間。這個映射的位置就是下圖Enclave虛擬內(nèi)存視圖的虛框部分。

    將Enclave文件這個ELF文件進行全面的ELF格式解析,驗證Enclave文件格式的正確性,以及對Enclave文件中關(guān)鍵信息(關(guān)鍵符號、動態(tài)Section、元數(shù)據(jù)【其中包括重要的Enclave布局信息等】)進行記錄,后續(xù)在構(gòu)建Enclave時經(jīng)常會用到這些信息。比如布局直接填充到ELRANGE,起ELRANGE結(jié)構(gòu)性(堆、棧、TCS等)格局作用,比如動態(tài)Section中的REL、PLT用于重定位過程,比如關(guān)鍵符號用于進出Enclave時提供出入口。

    對當(dāng)前軟件棧平臺進行驗證,尤其是版本情況進行匹配驗證。

    對當(dāng)前CPU的X擴展特性進行驗證、分析和記錄,后續(xù)構(gòu)建Enclave過程中,需要依據(jù)X特性對細節(jié)進行指定,比如根據(jù)X特性支持情況,在進出Enclave時候針對X特性,額外保存X特性相關(guān)的上下文環(huán)境(比如SSE、AVX、MPX等CPU擴展特性的上下文內(nèi)容,并且值得提醒的是Enclave內(nèi)外是兩套不同的上下文環(huán)境)。一切的目的是為了讓SGX和CPU擴展特性有更好地兼容,并且不會引入任何安全問題。

    環(huán)境檢查的事情終于做完了,然后會進入__create_enclave函數(shù)來完成Enclave的創(chuàng)建。

    uRTS端構(gòu)建Enclave總結(jié)

    包括部分?jǐn)U展特性的聲明、驗證和配置(Switchless特性、PCL特性、KSS特性)。

    SGX元數(shù)據(jù)的驗證,后面會用到。

    將SGX驅(qū)動綁定的設(shè)備作為Enclave或者說ELRANGE的基址,構(gòu)建SECS(管理并代表一個Enclave的數(shù)據(jù)結(jié)構(gòu)),并加載到EPC中。

    對Enclave文件映射打補丁,將一些全局變量等信息更新到Enclave文件映射,后續(xù)會使用Enclave文件映射構(gòu)建ELRANGE。

    將PT_LOAD、PT_TLS等類型的Segment加載到ELRANGE和對應(yīng)的EPC中。

    將元數(shù)據(jù)中堆、線程上下文等布局信息加載到ELRANGE和對應(yīng)的EPC中。

    布局情況可以參考下圖

    上面提到SECS的構(gòu)建會涉及到ECREATE硬件指令,并且任何頁加載到EPC的過程都會涉及到EADD、EEXTEND硬件指令。并且ECREATE、EADD、EEXTEND都是Ring0權(quán)限的ENCLS硬件指令,需要SGX驅(qū)動來完成。

    之后EINIT硬件指令判斷Enclave加載過程是否可信,是否是一個可信啟動過程。

    uRTS維護Enclave、tRTS端構(gòu)建Enclave總結(jié)

    ?

    uRTS維護一個CEnclave類用來管理使用Enclave。

    如果開啟了調(diào)試模式,那么就對調(diào)試模式的相關(guān)功能進行初始化,比如VTune。

    uRTS請求裁剪敏感的或者動態(tài)的EPC頁。

    進入tRTS完成Enclave初始化相關(guān)的配套工作,比如ELRANGE的符號、地址重定位過程,比如字符串庫、加密庫的優(yōu)選過程,比如保留內(nèi)存、線程棧保護機制的初始化,比如初始化或調(diào)整線程棧、TCS等線程相關(guān)信息。此外還有就是對之前敏感或動態(tài)頁的裁剪申請進行批準(zhǔn)接受(調(diào)用EACCEPT硬件指令,Ring3權(quán)限的ENCLU硬件指令)。

    這里進出Enclave都是通過上下文切換的方式。

    收尾及Switchless模式初始化步驟總結(jié)

    將通過裁剪申請的裁剪頁重新放入到可用EPC頁中。

    mprotect設(shè)置ELRANGE中各個Section的訪問屬性以及各個Segment對應(yīng)的訪問屬性

    如果元數(shù)據(jù)版本較新,并且當(dāng)前環(huán)境支持EDMM,那么對PT_GNU_RELRO、PT_LOAD的Segment,用Ring0權(quán)限的EMODPR硬件指令來設(shè)置這些頁的訪問權(quán)限為RX,Ring0權(quán)限的EMODPR硬件指令會對管理EPC屬性的EPCM進行調(diào)整設(shè)置。rsrv內(nèi)存用EMODPR改為RW。不支持EDMM等情況,就不進行改動。

    針對上下文相關(guān)的內(nèi)存,內(nèi)存訪問控制屬性用mprotect設(shè)置為RW。rsrv內(nèi)存在不支持EDMM情況下,不要用mprotect改變它的屬性。

    針對EREMOVE掉的頁,需要用mprotect設(shè)置為PROT_NONE,不然這個頁一旦被訪問,會發(fā)生總線異常(sigbus exception),因為這個EPC頁已經(jīng)被EREMOVE硬件指令給從當(dāng)前Enclave中去除,EPCM也沒有再維護EREMOVE掉的頁的信息。

    上面所涉及到的ELRANGE的頁本身在ECREATE、EADD、EREMOVE時就設(shè)置或更改了基本的EPCM項,這里主要是進行調(diào)整,以及在進程虛擬地址空間用mprotect進行訪問控制設(shè)置。

    填充TCS最小池,使得TCS最小池現(xiàn)有的TCS數(shù)量達到最低要求。

    Switchless模式的初始化。

    Intel SGX ECALL

    ECALL Switch/Ordinary總結(jié)

    這種方式時SGX最初支持也是最直接的ECALL方式,切換上下文進入Enclave,但是這種切換上下文(EENTER【ENCLU.0x02】)的開銷非常大,幾千個Cycle,可以查看《Eleos: ExitLess OS services for SGX enclaves》,后來相關(guān)學(xué)者及Intel就推出了Switchless方案。

    這個總結(jié)主要講ECALL Switch/Ordinary

    線程想要執(zhí)行ECALL,那么就帶上ECALL索引值并申請一個TCS(TCS相當(dāng)于線程進入tRTS的許可證或者工作證),然后將uRTS的上下文保存到SSA中,通過EENTER硬件指令切換上下文進入tRTS,第一次進入tRTS時的上下文來自于一個預(yù)置的模板,并且進入到tRTS的enclave_entry地址,之后按照ECALL索引值查ECALL表得到ECALL的虛擬地址并執(zhí)行之。需要補充的是,剛進入tRTS時,線程需要確保線程棧保護機制開啟、線程數(shù)據(jù)已經(jīng)初始化過。

    如果進入Enclave是因為:進入到tRTS完成SGX初始化的部分工作;OCALL返回重新進入到Enclave內(nèi)部;進入tRTS動態(tài)構(gòu)建TCS;重新進入tRTS為了處理異常(《進入Enclave的目的歸類》)。那么就需要調(diào)用各自的處理函數(shù)來解決這些個特殊目的。

    對于OCALL返回重新進入到Enclave內(nèi)部,線程會使用之前OCALL時保存到tRTS的SSA進行上下文的恢復(fù)。對于AEX,是通過ERESUME硬件指令重新進入Enclave。

    《SGXv2.8起Enclave內(nèi)新增pthread庫》從linux-sgx v2.8開始,SGX支持在tRTS創(chuàng)建pthread線程,這個會要求在tRTS內(nèi)部開辟線程空間,然后OCALL到uRTS創(chuàng)建pthread線程并分配TCS給這個pthread線程。創(chuàng)建pthread線程者會重新回到tRTS中(OCALL返回),新創(chuàng)建的pthread線程會切換上下文進入到tRTS。

    ECALL Switchless總結(jié)

    SGX初始化末期的時候,根據(jù)用戶選擇,可以對ECALL Switchless進行初始化。此時主要完成的任務(wù)是uRTS端的ECALL Switchless初始化。(SGXv2.8調(diào)整后,tRTS端初始化Switchless的操作被放到了第一次Swtichless ECALL時執(zhí)行)

    內(nèi)容主要包括:

  • 構(gòu)建并初始化uRTS端的uSwitchless管理器、O/ECALL管理器、信號線管理器、工人線程管理器,初始化t/uWorker工人線程。
  • 工人線程自身進行初始化,然后休眠并等待Switchless ECALL任務(wù)。
  • 構(gòu)建一個喚醒線程。等到主線程需要喚醒所有工人線程的時候,就讓喚醒線程代為去喚醒所有工人線程
  • (SGXv2.8調(diào)整后,tRTS端初始化Switchless的操作被放到了第一次Swtichless ECALL時執(zhí)行)

    當(dāng)發(fā)生第一個Switchless ECALL時,主線程需要切換上下文進入Enclave,并在tRTS端對ECALL Switchless進行初始化,主要是為了讓tRTS內(nèi)部也保管一份uSwtichless管理器,并往tRTS內(nèi)部傳入OCALL表。然后喚醒所有工人線程,其中tWorker切換上下文進入tRTS,并且在tRTS初始化ECALL管理器、信號線和ECALL表,等待著信號置位并處理ECALL任務(wù)。

    調(diào)用ECALL Switchless者,會開始構(gòu)建ECALL任務(wù)并發(fā)送信號(將信號線某個空閑的Bit置位),此時ECALL任務(wù)的狀態(tài)從【SL_INIT】變成【SL_SUBMITTED】,然后將ECALL任務(wù)放到ECALL管理器開辟的任務(wù)池中,并循環(huán)等待tWorker線程接收【SL_ACCEPTED】及處理完【SL_DONE】ECALL任務(wù)。

    tWorker工人線程這邊,第一次進入Enclave時,會在tRTS端初始化ECALL管理器、信號線管理器和ECALL表。然后tWorker工人線程就循環(huán)等待信號置位。當(dāng)接收到信號時,它就將ECALL任務(wù)取出,并將ECALL任務(wù)狀態(tài)設(shè)置為【SL_ACCEPTED】。然后tWorker工人線程根據(jù)ECALL任務(wù)中的索引值查ECALL表并執(zhí)行對應(yīng)ECALL,執(zhí)行完后將ECALL任務(wù)狀態(tài)設(shè)置為【SL_DONE】。

    OCALL Switch/Ordinary總結(jié)

    這個OCALL Switch/Ordinary和ECALL Switch/Ordinary非常相像,就是方向反了。

    將tRTS的上下文保存到SSA,然后使用EEXIT【ENCLU.0x04】回到uRTS并從之前進入tRTS時保存的SSA中上下文信息來恢復(fù)uRTS的上下文。EEXIT【ENCLU.0x04】的返回點是當(dāng)時EENTER【ENCLU.0x02】的下一條指令。然后用OCALL索引值查OCALL表獲得OCALL的虛擬地址并執(zhí)行之。

    OCALL Switchless總結(jié)

    和ECALL Switchless和接近

    總結(jié)

    以上是生活随笔為你收集整理的小谈Intel SGX的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。