小谈Intel SGX
目錄
Intel SGX簡(jiǎn)介
背景
為什么要Intel SGX?
Intel SGX尚處于學(xué)術(shù)討論
Intel SGX和可信啟動(dòng)什么關(guān)系?
開發(fā)者眼中SGX長(zhǎng)什么樣子?
SGX訪問控制是什么?
MEE與SGX EPC內(nèi)存加密
CPU里面SGX長(zhǎng)什么樣子?
有Enclave的APP的虛擬地址空間長(zhǎng)什么樣?
SGX目錄、文件初體驗(yàn)
SGX和它的小伙伴
SGX應(yīng)用
第一種,SGX應(yīng)用于服務(wù)器端,云端
第二種,應(yīng)用于客戶端
第三點(diǎn),SGX應(yīng)用于分布式客戶端
SGX應(yīng)用的總結(jié)
SGX保護(hù)框架(SGX Shield Framework)
SGX軟件層改進(jìn)
SGX攻防
Intel SGX發(fā)展趨勢(shì)
SGX軟硬件棧
基本介紹
背景知識(shí)
SGX的可信保障及優(yōu)點(diǎn)
SGX的不足
SGX與TrustZone區(qū)別
SGX內(nèi)存布局及訪問控制
SGX軟硬件棧圖示
硬件
驅(qū)動(dòng)
不可信運(yùn)行
可信運(yùn)行時(shí)
應(yīng)用程序
Enclave程序
硬件指令
內(nèi)核權(quán)限硬件指令-ENCLS
用戶權(quán)限硬件指令-ENCLU
SGX初始化過程
EINIT指令過程
驅(qū)動(dòng)接口
SGX API
1. 可信運(yùn)行時(shí)庫(kù)函數(shù)
2. 不可信運(yùn)行時(shí)庫(kù)
3. SGX API應(yīng)用舉例——本地DH會(huì)話建立
SGX開發(fā)特點(diǎn)
橋函數(shù)總結(jié)
SGX參數(shù)及函數(shù)屬性
SGX Switch模式及Switchless模式
SGX初始化
基本介紹
環(huán)境檢查總結(jié)
uRTS端構(gòu)建Enclave總結(jié)
uRTS維護(hù)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簡(jiǎn)介
背景
為什么要Intel SGX?
Intel SGX的目標(biāo)就是為了解決目前日益受關(guān)注的“遠(yuǎn)程計(jì)算的安全問題”。
以云環(huán)境為例子,云租戶會(huì)將自己的產(chǎn)品部署在云平臺(tái)中,但是云平臺(tái)現(xiàn)在普遍認(rèn)為是一個(gè)不可信的地方,因?yàn)榭赡軙?huì)有云平臺(tái)管理者、同一云主機(jī)其他租戶的惡意攻擊,也可能云平臺(tái)本身存在漏洞,使得黑客輕易的攻擊并拿到Ring0權(quán)限(就好比我租了房東的一間臥室,我害怕房東、其他租戶、陌生人對(duì)我房間東張西望,甚至搞破壞。)。這種情況下,云租戶就開始擔(dān)心了。
與此同時(shí),Intel SGX出現(xiàn)了,它對(duì)自己做了一個(gè)安全內(nèi)存Enclave的概念,對(duì)安全內(nèi)存實(shí)施權(quán)限控制、加密等安全措施,防止別人(Ring0級(jí)別的攻擊者)非法對(duì)安全內(nèi)存內(nèi)的敏感數(shù)據(jù)代碼進(jìn)行機(jī)密性、完整性、真實(shí)性的破壞(Intel SGX對(duì)可用性并不保障),其中完整性主要通過可信建立Enclave保證,真實(shí)性通過由硬件背書的本地/遠(yuǎn)程認(rèn)證來(lái)確保。就好比我租了房東臥室后,我對(duì)自己臥室的墻進(jìn)行加固,并且對(duì)門加上自己的鎖(內(nèi)存訪問控制),甚至讓房間內(nèi)的東西也進(jìn)行上鎖(內(nèi)存加密),不讓人家偷窺、搞破壞。
除了云環(huán)境,Intel SGX旨在防所有Ring0級(jí)別的攻擊者(OS、VMM等),服務(wù)器中也可以對(duì)敏感部分就行加固。開發(fā)商下放版權(quán)也可以放到客戶端的SGX保證版權(quán)保護(hù)。此外還有對(duì)區(qū)塊鏈這種分布式客戶端的形式就行客戶端本地的SGX保護(hù)。
Intel SGX尚處于學(xué)術(shù)討論
Intel SGX在學(xué)術(shù)圈屬于非常熱門的一個(gè)點(diǎn),論文很多,這說明大家感覺Intel SGX的安全特性很有意義,也說明Intel SGX目前也有不少值得探討的問題存在。
由于Intel SGX會(huì)導(dǎo)致應(yīng)用開發(fā)方式的不同,使得Intel SGX很難真正用于實(shí)際生產(chǎn),這里主要指無(wú)法將原有的產(chǎn)品直接放到SGX中,這是第一點(diǎn)。第二點(diǎn),對(duì)于未來(lái)將開發(fā)的產(chǎn)品,由于產(chǎn)品往往依賴于某些庫(kù),但是實(shí)際中,這些庫(kù)并沒有人將它費(fèi)勁的搬到SGX中,導(dǎo)致SGX只有Intel維護(hù)的標(biāo)準(zhǔn)C/C++庫(kù)等,并沒有豐富的庫(kù),導(dǎo)致Enclave內(nèi)部開發(fā)起來(lái)也費(fèi)勁。此外,Enclave內(nèi)部目前應(yīng)該只支持C、C++的開發(fā),Python、Java這種個(gè)人感覺更適合上層開發(fā)的語(yǔ)言目前沒有支持。
上述說明SGX是個(gè)學(xué)術(shù)寵兒,但是實(shí)際應(yīng)用中,除非工業(yè)界非常感興趣,不然沒有那么多人力物力將不重要的產(chǎn)品搬到SGX中。所以就看產(chǎn)品是否敏感到非用SGX不可。
此外也有Graphene-SGX等能夠讓傳統(tǒng)APP不需要改代碼就能跑在SGX中,但是其會(huì)引入LibOS等相關(guān)內(nèi)容,使得Enclave內(nèi)部冗雜,TCB變大;并且效率受影響,SGX本身由于進(jìn)出Enclave刷新TLB等安全措施導(dǎo)致效率有損耗;兼容性值得考量,個(gè)人不是很了解LibOS,但是對(duì)LibOS能夠提供的兼容性值得考慮。
以我現(xiàn)在觀察發(fā)現(xiàn),基于Graphene-SGX等的產(chǎn)品數(shù)量貌似不如直接用SGX開發(fā)的多,(這個(gè)觀察不一定準(zhǔn)確),一方面是Graphene-SGX知名度不如SGX,一方面是Graphene-SGX出現(xiàn)時(shí)間也略晚,還有一方面就是Graphene-SGX某些特性上并不如直接從SGX開發(fā)來(lái)的高效,穩(wěn)定。
Intel SGX的好伙伴——ARM上的TrustZone,我們似乎也沒有觀察到TrustZone也有很普遍的應(yīng)用,一般還是敏感到需要用到了才不得不用。(觀察不一定準(zhǔn)確)或許未來(lái)又是另一番場(chǎng)景,我便不得而知了,但是可以肯定的是SGX想要廣泛應(yīng)用,必須要SGX支持足夠的中間件、庫(kù),能讓上層便捷的開發(fā)。
Intel SGX還有一點(diǎn)比較要命的就是,它對(duì)性能會(huì)帶來(lái)一定程度的影響,出入Enclave會(huì)有3k+ Cycle,而系統(tǒng)調(diào)用也就0.2k+Cycle,另一個(gè)由于EPC容量有限,目前最大只支持256M,EPC的Swap相對(duì)會(huì)比較頻繁,并且會(huì)引起40K+Cycle。
希望有一天,若為安全故,兩者皆可拋?畢竟解決遠(yuǎn)程計(jì)算安全問題的需求還是很大的。
Intel SGX和可信啟動(dòng)什么關(guān)系?
在SGX之前,可信計(jì)算中可信啟動(dòng)其實(shí)挺火,主要是說從底層Bootloader->BIOS->OS/VMM->APP的一步步遞進(jìn)的可信度量和啟動(dòng)。但是這種模式局限程度高,而且也有人說這限定了就幾個(gè)大廠的產(chǎn)品滿足可信啟動(dòng)的條件,相當(dāng)于某種壟斷。而且這種效率其實(shí)也有影響,且TCB大。
SGX主要還是CPU硬件里面強(qiáng)制將某塊內(nèi)存定義為安全內(nèi)存,并施加硬件級(jí)別的訪問控制等,這樣的話,就不要求整個(gè)主機(jī)都是可信的,只要SGX所管理的Enclave安全內(nèi)存是可信就行(包括Enclave代碼的可信度量和建立)。
開發(fā)者眼中SGX長(zhǎng)什么樣子?
下面這個(gè)是畫的舊圖。
簡(jiǎn)單來(lái)說SGX就是提供了一個(gè)安全內(nèi)存及其相關(guān)。下面稍微講一下SGX軟件棧結(jié)構(gòu)(具體見《SGX軟件棧》文檔)
總的來(lái)說,SGX是劃分兩個(gè)世界的——可信世界和不可信世界。每一個(gè)世界中,想要使用SGX的開發(fā)都需要開發(fā)哪一個(gè)世界的代碼,一般來(lái)說,不可信世界開發(fā)非敏感代碼(稱為APP,另一種理解就是APP也包含Enclave,這樣為了區(qū)分,就把不可信的叫做APP),可信世界開發(fā)敏感代碼(Enclave),或者說敏感代碼移入了可信世界。
既然有了兩個(gè)世界,他們之間的連接就需要有一個(gè)叫做橋函數(shù)的東西,ECALL橋能讓APP可以調(diào)用橋函數(shù)間接調(diào)用Enclave中寫好的API函數(shù)。反向的有個(gè)叫OCALL橋的東西。橋函數(shù)上承載著兩個(gè)世界間傳遞的參數(shù),而且ECALL中,Enclave并不信任APP傳給Enclave的ECALL參數(shù),所以需要參數(shù)的消毒檢查。OCALL有點(diǎn)類似。
既然要開發(fā)程序,就要用到SDK(我這里是把可信Enclave使用的SDK稱為SDK,這也符合Intel的叫法,另一種理解是SDK包括給不可信APP使用的PSW、給可信Enclave使用的SDK、橋函數(shù))和PSW,這兩個(gè)都是Intel提供的(linux下見github.com/intel/linux-sgx)。由于Enclave要保證自己內(nèi)部開發(fā)的函數(shù)盡可能不會(huì)離開Enclave,所以Enclave內(nèi)部用的SDK都是用靜態(tài)庫(kù)鏈接,除非萬(wàn)不得已,比如系統(tǒng)調(diào)用等,那么就得同OCALL橋到不可信世界完成任務(wù)。然后頂多是啟發(fā)式的對(duì)OCALL返回值進(jìn)行檢查(而且目前Intel并無(wú)消毒檢查,除非Enclave開發(fā)者自己做檢查)。
PSW、SDK一部分功能是用于我們傳統(tǒng)的那種為了具有某個(gè)功能而開發(fā)的函數(shù),還有一部分是對(duì)CPU提供的SGX功能指令的包裝,主要用于SGX特性的支持,為了讓你真正和CPU溝通,并獲得SGX特性支持。SGX特性是通過CPU向外面提供Ring0指令和Ring3指令,其中Ring0指令ENCLS主要有一些比如創(chuàng)建Enclave這種生命周期管理、頁(yè)權(quán)限管理的指令。Ring3指令ENCLU主要是讓控制流能夠在兩個(gè)世界之間流動(dòng),比如進(jìn)出Enclave這種。
這一塊的細(xì)節(jié)可以看《SGX軟件棧》。
SGX訪問控制是什么?
SGX訪問控制是說對(duì)Enclave安全內(nèi)存進(jìn)行訪問控制,不能讓攻擊者非法訪問敏感內(nèi)存。這主要還是通過CPU內(nèi)部實(shí)現(xiàn)的。有SGX特性CPU能夠讓不可信APP只有滿足進(jìn)入它的Enclave的條件時(shí)才能放行,而且Enclave A和Enclave B之間是互相不可訪問的。這種邏輯是CPU里面的EPCM和內(nèi)存RAM中被CPU定義為EPC里面的SECS結(jié)構(gòu)體、TCS結(jié)構(gòu)體這些單元連動(dòng)完成的。
《SGX技術(shù)的分析和研究》有介紹具體有哪幾則訪問控制。
MEE與SGX EPC內(nèi)存加密
EPC,Enclave Page Cache,是被加密的安全內(nèi)存頁(yè),由MEE加密。
MEE是Memory Encrypt Engine,內(nèi)存加密引擎,會(huì)對(duì)從CPU緩存、寄存器之類的地方往其他如內(nèi)存(比如EPC)、硬盤運(yùn)輸之前都加密,因此在內(nèi)存、硬盤的敏感數(shù)據(jù)都是加密的。
這種好處就是能夠抗總線攻擊,防止攻擊者直接物理連接總線竊取敏感數(shù)據(jù)。劣勢(shì),就是或多或少會(huì)有加密導(dǎo)致效率的影響,雖然說MEE已經(jīng)是一個(gè)專門的用來(lái)加密的模塊。
CPU里面SGX長(zhǎng)什么樣子?
這張圖主要是講SGX初始化過程的,也可以拿來(lái)講解CPU里面多了哪些部件。下面中間RAM這個(gè)是內(nèi)存,內(nèi)存里面一部分EPC就是存放Enclave的安全內(nèi)存池,里面有多個(gè)安全內(nèi)存頁(yè),每個(gè)Enclave按需從這里拿取Enclave安全內(nèi)存頁(yè)。
最左下角EPCM(Enclave Page Cache Map)是一個(gè)安全內(nèi)存管控的內(nèi)置微架構(gòu)結(jié)構(gòu)體(internal micro-architecture structure ),會(huì)由PMH硬件模塊進(jìn)行查EPCM,進(jìn)行訪問控制。PMH和EPCM主管對(duì)EPC的訪問控制,會(huì)依賴SECS、TCS聯(lián)動(dòng)判斷。
圖片右下角就是CPU及其MMU、MEE部件,MMU是傳統(tǒng)的地址翻譯部件,MEE是說SGX能夠做到在EPC中的敏感數(shù)據(jù)能夠明文存在(因?yàn)橛性L問控制,不擔(dān)心被偷窺),但是EPC中的數(shù)據(jù)一旦會(huì)轉(zhuǎn)到普通硬盤中的(由于EPC大小一般是256M,因此會(huì)出現(xiàn)換入換出到硬盤的情況),那么MEE就加密那個(gè)明文,只讓密文存在于硬盤中。其實(shí)MEE不單單是對(duì)換入換出到硬盤就行加密,它對(duì)任何離開CPU安全邊界的明文都進(jìn)行加密。
最左上角是Enclave代碼,這里代表的意思是Enclave代碼已經(jīng)放到了EPC中,然后圖片上講原來(lái)在RAM的EPC中的Enclave,單獨(dú)畫出到外面來(lái),它本質(zhì)是存在于EPC中的。
上面這個(gè)APP和Enclave代碼是一個(gè)二進(jìn)制文件,最終會(huì)被加載到內(nèi)存的普通內(nèi)存(APP部分代碼)和安全內(nèi)存中(Enclave部分代碼)。
中間OS是在Enclave啟動(dòng)過程中(從無(wú)到有),完成對(duì)安全內(nèi)存頁(yè)申請(qǐng),代碼復(fù)制進(jìn)安全內(nèi)存頁(yè)等一系列操作的管理(《SGX軟件棧》文檔中有專門講這個(gè))。我之前說了OS是不可信的,所以通過OS啟動(dòng)Enclave會(huì)需要一些額外的措施:Architectural Enclave這個(gè)特殊的Enclave(由Intel簽名并啟動(dòng)起來(lái)的Enclave)會(huì)對(duì)Enclave的完整性進(jìn)行簽名保證,Enclave被OS啟動(dòng)過程中,相應(yīng)的啟動(dòng)過程的度量會(huì)放在EPC的SECS中,最后會(huì)對(duì)AE簽名的那個(gè)度量值比對(duì),為了防止OS對(duì)Enclave啟動(dòng)過程中做小動(dòng)作。
總結(jié)一下,CPU本身擴(kuò)充了很多硬件指令,可以分為兩大類ENCLS、ENCLU。上圖可以看到CPU所增加的硬件部件,有MEE、PMH(查EPCM)、Intel ME(粗粗了解到它提供可信輸入和可信時(shí)間)(其他暫且沒想到,似乎還有)。
SGX初始化過程大概就是建立時(shí)候申請(qǐng)安全內(nèi)存頁(yè),然后將Enclave代碼放進(jìn)去,并且度量建立過程是否可靠。(細(xì)節(jié)見《SGX軟件棧》)
有Enclave的APP的虛擬地址空間長(zhǎng)什么樣?
APP依然還是那個(gè)APP,有著常見的虛擬地址空間(比如4G,32位地址下),然后其中有一整塊,比如0X700-0X800(通過觀察一般都是高地址,這里只是隨便寫了)是給Enclave的,因?yàn)镋nclave是一個(gè).so動(dòng)態(tài)庫(kù)鏈接給APP的,Enclave虛擬地址的起始地址依賴于ALSR地址空間隨機(jī)化給定。
那我們假設(shè)訪問某個(gè)Enclave函數(shù)時(shí),我們用的這個(gè)函數(shù)的虛擬地址(和正常虛擬地址空間里面調(diào)用函數(shù)一樣),然后會(huì)經(jīng)過MMU的虛實(shí)地址轉(zhuǎn)換,變成物理地址,這個(gè)物理地址會(huì)指向EPC,前面講了EPC是RAM中的一部分(而且是靠前的一部分,存在于PRM中,由BIOS和范圍寄存器來(lái)決定EPC的大小),所以EPC也是有物理地址的,這也很正常。物理地址拿到后,想要訪問EPC物理頁(yè),那么請(qǐng)先經(jīng)過EPCM的訪問控制檢查。如果通過了,那么IP寄存器就會(huì)給到那個(gè)Enclave函數(shù)了。
SGX目錄、文件初體驗(yàn)
?
和傳統(tǒng)應(yīng)用開發(fā)不同,上圖可以看到APP、Enclave是分開編寫的。命名倒是無(wú)所謂,具體會(huì)通過Makefile里面說明把哪些編程Enclave。
?
此外,通過這個(gè)EDL文件可以清楚的看到光是進(jìn)出Enclave的接口就分開了。一部分trusted括起來(lái)的是ECALL用來(lái)進(jìn)入Enclave,untrusted括起來(lái)的是OCALL,用來(lái)離開Enclave。
SGX和它的小伙伴
要知道可信執(zhí)行環(huán)境不止Intel SGX一家,所以很多思想可能值得借鑒的地方,并且,應(yīng)該是能夠以可信執(zhí)行環(huán)境一個(gè)更高的高度來(lái)看待這些應(yīng)用攻防的問題。
硬件比如還有TrustZone、RISC-V KeyStone、AMD SEV、RISC-V 蓬萊TEE。軟件有Virtual Ghost、SP3、Overshadow、InkTag、CHAOS、AppShield(這個(gè)不一定準(zhǔn)確),他們都或多或少有類似Enclave的可信執(zhí)行環(huán)境的概念。
SHIELDING SOFTWARE FROM PRIVILEGED SIDE-CHANNEL ATTACKS(SEC’18)這篇是關(guān)于Virtual Ghost的工作。它做了兩個(gè)工作。第一,針對(duì)已有的頁(yè)表側(cè)信道,它的做法是將頁(yè)表機(jī)制由Virtual Ghost內(nèi)部來(lái)完成,OS所保管的Direct Map中對(duì)于Virtual Ghost內(nèi)部安全有用戶空間的映射被刪除。第二,針對(duì)LLC側(cè)信道,利用Intel Cache Allocation Technology,從硬件層面對(duì)LLC實(shí)施隔離,不讓OS窺探Virtual Ghost內(nèi)部的存放于LLC中隱私。Intel CAT技術(shù)是Intel RDT的子模塊,我目前感覺和SGX一樣是向用戶態(tài)提供Ring3指令用于CPU特性管理(可能存在錯(cuò)誤)。
接下來(lái)我們講講現(xiàn)在有哪些SGX的研究了。分類方法主要依賴于CCS’17中,關(guān)于SGX的三篇綜述
SGX應(yīng)用
第一種,SGX應(yīng)用于服務(wù)器端,云端
這一類個(gè)人覺得很需要結(jié)合代碼、它們所描述的行業(yè)需求和以前的行業(yè)產(chǎn)品去考慮問題,畢竟是應(yīng)用,不然可能體會(huì)不到精髓。
我對(duì)SGX應(yīng)用的理解也停留在表層,就是他們拿SGX大概做了個(gè)啥,但是有些細(xì)節(jié),我目前也說不太上來(lái)。
?DelegaTEE(SEC’18)?Sini?a Mateti? (ETH Zurich)下一篇也是他?
?
以前Alice(Owner)想將自己部分Paypal中的資產(chǎn)給Bob(Delegatee),需要將賬戶密碼交給對(duì)方,這很不安全。(我們不考慮錢能直接通過轉(zhuǎn)賬,因?yàn)橛械馁Y產(chǎn)并不像轉(zhuǎn)賬那樣可以簡(jiǎn)單實(shí)現(xiàn),那樣單純是金額的加減。我們討論的是一大類授權(quán)的問題)。
那么現(xiàn)在用上一個(gè)憑證和對(duì)憑證以及用戶身份信息驗(yàn)證的一個(gè)服務(wù)器Brokered System。Brokered System能夠根據(jù)Alice具體將多少資產(chǎn)以怎么樣的形式分享給Bob這件事生成憑證,并且憑證一方面分享給Bob,另一方面儲(chǔ)存在服務(wù)器中,Bob登錄服務(wù)器后,證明自己是Bob,并且把憑證給服務(wù)器一看,服務(wù)器覺得OK并且Bob想用掉這筆資產(chǎn)的時(shí)候,服務(wù)器就讓Paypal去完成比如支付Money的操作,可以看到驗(yàn)證的事情被放到了Brokered System服務(wù)器上面去做,Paypal直接和Brokered System合作,而不再和用戶直接接觸。帶來(lái)的好處是什么呢?是Paypal和Bob、Alice之前不需要互相信任,再無(wú)瓜葛,只需要信任Brokered System即可。這里可能看起來(lái)是一個(gè)妖異的設(shè)定:我的理解是因?yàn)楸緛?lái)Paypal沒有這個(gè)功能,Brokered System作為第三方模塊來(lái)實(shí)現(xiàn)這個(gè)功能,想盡辦法完成這種類似可信紅娘的牽線工作。
那么我們似乎還沒說到SGX。我們可以看到這時(shí)Brokered System中憑證的存儲(chǔ)、驗(yàn)證、使用非常敏感,同時(shí)Alice和Bob的個(gè)人信息也需要被嚴(yán)格保護(hù),作者就想到使用SGX來(lái)對(duì)這個(gè)服務(wù)器來(lái)進(jìn)行保護(hù)。所以這里應(yīng)該來(lái)說時(shí)SGX在服務(wù)器端的簡(jiǎn)單嘗試,更多的是授權(quán)的內(nèi)容,但是授權(quán)的方式已經(jīng)就有類似的(Kerberos系統(tǒng)也是授予ticket,和使用ticket的模式),所以它討論的亮點(diǎn)還是SGX的應(yīng)用,難度可能在于SGX的開發(fā)并且做成一個(gè)實(shí)際產(chǎn)品。
這篇論文通過視頻看的,可能理解不到位,有錯(cuò)誤歡迎反饋。
?BITE(SEC’19)?Sini?a Mateti? (ETH Zurich)?
?
區(qū)塊鏈中,我們知道手機(jī)等資源有限設(shè)備是不可能承載一個(gè)區(qū)塊鏈的完全節(jié)點(diǎn),所以手機(jī)上一般都是輕節(jié)點(diǎn),并且輕節(jié)點(diǎn)是根據(jù)需求向完全節(jié)點(diǎn)申請(qǐng)當(dāng)前涉及的區(qū)塊等信息。但是Light Node向Full Node請(qǐng)求地址對(duì)應(yīng)內(nèi)容時(shí),Full Node勢(shì)必要知道你所請(qǐng)求的啥,導(dǎo)致信息泄露。之前有個(gè)Bloom Filter試圖通過一個(gè)類似哈希表(或者是個(gè)承載多個(gè)對(duì)等數(shù)據(jù)單元的數(shù)據(jù)結(jié)構(gòu))并且模糊化訪問這個(gè)數(shù)據(jù)結(jié)構(gòu)的過程來(lái)解決這個(gè)信息泄露的問題,但是作者說共享Bloom Filter依然會(huì)導(dǎo)致信息泄露(Bloom Filter這一塊我只是大概聽說過,不了解)。
那么有了SGX這個(gè)東西,作者就利用SGX內(nèi)部部署Full Node端用來(lái)接收Address請(qǐng)求的模塊,這樣部署在服務(wù)器上也不用擔(dān)心Ring0攻擊者的迫害了。所以本質(zhì)也是SGX對(duì)原有產(chǎn)品的改進(jìn)。此外有一些細(xì)節(jié)是說:通過Scan Window或者ORAM來(lái)返回結(jié)果值,為了保證SGX執(zhí)行中的側(cè)信道問題。ORAM已經(jīng)有挺多論文用來(lái)防止訪存?zhèn)刃诺绬栴},后面也會(huì)提到(【寫到后面時(shí)把名字貼上來(lái)】)。現(xiàn)實(shí)中,走路時(shí)拐七繞八的方式讓陌生人不知道我們具體要去哪里。你可能說,陌生人會(huì)看到我們最終進(jìn)入哪個(gè)建筑,那么如果說有那么一個(gè)傳送門,進(jìn)的看起來(lái)是A建筑,實(shí)際傳送到了B建筑,(這是通過查表轉(zhuǎn)換實(shí)現(xiàn)),那么陌生人就只能犯糊涂了。這里需要知道的就是說ORAM可以通過類似上述方式讓攻擊者無(wú)法得知受害者的訪存情況。
(可以看到目前SGX應(yīng)用在某些知名產(chǎn)品上,對(duì)原有模塊的替換或改進(jìn),會(huì)受到大家很大的關(guān)注。)
EnclaveDB(S&P’18)微軟和倫敦帝國(guó)學(xué)院合作的
?
數(shù)據(jù)庫(kù)DB可以說是大部分產(chǎn)品都要依賴的東西,計(jì)算機(jī)世界基礎(chǔ)中的基礎(chǔ)。但是現(xiàn)在服務(wù)器里面大家都考慮Ring0攻擊者的威脅了,那么DB里面的資料可不能讓Ring0攻擊者偷取,因?yàn)槿藗儗?duì)于敏感信息的保密要求是越來(lái)越高。以前有通過加密方式的DB,加密的方式效率低,這個(gè)可想而知,加密算法固有的缺陷。
那么服務(wù)器有了SGX,我們就干脆將部分敏感的數(shù)據(jù)庫(kù)放入Enclave,通過SGX而不是加密方式來(lái)保證安全,同時(shí)通過完善的日志記錄模式和事務(wù)備份恢復(fù)來(lái)保證完整性。上圖藍(lán)色是可信的部分,客戶端默認(rèn)是可信的,一般用戶自己不會(huì)坑自己,這里不考慮自己電腦被攻擊了,只考慮服務(wù)端有Ring0攻擊。第一步,我們?cè)谟疑辖堑臇|西比如可信DB、預(yù)編譯的Stored Procs會(huì)被通過簽名加密等安全措施,被部署到服務(wù)器端的Enclave。第二步,其他客戶端申請(qǐng)查詢請(qǐng)求時(shí)候,通過自己的Client庫(kù)通過左邊Host Process間接和Enclave搭上勾并進(jìn)行真正的查詢操作。
這一篇從視頻上來(lái)看,它告訴我們SGX應(yīng)用要考慮部署和使用兩件事。
小結(jié)
上圖是CCS’17上一位大佬講的SGX服務(wù)端應(yīng)用的論文列表(部分文章其實(shí)也可以歸于SGX Shield Framework類,后面單獨(dú)拎出來(lái)),和我隨機(jī)看的那幾篇有交集。但是我有一個(gè)明確的感受就是,想要做SGX應(yīng)用,得有原來(lái)那種產(chǎn)品的很清楚的了解,我光看視頻沒法深入理解SGX應(yīng)用的真正意義。以后若有需求會(huì)去看論文或者相關(guān)的代碼框架。
不過總的來(lái)說,SGX應(yīng)用是真正體現(xiàn)SGX價(jià)值的地方,現(xiàn)階段的SGX應(yīng)用可能思路上簡(jiǎn)單(實(shí)現(xiàn)可能也復(fù)雜),但是這將代表SGX這項(xiàng)技術(shù)是有意義的。并且服務(wù)端的SGX應(yīng)用你需要考慮SGX應(yīng)用部署和使用兩件事。
另外值得一題的是,我們多多少少可以看出SGX是同態(tài)加密的一個(gè)好的替換品。同態(tài)加密是通過密碼學(xué)的方法讓你無(wú)法感知(秘密+秘密=秘密)這個(gè)過程,而SGX就是在保險(xiǎn)箱里面完成(秘密明文+秘密明文=秘密明文)的工作,明文算起來(lái)就很快。
第二種,應(yīng)用于客戶端
這一塊的內(nèi)容相對(duì)少一些,目前大家所能想到的就是比如游戲開發(fā)商在下放游戲許可證等版權(quán)信息的時(shí)候,那么就用SGX內(nèi)部來(lái)保存版權(quán)信息,你想玩游戲,得通過SGX內(nèi)部版權(quán)信息的驗(yàn)證。但是我覺得這一點(diǎn)上,可能對(duì)于很強(qiáng)的逆向工程高手來(lái)說,可能無(wú)意義,因?yàn)槟嫦蚬こ棠嫦虻氖谴a,SGX內(nèi)部的敏感數(shù)據(jù)顯得不重要了。除非游戲里面的部分關(guān)鍵代碼也在SGX里面(個(gè)人猜測(cè),正常情況下,Enclave代碼是公開可見的,SGX保護(hù)的是代碼完整性,SGX保護(hù)的機(jī)密性是隱私數(shù)據(jù)的機(jī)密性,不過也有論文是能夠?qū)nclave代碼秘密地加載到SGX中),那么逆向工程會(huì)變得極其困難。
這張圖大概展示了客戶端SGX應(yīng)用的大概樣子,主要我個(gè)人對(duì)OTP不懂,所以不太好闡述,但是我們可以看到這個(gè)框架就是客戶端SGX和開發(fā)商之間有安全授權(quán)、配置的過程,那么Enclave可以看作開發(fā)商的飛地了(可以聯(lián)想領(lǐng)事館這個(gè)概念)
第三點(diǎn),SGX應(yīng)用于分布式客戶端
這類的論文和工作也不多,主要可能大家想法有限。我自己有一個(gè)想法就是分布式SGX客戶端下,我們可以將服務(wù)端的某些貼近客戶端的部分功能(或者全部功能)給移到客戶端來(lái)降低服務(wù)端的攻擊范圍和單點(diǎn)失效問題。有一點(diǎn)像客戶端冗余來(lái)彌補(bǔ)服務(wù)端單點(diǎn)的種種問題。
分布式SGX可能的應(yīng)用模式
有了SGX,我們可以將中心化任務(wù)做成分布式,而不用擔(dān)心分布式客戶端上的用戶會(huì)故意不按照預(yù)期流程執(zhí)行,因?yàn)镾GX已經(jīng)不能被Ring0攻擊了。這有點(diǎn)像我有個(gè)公司,我把我們公司的會(huì)計(jì)、法務(wù)都給派到了顧客家里,而且這會(huì)計(jì)和法務(wù)是絕對(duì)忠誠(chéng)的。
以前也有分布式相關(guān)的工作,但是方式都通過加密、冗余備份來(lái)實(shí)現(xiàn)可靠性。而我們通過SGX先天提供可信執(zhí)行環(huán)境,那么就不再需要加密、冗余備份的操作,而且將流程化簡(jiǎn),功能性和擴(kuò)展性也可以很好的提升。因此又體現(xiàn)了:SGX是加密方案的高效替代品。
中心化任務(wù)分布式程度理論上是可以調(diào)節(jié)的,就是具體有多少模塊貼近客戶端。借此我們可以可以根據(jù)分布式SGX的計(jì)算資源和存儲(chǔ)資源的多少來(lái)進(jìn)行一個(gè)具體的中心化任務(wù)分布式程度的界定。
其實(shí)上述這種抗Ring0攻擊的Enclave其實(shí)不單單只有SGX可以做到,還有其他SGX的小伙伴也能。有一篇【SecTEE】講的是Trust Zone下提供Enclave的概念,它里面說只要提供隔離機(jī)制的CPU均有望實(shí)現(xiàn)Enclave。
上面大概講了下SGX分布式應(yīng)用的一種可能模式,那么具體的可能可以用于分布式存儲(chǔ)、分布式計(jì)算、分布式授權(quán)。
有一個(gè)功能這里也值得一提,【VC3、SGX-Shield】能夠做到Enclave代碼隱蔽載入Enclave內(nèi)存(通過遠(yuǎn)程載入具體代碼),或者我想有可能本地Enclave代碼加殼也能夠做到Enclave代碼保密的效果【目前可能尚未實(shí)現(xiàn)】(但是一般來(lái)說代碼加殼可以抗靜態(tài)分析,能否抗動(dòng)態(tài)分析尚不清楚,而且可能有賴于具體實(shí)現(xiàn))。對(duì)此我想利用的點(diǎn)是說,可以將Enclave代碼對(duì)分布式客戶端隱藏,就是悄悄地帶入分布式客戶端的SGX內(nèi),避免不必要的Enclave代碼公開。
現(xiàn)在,我們?cè)倏紤]分布式客戶端會(huì)有Enclave被開、關(guān)、重啟的情況,為了保證Enclave內(nèi)數(shù)據(jù)在不同時(shí)間段依然一致且有效,可以通過密封操作來(lái)保證狀態(tài)連續(xù)性。目前密封操作有回滾攻擊的危險(xiǎn)。對(duì)此,密封操作的抗回滾方案有【SGX Monotone Counter、ROTE……】。
單獨(dú)考慮分布式授權(quán)案例,將授權(quán)和驗(yàn)證的功能(相當(dāng)于公司工作人員)派到客戶端。為了防止分布式SGX某個(gè)節(jié)點(diǎn)被攻陷然后對(duì)全局產(chǎn)生危害,那就依然可以采用中心化+分布式相結(jié)合的方案,也就是說有多少功能下放到分布式SGX的程度進(jìn)行考量(比如分布式SGX節(jié)點(diǎn)只被賦予有限的權(quán)限,但也能很大程度滿足正常驗(yàn)證需求,使得攻擊者攻破分布式SGX節(jié)所能獲得的權(quán)力有限)。
最后,審計(jì)的需求、日志的維護(hù)可以參考【EnclaveDB、ROTE】的做法。此外,日志管理細(xì)節(jié)上可以做冗余備份,然后借鑒Counter【SGX Monotone Counter、ROTE……】實(shí)現(xiàn)一致性維護(hù)。
SGX應(yīng)用的總結(jié)
現(xiàn)在SGX漸漸應(yīng)用于傳統(tǒng)模塊的替換,然后提下SGX價(jià)值,目前的工作應(yīng)該說不多。不過也恰恰體現(xiàn)了SGX的潛力,然后未來(lái)還有很多SGX的工作可以做。
(其實(shí)SGX應(yīng)用也包括,SGX保護(hù)框架,SGX軟件層改進(jìn),單獨(dú)拎出來(lái))
SGX保護(hù)框架(SGX Shield Framework)
Haven(OSDI’14)?微軟
SGX已經(jīng)硬件實(shí)現(xiàn)了,但是,很多老的APP并沒有用上SGX。并且SGX的代碼開發(fā)和原來(lái)不太一樣了,得把代碼劃分成Enclave內(nèi)外兩個(gè)部分。那么意味著老的APP很難用上SGX了,因?yàn)椴皇撬腥硕荚敢饣獍言瓉?lái)的APP移到SGX上。那么怎么把老的APP放到SGX上呢?微軟提供了Haven方案。
?
?
Haven架構(gòu)如圖:Enclave(APP->LibOS->Shield模塊)->uRTS->OS的棧結(jié)構(gòu)(LibOS在這里的作用相當(dāng)于自己租的臥室內(nèi)搭建一個(gè)小廚房等設(shè)施,盡可能的不與外界打交道,盡可能不用外面的大廚房)。這樣子,整個(gè)APP都是Enclave內(nèi)部的,APP和LibOS打交道就行,LibOS或者直接滿足APP的需求,或者向外讓Host OS完成具體需求。總之APP就不用改代碼了。
如上所說,Enclave仍然會(huì)有小部分的比如系統(tǒng)調(diào)用需要與外界接觸(好比小廚房的電、氣還是得走總的房子的電、氣)。此外,SGX還有一些細(xì)節(jié)限制:EPC大小有限(比如256M),頁(yè)錯(cuò)誤等異常仍然由外界OS來(lái)處理,還有很多硬件指令Enclave內(nèi)不能調(diào)用……。
上述這種有Enclave與外界接觸的情況,就有被攻擊的風(fēng)險(xiǎn),只要SGX與外部有啥共享的機(jī)制,就可能被攻擊,SGX側(cè)信道很多就是基于共享機(jī)制(后面會(huì)講)。
LibOS和庫(kù)直接塞入SGX會(huì)導(dǎo)致TCB過大的問題,小結(jié)處會(huì)討論Haven和他的小伙伴們,進(jìn)行一個(gè)橫向?qū)Ρ取?/p>
SCONE(OSDI’16)
?
SCONE的初衷應(yīng)該就是想讓容器能夠由SGX進(jìn)行安全加固。同時(shí)最好就是容器可以直接在Enclave中跑,不需要修改,因此它提出如上圖架構(gòu)。
它發(fā)現(xiàn)其實(shí)并不需要整個(gè)LibOS都移進(jìn)來(lái)也能完成對(duì)容器的支撐,因此將LibOS概念移除,移除了包含網(wǎng)絡(luò)和文件Shield層、多線程(不支持多進(jìn)程)、MUSL等。
另外它還實(shí)現(xiàn)了一套異步系統(tǒng)調(diào)用的機(jī)制(可能是處于安全考慮?目前尚不清楚)。
可以看到SCONE的架構(gòu)和Haven就有一些區(qū)別了,SCONE的TCB相對(duì)Haven更小(Haven的LibOS代碼、庫(kù)的代碼量很大),同時(shí)效率也得到了提升。不過SCONE架構(gòu)中,Enclave與外界的接口更多了,因?yàn)镾CONE里面刪除了很多東西,意味著這些東西都得找HostOS提供。
Ryoan(OSDI’16)
作者認(rèn)為SGX原來(lái)的機(jī)制主要是為了保護(hù)Enclave免受Enclave外部的攻擊,但是Enclave本身可能有意或無(wú)意的將Enclave內(nèi)的信息泄露給Enclave外部(偏主動(dòng)式的)。于是作者在Enclave內(nèi)放置一個(gè)沙箱來(lái)執(zhí)行代碼(比如與外界的輸入輸出(包括內(nèi)存拷貝等)進(jìn)行加密或管控、系統(tǒng)調(diào)用的管控、檢查點(diǎn)),在SGX基礎(chǔ)上增強(qiáng)安全性,并且還能防御部分軟件側(cè)信道。
Panoply(NDSS’17)
?
為了讓傳統(tǒng)程序能夠不改代碼的移植到Enclave中,Haven、Graphene-SGX中將LibOS移入Enclave,并仿真地提供系統(tǒng)調(diào)用、線程、事件處理、Forking等功能(最終會(huì)轉(zhuǎn)換到Host OS的系統(tǒng)調(diào)用),但是也會(huì)導(dǎo)致TCB太大(主要是庫(kù)比較大),效率低等。SCONE、Ryoan使用容器、沙箱來(lái)向上支撐傳統(tǒng)程序,但是如Fork/Exec等功能無(wú)法仿真(因?yàn)楸旧聿⒉皇窍馠aven那樣整個(gè)LibOS都搬進(jìn)SGX),這種選擇一般來(lái)說TCB很小(主要是庫(kù)不在Enclave內(nèi)),效率個(gè)人猜測(cè)會(huì)高于Haven這種。
Panoply另辟蹊徑,或者說上述兩種綜合一下,將Libssl等庫(kù)(Haven中將其放在Enclave中)專門用一個(gè)Enclave來(lái)執(zhí)行,目的是為了實(shí)現(xiàn)復(fù)用(不需要每個(gè)Enclave保留一份,降低TCB),然后想要調(diào)庫(kù),就向庫(kù)Enclave發(fā)出申請(qǐng),庫(kù)Enclave返回結(jié)果。可以放心的是Enclave間的調(diào)用(通信)走的是加密信道,同時(shí)彼此實(shí)現(xiàn)相互認(rèn)證。
另一個(gè)點(diǎn)和SCONE還是有點(diǎn)像,就是Enclave留一個(gè)Shim來(lái)執(zhí)行系統(tǒng)調(diào)用來(lái)實(shí)現(xiàn)各種豐富的功能,具體實(shí)現(xiàn)放到不可信的Host OS中。
Panoply這種庫(kù)Enclave的想法一定程度實(shí)現(xiàn)代碼復(fù)用,降低TCB,不過應(yīng)該會(huì)導(dǎo)致面向HostOS的接口變多,Haven中Enclave與HostOS的接口只有20+。
總之,Haven、Panoply都能幫助傳統(tǒng)程序不改代碼移植,間接提供系統(tǒng)調(diào)用、線程等功能,區(qū)別在于Haven通過LibOS實(shí)現(xiàn)了很多OS功能,Panoply留了個(gè)接口給Enclave,讓有些功能由HostOS來(lái)做。Panoply庫(kù)Enclave的概念挺新穎,用來(lái)實(shí)現(xiàn)代碼復(fù)用。
?
Panoply的庫(kù)Enclave思想其實(shí)和RPC有點(diǎn)接近。
Graphene-SGX(ATC’17)
?
個(gè)人覺得這個(gè)和Haven類似,或者說Haven架構(gòu)的Linux下實(shí)現(xiàn),Haven是Win下的實(shí)現(xiàn)。Haven應(yīng)該是20個(gè)固定系統(tǒng)調(diào)用,Graphene-SGX是28個(gè)固定系統(tǒng)調(diào)用(18個(gè)系統(tǒng)調(diào)用會(huì)有檢查)。除了向上支持Linux傳統(tǒng)軟件,后來(lái)還能夠支持容器(這一點(diǎn)可能挺有意思),未來(lái)將支持EDMM(Enclave Dynamic Memory Management)。
EDMM這是個(gè)SGX v2新增的機(jī)制,背后由新增的硬件指令實(shí)現(xiàn),目的是說SGX v1時(shí)候,我一開始聲明Enclave多大,那加載起來(lái)的Enclave就那么大,大小不能再改了,SGX v2增加EDMM,讓Enclave可以建立以后,也就是運(yùn)行的時(shí)候動(dòng)態(tài)申請(qǐng)新的EPC頁(yè),滿足Enclave大小的變化。
SGX軟件層改進(jìn)
Eleos(EuroSys’17)
文章首先講了SGX帶來(lái)的開銷。第一點(diǎn),SGX帶來(lái)的直接開銷:進(jìn)出Enclave要3300/3800周期,而系統(tǒng)調(diào)用也就250周期;LLC Miss開銷是非Miss下的5.6~9.5倍;EPC頁(yè)換入換出硬盤Swap區(qū)需要40,000周期。第二點(diǎn),SGX帶來(lái)的間接開銷:由于安全期間進(jìn)出Enclave會(huì)刷新TLB(LLC我忘了是否刷新,L1在Intel的微碼補(bǔ)丁之前是不刷新,Foreshadow的出現(xiàn)導(dǎo)致Intel也做L1的刷新了。),LLC污染會(huì)造成2倍延遲、TLB污染可能造成6倍延遲。
上述實(shí)驗(yàn)結(jié)果主要說明了進(jìn)出Enclave開銷大。無(wú)論是正常的Enclave退出還是頁(yè)錯(cuò)誤之類的問題導(dǎo)致Enclave退出(AEX)都會(huì)帶來(lái)很大的延遲,因此通過非Enclave退出的方式——RPC,來(lái)替換Enclave退出的功能;而關(guān)于頁(yè)錯(cuò)誤則通過一個(gè)安全的用戶空間頁(yè)表機(jī)制SUVM(見下圖,大概是說軟件實(shí)現(xiàn)了虛實(shí)地址翻譯工作,Enclave頁(yè)表也放在Enclave內(nèi)部,原來(lái)都是統(tǒng)一用的內(nèi)核頁(yè)表,如果發(fā)現(xiàn)有頁(yè)被換出到普通內(nèi)存,那么就Enclave內(nèi)部仿真一個(gè)錯(cuò)誤處理機(jī)制,將換出到普通內(nèi)存的EPC頁(yè)再放回EPC中,并完成完整性度量。也就是說Enclave內(nèi)部做了一個(gè)軟件的用戶態(tài)頁(yè)表機(jī)制,將硬件頁(yè)表機(jī)制架空。)來(lái)避免Enclave退出。相比與改進(jìn)之前的SGX,Eleos RPC增加23%帶寬,Eleos RPC+SUVM增加50%帶寬,可喜可賀。
?
這里讓我聯(lián)想到了SGX的Switchless模式,Switchless模式大概是說我先專門弄一個(gè)線程出來(lái)讓他們直接跑在Enclave環(huán)境,然后把他們稱為ECALL工人線程,工人線程自然是用來(lái)干活的。現(xiàn)在我們運(yùn)行APP,然后APP調(diào)用一個(gè)ECALL函數(shù),那么ECALL任務(wù)放到任務(wù)池,并通知(通過發(fā)送Signal)之前一直空轉(zhuǎn)的ECALL工人起床干活了,然后ECALL工人將ECALL任務(wù)跑起來(lái)。
CoSMIX(ATC’19)
以前,SQLite的fast_read_db之類的函數(shù)依賴內(nèi)存映射文件(mmap),這會(huì)通過調(diào)用OS錯(cuò)誤句柄將內(nèi)容從硬盤帶到內(nèi)存,但是OS不可信,因此OS的錯(cuò)誤處理也不可信。如果使用請(qǐng)求頁(yè)面指令,這個(gè)指令的功能和流程定死了,不靈活。如果使用用戶自定義處理句柄,由于會(huì)通過OS來(lái)調(diào)用Enclave內(nèi)部用戶自定義句柄,流程很長(zhǎng),效率低(而且個(gè)人認(rèn)為給了OS攻擊的可能性)。
CoSMIX在Enclave內(nèi)部仿真了頁(yè)表機(jī)制來(lái)完成虛實(shí)地址轉(zhuǎn)換,目標(biāo)虛擬地址轉(zhuǎn)變成不可信的物理地址,然后將內(nèi)容取回EPC,該頁(yè)的數(shù)據(jù)同時(shí)會(huì)保留到緩存(Foreshadow中說,可以利用這個(gè)緩存造成攻擊)中,可以加快訪問“內(nèi)存”(怎么聽著很像SUVM)。
總的感覺是將頁(yè)表機(jī)制移入Enclave,通過LibOS來(lái)實(shí)現(xiàn),并完成加密內(nèi)存的解密等操作。會(huì)想起Sectum將頁(yè)表移入Enclave的做法。
這也體現(xiàn)了有些SGX漏洞就是由于Enclave部分功能需要通過OS來(lái)完成(比如頁(yè)表機(jī)制)產(chǎn)生泄露。通過LibOS實(shí)現(xiàn)部分機(jī)制可以緩解此類漏洞。
Rust-SGX SDK(CCS’19)百度
Rust語(yǔ)言號(hào)稱是一個(gè)能夠?qū)崿F(xiàn)內(nèi)存安全(不會(huì)出現(xiàn)指針越界之類由于指針這個(gè)東西導(dǎo)致的問題)的語(yǔ)言,SGX又是個(gè)能抵抗特權(quán)攻擊CPU特性,兩者優(yōu)勢(shì)互補(bǔ),就是Rust-SGX了。不過當(dāng)然不只是這樣,除了能夠用上Rust語(yǔ)言的內(nèi)存安全性和SGX提供的安全內(nèi)存,Rust-SGX還讓開發(fā)者多了一個(gè)使用Rust語(yǔ)言的機(jī)會(huì)。
?
看上圖,Rust-SGX下,Enclave可以使用Rust語(yǔ)言書寫,然后會(huì)調(diào)用Rust庫(kù)來(lái)使用SGX,Rust庫(kù)通過Rust-to-C FFI調(diào)用C語(yǔ)言的SGX SDK。
Rust-SGX有一個(gè)近親,Fortanix的Rust EDP SDK方案,它將SGX SDK也用Rust重寫,這可以將Rust的內(nèi)存安全特性實(shí)現(xiàn)地更充分。但是百度的Rust-SGX SDK能夠避免SGX SDK的上游更新導(dǎo)致后續(xù)又要用Rust重寫,同時(shí)C語(yǔ)言的SGX SDK效率比Rust更高(安全性降低)。
百度的Rust-SGX能夠保證除SGX SDK以外的其他部件都是安全的,不會(huì)引入新的漏洞,且經(jīng)過形式化驗(yàn)證。
Fortanix Rust EDP SDK
SGX攻防
SGX攻防是SGX論文中非常多的一大塊,不過目前的我沒有太多時(shí)間來(lái)寫這塊。先留坑。
Intel SGX攻防工作是為了讓Intel SGX更加完善。目前很多的SGX攻防工作的思想是從CPU攻防、其他TEE攻防和軟件攻防借鑒的。如從Intel SGX架構(gòu)、微架構(gòu)、軟件棧攻擊。
Intel SGX軟件層攻防。對(duì)SGX SDK等軟件層發(fā)動(dòng)攻擊,對(duì)軟件層攻擊進(jìn)行防御。代表工作有Iago attacks(ASPLOS’13)【惡意構(gòu)造系統(tǒng)調(diào)用返回值對(duì)Enclave攻擊】、A Tale of Two Worlds(CCS’19)【首先對(duì)SGX SDK中ABI、API攻擊進(jìn)行系統(tǒng)調(diào)研,然后實(shí)現(xiàn)了新型ABI、API攻擊】、COIN Attacks(ASPLOS’20)【首先分析了軟件層SGX常見攻擊模型,然后根據(jù)攻擊模型實(shí)現(xiàn)了漏洞自動(dòng)挖掘框架】……
微架構(gòu)數(shù)據(jù)采樣(Micro-architectural Data Sampling)指利用推測(cè)執(zhí)行導(dǎo)致微架構(gòu)信息泄露給攻擊者。SGX下代表的MDS工作有Foreshadow(SEC’18)【SGX版Meltdown,觸發(fā)異常提供瞬態(tài)執(zhí)行窗口,使信息泄漏到緩存被攻擊者竊取。與Meltdown不同,Foreshadow需額外構(gòu)造異常繞過SGX中止頁(yè)面語(yǔ)義并提供瞬態(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)信息泄露進(jìn)行攻擊,及相關(guān)防御。Racing in Hyperspace(SP’18)【受害者通過度量它的兩個(gè)線程間通訊時(shí)長(zhǎng)確定兩個(gè)線程是否在兄弟核上,避免攻擊者線程和受害者線程處于兄弟核上】、Varys(ATC’18)……
內(nèi)存安全攻防。SGX下,以內(nèi)存安全問題為主的攻防。代表工作有SGX-Shield(NDSS’17)【Enclave內(nèi)部署加載器將代碼加密帶入Enclave,并在Enclave內(nèi)實(shí)現(xiàn)ASLR】、SGXBOUNDS(EuroSys’17)【利用EPC的地址Bits中空余Bits,對(duì)緩沖區(qū)Load/Store邊界進(jìn)行檢查】、Dark-ROP(SEC’17)【利用側(cè)信道等手段定位Gadgets,通過Gadgets鏈實(shí)現(xiàn)ROP攻擊。二進(jìn)制代碼復(fù)用攻擊】、The Guard’s Dilemma(SEC’18)【源碼代碼復(fù)用攻擊,利用程序原有的內(nèi)存漏洞,實(shí)現(xiàn)控制流、棧、寄存器的劫持】……
未初始化的Padding Bits:利用傳參數(shù)據(jù)結(jié)構(gòu)中的Padding?Bits實(shí)現(xiàn)數(shù)據(jù)偷偷傳輸。Leaking Uninitialized...(arXiv’17)【利用E/OCALL參數(shù)的Padding Bits將數(shù)據(jù)傳入/出Enclave】……
執(zhí)行流痕跡——頁(yè)表痕跡。通過頁(yè)地址泄露信息反推執(zhí)行流。Controlled-channel attacks(S&P’15)【頁(yè)錯(cuò)誤泄露頁(yè)地址,利用頁(yè)地址鏈反推控制流】、SGX-PTE(SEC’17)【緩存?zhèn)刃诺婪赐票患虞d進(jìn)緩存的PTE,進(jìn)一步反推頁(yè)地址鏈及控制流】、T-SGX(NDSS’17)【利用Intel TSX的特性,使攻擊者只能獲取Abort Handler的頁(yè)地址信息,避免真正的控制流泄露,Abort Handler還能記錄AEX頻率】……
執(zhí)行流痕跡——影子分支。利用分支預(yù)測(cè)器的共享進(jìn)行側(cè)信道信息泄露。代表工作有Branch Shadowing(SEC’17)【退出Enclave時(shí)不刷新分支預(yù)測(cè)器,SGX內(nèi)外共享分支預(yù)測(cè)器,攻擊者通過(地址碰撞的)影子分支反推受害者分支選擇,反推SGX內(nèi)控制流】、BranchScope(ASPLOS’18)……
執(zhí)行流痕跡——指令時(shí)延。Nemesis(CCS’18)【利用APIC時(shí)間中斷,單步中斷Enclave代碼并計(jì)算代碼執(zhí)行時(shí)長(zhǎng),通過時(shí)延序列反推控制流】……
執(zhí)行流痕跡——其他防護(hù)。ZeroTrace(NDSS'18)【本文針對(duì)ORAM低效率問題使用SGX進(jìn)行性能提升】、OBFUSCURO(NDSS’19)【將代碼、數(shù)據(jù)訪問模式固定避免控制流痕跡泄露】……
Intel SGX發(fā)展趨勢(shì)
云計(jì)算是一種基于互聯(lián)網(wǎng)的計(jì)算方式,通過這種方式,共享的軟硬件資源和信息可以按需求提供給計(jì)算機(jī)各種終端和其他設(shè)備,使用服務(wù)商提供的電腦基建作計(jì)算和資源。【維基百科】
云計(jì)算非常契合各個(gè)實(shí)體對(duì)計(jì)算資源的定制需求,同時(shí)是一種典型的遠(yuǎn)程計(jì)算場(chǎng)景。Intel SGX是一種良好的遠(yuǎn)程計(jì)算安全方案,非常有應(yīng)用前景。不過SGX開發(fā)細(xì)節(jié)有別于傳統(tǒng)開發(fā),因此工程實(shí)現(xiàn)存在阻力。目前已有部分SGX應(yīng)用誕生,體現(xiàn)了SGX的價(jià)值,未來(lái)SGX應(yīng)用將更加豐富。
Intel SGX目前很多安全細(xì)節(jié)仍處于討論之中,隨著SGX應(yīng)用豐富,SGX的安全性將會(huì)受到更多的討論。
此外,其他芯片廠商未來(lái)可能也將學(xué)習(xí)Intel SGX來(lái)解決遠(yuǎn)程計(jì)算安全問題,以滿足遠(yuǎn)程計(jì)算安全需求。
SGX軟硬件棧
基本介紹
背景知識(shí)
1. Intel SGX
Intel SGX狹義上是指一組CPU指令,該組指令增強(qiáng)應(yīng)用程序代碼和數(shù)據(jù)的安全性,為它們提供更強(qiáng)的保護(hù)以防泄漏或修改。開發(fā)人員可將敏感信息放入Enclave中,Enclave是內(nèi)存中具有更強(qiáng)安全保護(hù)性的執(zhí)行區(qū)域。
Intel SGX廣義上是指以SGX指令為基礎(chǔ)所構(gòu)建的包括Intel CPU等硬件、CPU提供的硬件指令、驅(qū)動(dòng)、Platform Software(用于構(gòu)建不可信運(yùn)行時(shí)環(huán)境uRTS)、SDK(用于構(gòu)建可信運(yùn)行時(shí)環(huán)境tRTS)等在內(nèi)的一種新的安全機(jī)制,既Intel SGX軟硬件棧。
SGX平臺(tái)需要Intel 6代及以上處理器,并且BIOS支持并開啟了SGX選項(xiàng)。
2. 常用名詞
Intel ?SGX:Intel Software Guard Extensions的簡(jiǎn)稱。
Enclave:下述條目針對(duì)Enclave不同的角度來(lái)表述,實(shí)際表述中不太加以區(qū)分,并且更側(cè)重于指Enclave實(shí)例。
Enclave內(nèi)存:Enclave是內(nèi)存中具有更強(qiáng)安全保護(hù)性的執(zhí)行區(qū)域。
Encalve環(huán)境:通過Enclave內(nèi)存及硬件保護(hù)機(jī)制、可信運(yùn)行時(shí)共同來(lái)保護(hù)敏感代碼數(shù)據(jù)的環(huán)境,或者說安全世界。
Enclave代碼:希望放在Enclave中執(zhí)行的敏感代碼數(shù)據(jù)。
Enclave文件:保存著Enclave代碼數(shù)據(jù)的鏡像文件。與實(shí)例的區(qū)別好比程序代碼與進(jìn)程的區(qū)別,一個(gè)靜態(tài),一個(gè)動(dòng)態(tài)。
Enclave實(shí)例:指從Enclave文件具體執(zhí)行起來(lái)的進(jìn)程。
EPC:Enclave Page Cache。Enclave的物理內(nèi)存是一種抽象的表示,Enclave物理內(nèi)存會(huì)最終落實(shí)到一個(gè)個(gè)具體的物理頁(yè),這些頁(yè)就是來(lái)自于EPC。也就是說EPC是一塊加密的處于系統(tǒng)保留內(nèi)存的物理內(nèi)存區(qū)域,用來(lái)存放Enclave的頁(yè)和SGX數(shù)據(jù)結(jié)構(gòu)。
EP:Enclave Page。EPC中一個(gè)個(gè)具體的頁(yè)。為了方便讀者理解,也可稱為EPC頁(yè)
SGX世界觀:SGX將軟硬件資源等劃分成安全世界和不安全世界
安全世界:包括可信運(yùn)行時(shí)和用戶的Enclave實(shí)例,安全世界中Enclave實(shí)例會(huì)利用可信運(yùn)行時(shí)提供的API完成敏感功能等。而每個(gè)開發(fā)者進(jìn)程都有自己的獨(dú)立的Enclave環(huán)境,不同Enclave的安全世界相互隔離。
不安全世界:包括不可信運(yùn)行時(shí)和用戶的非敏感代碼以及具有內(nèi)核權(quán)限的驅(qū)動(dòng)。
uRTS:Untrusted Runtime Service,不可信運(yùn)行時(shí)環(huán)境,不安全世界、普通世界的一部分。
tRTS:Trusted Runtime Service,可信運(yùn)行時(shí)環(huán)境,安全世界、Enclave環(huán)境的一部分。
AE:Architectural Enclave。由SGX平臺(tái)提供完成特定功能的特殊的Enclave,包括:Launch Enclave,用于決定在當(dāng)前SGX平臺(tái)上運(yùn)行哪些其他Enclave(主要指用戶的Enclave實(shí)例);Provisioning Enclave,提供長(zhǎng)期平臺(tái)證明密鑰;Quoting Enclave,使用非對(duì)稱平臺(tái)證明密鑰,用于為遠(yuǎn)程使用者簽署本地證明報(bào)告;Platform Service Enclave,平臺(tái)服務(wù)Enclave,用于提供如可信的時(shí)間等安全功能。
OCALL:從安全世界進(jìn)入不安全世界所用到的橋函數(shù)。
ECALL:從不安全世界進(jìn)入安全世界所用到的橋函數(shù)。
ISV:Individual Software Vendor個(gè)體軟件廠商
SgxEdger8r:SGX Edge Routine,主要用于在編譯過程中對(duì).edl文件中的ecall和ocall重新封裝編寫,即將用戶編寫的e/ocall改寫成實(shí)際執(zhí)行的e/ocall
3. 常用結(jié)構(gòu)體
SECS:SGX Enclave Control Structure。每個(gè)Enclave實(shí)例都具有一個(gè)該結(jié)構(gòu)體,用于保存關(guān)于該實(shí)例的信息,如Enclave的線性基址(對(duì)于整個(gè)程序而言)和大小。保存在EPC中該Enclave的內(nèi)存空間,只能由CPU訪問。
TCS:Thread Control Structure。每個(gè)Enclave實(shí)例可以擁有很多個(gè)具體執(zhí)行Enclave函數(shù)的Worker Thread,每個(gè)線程都對(duì)應(yīng)一個(gè)TCS,用于描述這個(gè)線程的信息,如線程執(zhí)行flag、SSA的位置、當(dāng)前使用的SSA(若干個(gè)SSA組成一個(gè)棧)。存儲(chǔ)在EPC中,只能由處理器訪問。
SIGSTRUCT:ENCLAVE SIGNATURE STRUCTURE。每個(gè)Enclave文件具有一個(gè)SIGSTRUCT來(lái)證明它是被某個(gè)SGX平臺(tái)簽署的。(見后續(xù)“EINIT指令過程”章節(jié))
EINITTOKEN:EINIT TOKEN STRUCTURE。從Enclave文件創(chuàng)建Enclave實(shí)例時(shí),需要向AE申請(qǐng)一個(gè)令牌,后續(xù)EINIT指令使用EINITTOKEN結(jié)構(gòu)來(lái)檢查是否允許執(zhí)行Enclave。(見后續(xù)“EINIT指令過程”章節(jié))
EPCM:ENCLAVE PAGE CACHE MAP。被硬件用來(lái)跟蹤EPC內(nèi)容,每一個(gè)Entry對(duì)應(yīng)一個(gè)EP。軟件不可訪問。每個(gè)Entry會(huì)說明EPC頁(yè)的線性地址等。
SGX的可信保障及優(yōu)點(diǎn)
SGX的不足
SGX與TrustZone區(qū)別
TrustZone將系統(tǒng)劃分為安全世界和普通世界,實(shí)現(xiàn)了執(zhí)行環(huán)境以及存儲(chǔ)、網(wǎng)絡(luò)和屏幕等設(shè)備的安全隔離,敏感代碼放入安全世界執(zhí)行。TrustZone里面程序是直面硬件資源的,并且TrustZone內(nèi)部的多個(gè)程序間并沒有安全隔離,直到有相關(guān)工作在TrustZone里面安置了一個(gè)安全內(nèi)核,如T6安全微內(nèi)核(上海瓶缽主導(dǎo)的工作,在Trustzone里實(shí)現(xiàn)了安全操作系統(tǒng)的功能,實(shí)現(xiàn)了敏感應(yīng)用之間的隔離,還可以讓開發(fā)者更好地使用物理硬件,安全微內(nèi)核只有六千行代碼,非常輕量級(jí),同時(shí)經(jīng)過安全審計(jì))。【SecTEE】等工作也試圖在TrustZone內(nèi)部提供Enclave的概念(包括了SGX所提供的可信度量、加密、訪問控制、密封、本地認(rèn)證、遠(yuǎn)程認(rèn)證中的部分功能),之前也聽到有相關(guān)工作在ARM芯片的普通世界構(gòu)建Enclave,而不是在TrustZone內(nèi)部,似乎硬件實(shí)現(xiàn)機(jī)制有一些區(qū)別,忘記了。
SGX中,對(duì)于每一個(gè)進(jìn)程,可以創(chuàng)建多個(gè)類似于“安全世界”的Enclave,并且不同進(jìn)程之間的Enclave是互相硬件隔離的——通過MEE使用獨(dú)立的密鑰加密Enclave內(nèi)存進(jìn)行保障。
SGX內(nèi)存布局及訪問控制
這一塊很多資料來(lái)源于:
王鵑, 樊成陽(yáng), 程越強(qiáng), 等. SGX 技術(shù)的分析和研究[J]. Journal of Software, 2018, 9: 2778-2798.
1. SGX結(jié)構(gòu)簡(jiǎn)介
每個(gè)進(jìn)程可以創(chuàng)建若干個(gè)Enclave實(shí)例(不過比較常見的情況是一個(gè)實(shí)例),Enclave執(zhí)行程序的敏感代碼,保護(hù)敏感數(shù)據(jù)。Enclave之間、Enclave與普通世界之間都存在訪問控制(后續(xù)“SGX訪問控制”章節(jié)會(huì)講述)。基本結(jié)構(gòu)如圖4所示(詳細(xì)的軟件棧構(gòu)造會(huì)在后續(xù)“SGX軟件棧”章節(jié)中描述)。
- 硬件暴露的功能。硬件向外暴露Enclave Page Cache(EPC是一塊加密的處于系統(tǒng)保留內(nèi)存的物理內(nèi)存區(qū)域,用來(lái)存放 Enclave的頁(yè)和SGX數(shù)據(jù)結(jié)構(gòu),也就是說Enclave的物理內(nèi)存會(huì)最終落實(shí)到EPC)和EPCM(用于管理EPC頁(yè)的訪問控制,EPCM只能由硬件訪問)及硬件指令。
- 內(nèi)核權(quán)限環(huán)境(既驅(qū)動(dòng))的功能。內(nèi)核權(quán)限環(huán)境有一個(gè)管理分配給Enclave的EPC頁(yè)的頁(yè)表,此外還能利用內(nèi)核權(quán)限硬件指令管理Enclave的生命周期,并把生命周期管理的功能向上提供給不可信運(yùn)行時(shí)環(huán)境。
- 用戶權(quán)限環(huán)境的功能。用戶權(quán)限下的不可信運(yùn)行時(shí)可以管理Enclave生命周期。用戶權(quán)限下的可信運(yùn)行時(shí)幫助Enclave環(huán)境執(zhí)行敏感代碼以及調(diào)用用戶權(quán)限硬件指令,所提供的庫(kù)必須是經(jīng)過安全審計(jì)的庫(kù),而且只能通過靜態(tài)鏈接。
圖1:SGX基本結(jié)構(gòu)
2. Processor Reserved Memory布局
如圖2所示,BIOS通過配置一組范圍寄存器分配Processor Reserved Memory(PRM)。其中包括EPC和其他保留給硬件使用的內(nèi)存。EPC中會(huì)分配Page給SGX數(shù)據(jù)結(jié)構(gòu)供Enclave使用。
圖2:Processor Reserved Memory布局
3. Enclave內(nèi)存結(jié)構(gòu)
如圖3所示,每個(gè)Enclave內(nèi)存由EPC中分出的若干Page構(gòu)成,用于存儲(chǔ)Enclave代碼、Enclave數(shù)據(jù)——比如涉及金融等敏感操作的代碼數(shù)據(jù)、TCS。
線程控制信息TCS。Enclave代碼的執(zhí)行是由某個(gè)具體線程(進(jìn)程只有一個(gè)線程時(shí)就是指進(jìn)程對(duì)應(yīng)的主線程,或者說進(jìn)程)來(lái)執(zhí)行,那么這個(gè)線程在Enclave中需要保存一份描述其針對(duì)于Enclave管理用的相關(guān)控制信息,既Thread Control Structure(TCS),換句話說,TCS保存著進(jìn)出Enclave時(shí)候所恢復(fù)或保存的Enclave線程信息。舉個(gè)例子就是,線程1從普通世界進(jìn)入安全世界,需要佩戴安全世界的工作證,當(dāng)離開安全世界,需要放下安全世界工作證,拿上linux環(huán)境的工作證。
圖3:Enclave結(jié)構(gòu)
4. Enclave Page Cache Map結(jié)構(gòu)
如圖4所示。Enclave Page Cache Map(EPCM)是一個(gè)硬件結(jié)構(gòu),保存著分配給Enclave的Page的控制信息,一個(gè)Page對(duì)應(yīng)一個(gè) EPCM 表項(xiàng),控制信息包括頁(yè)面是否已被使用、該頁(yè)的擁有者、頁(yè)面類型、地址映射和權(quán)限屬性等。EPCM 結(jié)構(gòu)由 PMH(Page Miss Handler)硬件模塊訪問,這個(gè)模塊通過查詢頁(yè)表、范圍寄存器、EPCM 進(jìn)行內(nèi)存訪問。
圖4:Enclave Page Cache Map結(jié)構(gòu)
5.? SGX訪問控制
Enclave基本訪問控制如圖5所示。
- Enclave 外部的應(yīng)用程序按照段頁(yè)保護(hù)機(jī)制訪問PRM外部?jī)?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)部的代碼按照段、頁(yè)保護(hù)機(jī)制訪問PRM外的內(nèi)存。
- Enclave 內(nèi)部的代碼不能訪問其他PRM內(nèi)存。
圖5:Enclave基本訪問控制
SGX軟硬件棧圖示
SGX軟件棧如圖所示。下面將先對(duì)硬件、驅(qū)動(dòng)、Platform Software提供的不可信運(yùn)行時(shí)、SDK提供的可信運(yùn)行時(shí)、開發(fā)者的應(yīng)用程序、開發(fā)者的Enclave程序這六個(gè)模塊進(jìn)行介紹,之后將對(duì)硬件指令、驅(qū)動(dòng)接口、API接口、橋函數(shù)這四個(gè)接口進(jìn)行介紹。
下面這張為舊圖
硬件
最下層是SGX硬件,主要指支持SGX特性的CPU(需要Intel 6代CPU及以上),此外還包括PRM、EPCM、PMH等(具體見上文“SGX硬件原理”章節(jié))。CPU向上提供硬件指令ENCLS(內(nèi)核權(quán)限級(jí)Enclave硬件指令)及ENCLU(用戶權(quán)限級(jí)Enclave硬件指令),其中內(nèi)核權(quán)限指令提供對(duì)Enclave的生命周期管理等功能,用戶權(quán)限指令提供環(huán)境切換等功能。
驅(qū)動(dòng)
驅(qū)動(dòng)處于內(nèi)核權(quán)限,向上會(huì)接收不可信運(yùn)行時(shí)要求調(diào)用ENCLS的命令,然后向下調(diào)用ENCLS硬件指令,并將結(jié)果反饋給不可信運(yùn)行時(shí)。因此驅(qū)動(dòng)一種功能是不可信運(yùn)行時(shí)想要調(diào)用ENLCS指令的代理(主要是Enclave生命周期管理以及EP的部分管理),并完成與該指令相關(guān)工作,其中一個(gè)非常重要的工作就是sgx_encl結(jié)構(gòu)體的管理(其中包括保管每個(gè)Enclave所被分配到的EP集合)。另一方面,由于SGX不信任驅(qū)動(dòng),要求驅(qū)動(dòng)通過調(diào)用內(nèi)核權(quán)限指令完成如TLB刷新、EP頁(yè)交換等安全性和高效性的保障,只有如此,程序才能繼續(xù)正常運(yùn)行。
不可信運(yùn)行
不可信運(yùn)行時(shí)處于用戶態(tài)權(quán)限。一方面,不可信運(yùn)行時(shí)向下調(diào)用驅(qū)動(dòng)接口來(lái)管理Enclave生命周期,向上將該功能以API形式提供給開發(fā)者。另一方面,還能調(diào)用用于進(jìn)入Enclave的用戶態(tài)權(quán)限硬件指令,提供不可信環(huán)境下SGX設(shè)備能力查詢、不可信密鑰交換API等功能(見下文“SGX API”章節(jié))。
可信運(yùn)行時(shí)
可信運(yùn)行時(shí)同樣處于用戶態(tài)權(quán)限。可信運(yùn)行時(shí)向下能夠調(diào)用用戶態(tài)權(quán)限硬件指令用于離開可信世界、創(chuàng)建加密報(bào)告等。可信運(yùn)行時(shí)向上能夠給開發(fā)者提供Enclave開發(fā)的API。由于安全原因以及環(huán)境隔離,Enclave代碼不能調(diào)用外部任何庫(kù),只能靜態(tài)鏈接安全庫(kù),同時(shí)SGX設(shè)計(jì)者希望能夠讓Enclave代碼開發(fā)能夠滿足常規(guī)的開發(fā)需求,提供良好的開發(fā)環(huán)境,因此可信運(yùn)行時(shí)包含了很多經(jīng)過安全審計(jì)的標(biāo)準(zhǔn)庫(kù)和開發(fā)庫(kù),比如C\C++標(biāo)準(zhǔn)庫(kù)、加密庫(kù)等(具體見下文“SGX API”章節(jié))。
應(yīng)用程序
應(yīng)用程序處于用戶態(tài)權(quán)限,并屬于不可信世界,能夠利用不可信運(yùn)行時(shí)API完成Enclave生命周期管理,還能調(diào)用普通世界的任意庫(kù)函數(shù),也就是說應(yīng)用程序開發(fā)與傳統(tǒng)的程序開發(fā)沒有區(qū)別。
Enclave程序
需要執(zhí)行的敏感程序,利用可信運(yùn)行時(shí)提供的API來(lái)完成開發(fā),同時(shí)由于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。每一個(gè)具體的功能指令被稱為葉功能,如EADD葉功能,因?yàn)槿~功能之間的區(qū)分是硬件指令(如ENCLS指令:0x 0F 01 CF)的EAX值不同,因此ENCLS指令的EAX在輸入時(shí)都是用作葉功能號(hào)。
內(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確定這個(gè)Enclave建立是否合法可信。
如圖3所示,SGX 2代指令在1代基礎(chǔ)上添加了動(dòng)態(tài)增加EP、修改EP權(quán)限類型的功能,在1代中,在Enclave初始化以后,不能動(dòng)態(tài)增加EP或者修改EP權(quán)限屬性。
圖2:SGX 1代內(nèi)核權(quán)限硬件指令
圖3:SGX 2代新增內(nèi)核權(quán)限硬件指令
- EADD
這個(gè)葉功能將源頁(yè)面從非Enclave內(nèi)存復(fù)制到EPC中,將EPC頁(yè)面與EPC中駐留的SECS頁(yè)面相關(guān)聯(lián),并將線性地址和安全屬性存儲(chǔ)在EPCM中。Enclave偏移量和安全屬性作為關(guān)聯(lián)內(nèi)容的一部分被度量并擴(kuò)展到SECS.MRENCLAVE。此指令只能在當(dāng)前特權(quán)級(jí)別為0時(shí)執(zhí)行。
RBX包含PAGEINFO結(jié)構(gòu)的有效地址,而RCX包含EPC頁(yè)面的有效地址。
- EBLOCK
這個(gè)葉功能導(dǎo)致EPC頁(yè)面被標(biāo)記為阻塞。此指令只能在當(dāng)前特權(quán)級(jí)別為0時(shí)執(zhí)行。
RCX的內(nèi)容是EPC頁(yè)面的有效地址。DS段用于創(chuàng)建線性地址。不支持段重寫。在RAX中返回一個(gè)錯(cuò)誤代碼。
- ECREATE
ENCLS[ECREATE]是Enclave構(gòu)建過程中執(zhí)行的第一條指令。ECREATE將EPC外部的SECS結(jié)構(gòu)復(fù)制到EPC內(nèi)部的SECS頁(yè)面。SECS的內(nèi)部結(jié)構(gòu)是軟件無(wú)法訪問的。
ECREATE將在受保護(hù)的SECS中設(shè)置字段,并在EPC中將頁(yè)面標(biāo)記為有效。ECREATE初始化或檢查未使用的字段。
軟件在源結(jié)構(gòu)中設(shè)置以下字段:SECS:BASEADDR, SECS:SIZE(以字節(jié)為單位)和屬性。SECS:BASEADDR必須按照SECS.SIZE范圍自然對(duì)齊。SECS.SIZE最小是2頁(yè)(8192字節(jié))。
源操作數(shù)RBX包含一個(gè)PAGEINFO結(jié)構(gòu)的有效地址。PAGEINFO包含源SECS的有效地址和SECEINFO的有效地址。PAGEINFO中的SECS字段未被使用。RCX寄存器是目標(biāo)SECS的有效地址。它是EPC中的一個(gè)空槽的地址。SECS結(jié)構(gòu)必須是頁(yè)面對(duì)齊的。SECINFO標(biāo)記必須將頁(yè)面指定為SECS頁(yè)面。
- EDBGRD
這個(gè)葉功能將一個(gè)四字/雙字從屬于調(diào)試Enclave的EPC頁(yè)面復(fù)制到RBX寄存器中。在64位模式下讀取8個(gè)字節(jié),在非64位模式下讀取4個(gè)字節(jié)。無(wú)法重寫讀取的數(shù)據(jù)的大小。
EPC內(nèi)部源位置的有效地址在寄存器RCX中提供。
- EDBGWR
這個(gè)葉功能將EBX/RBX中的內(nèi)容復(fù)制到屬于調(diào)試Enclave的EPC頁(yè)面。8個(gè)字節(jié)以64位模式寫入,4個(gè)字節(jié)以非64位模式寫入。無(wú)法重寫數(shù)據(jù)的大小。EPC內(nèi)部源位置的有效地址在寄存器RCX中提供
- EEXTEND
這個(gè)葉功能通過測(cè)量一個(gè)擴(kuò)展字符串來(lái)更新一個(gè)SECS的MRENCLAVE測(cè)量寄存器。此指令只能在當(dāng)前特權(quán)級(jí)別為0且未初始化enclave時(shí)執(zhí)行。
RCX包含要測(cè)量的EPC頁(yè)面的256字節(jié)區(qū)域的有效地址。DS段用于創(chuàng)建線性地址。不支持段重寫。
- EINIT
這個(gè)葉功能是在Enclave構(gòu)建過程中執(zhí)行的最后一條指令。EINIT之后,MRENCLAVE度量完成,Enclave準(zhǔn)備使用EENTER指令開始執(zhí)行用戶代碼。
EINIT接收SIGSTRUCT和EINITTOKEN的有效地址。SIGSTRUCT描述了包含MRENCLAVE、ATTRIBUTES、ISVSVN、一個(gè)3072位RSA密鑰和使用所包含密鑰的簽名的Enclave。SIGSTRUCT必須填充兩個(gè)值,q1和q2:
q1 = floor(Signature2 / Modulus);
q2 = floor((Signature3 - q1 * Signature * Modulus) / Modulus);
EINITTOKEN包含MRENCLAVE、MRSIGNER和屬性。這些值必須與SECS中的對(duì)應(yīng)值匹配。如果使用調(diào)試啟動(dòng)鍵創(chuàng)建EINITTOKEN,則Enclave也必須處于調(diào)試模式。
具體過程可以參考下文“EINIT指令過程”章節(jié)。
- ELDB/ELDU
這個(gè)葉功能將頁(yè)面從常規(guī)主存復(fù)制到EPC。作為復(fù)制過程的一部分,對(duì)頁(yè)面進(jìn)行密碼學(xué)驗(yàn)證和解密。此指令只能在當(dāng)前特權(quán)級(jí)別為0時(shí)執(zhí)行。
ELDB葉功能在復(fù)制后在EPC中的目標(biāo)頁(yè)面的EPCM條目中設(shè)置BLOCK位。復(fù)制后,ELDU葉功能清除EPC中的目標(biāo)頁(yè)的EPCM條目中的BLOCK位。
RBX包含一個(gè)PAGEINFO結(jié)構(gòu)的有效地址;RCX包含目的地EPC頁(yè)面的有效地址;RDX包含保存頁(yè)面版本的版本數(shù)組槽的有效地址。
- EPA
這個(gè)葉功能在EPC頁(yè)面中創(chuàng)建一個(gè)空版本數(shù)組,其邏輯地址由DS:RCX提供,并為該頁(yè)面設(shè)置EPCM屬性。在執(zhí)行這條指令時(shí),寄存器RBX必須設(shè)置為PT_VA。
- EREMOVE
這個(gè)葉功能使EPC頁(yè)面與其SECE解除關(guān)聯(lián),并被標(biāo)記為未使用。此指令葉僅在當(dāng)前特權(quán)級(jí)別為0時(shí)才能執(zhí)行。
RCX的內(nèi)容是EPC頁(yè)面的有效地址。DS段用于創(chuàng)建線性地址。不支持段重寫。
如果操作數(shù)沒有正確對(duì)齊、或沒有引用該EPC頁(yè)面、或頁(yè)面被另一個(gè)線程使用、或其他線程在頁(yè)面所屬的Enclave中運(yùn)行,則該指令將失敗。此外,如果操作數(shù)指向所關(guān)聯(lián)的SECS,則指令失敗。
- ETRACK
這個(gè)葉功能提供了一種機(jī)制,讓硬件跟蹤軟件是否成功地完成了所需的TLB地址清除。該指令只能在當(dāng)前特權(quán)級(jí)別為0時(shí)執(zhí)行。
RCX的內(nèi)容是EPC頁(yè)面的有效地址。
- EWB
這個(gè)葉功能將一個(gè)頁(yè)面從EPC復(fù)制到常規(guī)主存。作為復(fù)制過程的一部分,頁(yè)面受到加密保護(hù)。此指令只能在當(dāng)前特權(quán)級(jí)別為0時(shí)執(zhí)行。
- EAUG
這個(gè)葉功能為已存在的Enclave新分配EPC頁(yè),將使EPC頁(yè)面清零,將EPC頁(yè)面與EPC中駐留的SECS頁(yè)面相關(guān)聯(lián),并將線性地址和安全屬性存儲(chǔ)在EPCM中。作為關(guān)聯(lián)內(nèi)容的一部分,將安全屬性配置為阻止訪問EPC頁(yè)面,直到EACCEPT葉或EACCEPTCOPY葉的相應(yīng)調(diào)用確認(rèn)將新頁(yè)面添加到Enclave為止。此指令只能在當(dāng)前特權(quán)級(jí)別為0時(shí)執(zhí)行。
RBX包含PAGEINFO結(jié)構(gòu)的有效地址,而RCX包含EPC頁(yè)面的有效地址。
- EMODPR
此葉功能限定已初始化的Enclave中的EPC頁(yè)面的訪問權(quán)限。SECINFO參數(shù)的RWX位被視為一個(gè)權(quán)限掩碼;沒指定頁(yè)面權(quán)限的值將無(wú)效。此指令只能在當(dāng)前特權(quán)級(jí)別為0時(shí)執(zhí)行。
RBX包含SECINFO結(jié)構(gòu)的有效地址,而RCX包含EPC頁(yè)面的有效地址。
- EMODT
這個(gè)葉功能修改EPC頁(yè)面的類型。將安全屬性配置為:在調(diào)用EACCEPT確認(rèn)修改之前,阻止作為新類型訪問EPC頁(yè)面。此指令只能在當(dāng)前特權(quán)級(jí)別為0時(shí)執(zhí)行。
RBX包含SECINFO結(jié)構(gòu)的有效地址,而RCX包含EPC頁(yè)面的有效地址。
用戶權(quán)限硬件指令-ENCLU
如圖4所示,SGX 1代指令中,ENCLU主要用于進(jìn)出Enclave、創(chuàng)建用于Enclave驗(yàn)證的報(bào)告等。
如圖5所示,SGX 2代指令在1代基礎(chǔ)上讓用戶決定是否接受的ENCLS對(duì)EP權(quán)限類型的修改、擴(kuò)展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é)束時(shí),邏輯處理器以Enclave模式在EnclaveBase+TCS.OENTRY的RIP上執(zhí)行。
如果目標(biāo)地址不在CS段(32位)內(nèi),或者不在標(biāo)準(zhǔn)的地址范圍(64位),則會(huì)得到一個(gè)#GP(0)結(jié)果。
- EEXIT
ENCLU[EEXIT]指令從當(dāng)前執(zhí)行的Enclave和分支退出到RBX中指定的位置。
RCX接收當(dāng)前的AEP(異步退出指針)。如果RBX不在CS(32位模式)或不在標(biāo)準(zhǔn)的地址范圍(64位模式),則會(huì)產(chǎn)生#GP(0)結(jié)果。
- EGETKEY
ENCLU[EGETKEY]指令從處理器特定的密鑰層次結(jié)構(gòu)中返回一個(gè)128位的密鑰。寄存器RBX包含KEYREQUEST結(jié)構(gòu)的有效地址,指令據(jù)此決定被請(qǐng)求的密鑰。RCX寄存器包含將返回密鑰的有效地址。RBX和RCX中的地址都應(yīng)該是Enclave中的位置。EGETKEY使用處理器唯一的值根據(jù)許多可能的輸入創(chuàng)建特定的鍵來(lái)派生鍵。這個(gè)指令葉只能在一個(gè)Enclave內(nèi)執(zhí)行。
EGETKEY使用處理器唯一的值根據(jù)多種可能的輸入創(chuàng)建特定密鑰來(lái)派生密鑰。這個(gè)指令葉只能在一個(gè)Enclave內(nèi)執(zhí)行。
- EREPORT
這個(gè)葉功能創(chuàng)建一個(gè)描述Enclave內(nèi)容的加密報(bào)告。這個(gè)指令葉只能在Enclave內(nèi)部執(zhí)行。其他Enclave可以使用密碼報(bào)告來(lái)確定Enclave是否在相同的平臺(tái)上運(yùn)行。
RBX包含Enclave的MRENCLAVE值的有效地址,MRENCLAVE使用REPORT密鑰驗(yàn)證輸出的REPORT。RCX包含一個(gè)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]指令使用之前存儲(chǔ)在SSA中的機(jī)器狀態(tài),繼續(xù)執(zhí)行由于異常或中斷而中斷的ENCLU指令。
- EACCEPT
通過驗(yàn)證SECINFO中指定的安全屬性與EPCM中頁(yè)面的安全屬性匹配,這個(gè)葉函數(shù)接受對(duì)運(yùn)行中的Enclave中的頁(yè)面的更改。這個(gè)指令葉只能在Enclave內(nèi)部執(zhí)行。
RBX包含SECINFO結(jié)構(gòu)的有效地址,而RCX包含EPC頁(yè)面的有效地址。
- EACCEPTCOPY
這個(gè)葉功能將現(xiàn)有EPC頁(yè)面的內(nèi)容復(fù)制到未初始化的EPC頁(yè)面(由EAUG創(chuàng)建)。初始化之后,該指令還可以修改與目標(biāo)EPC頁(yè)面關(guān)聯(lián)的訪問權(quán)限。這個(gè)指令葉只能在Enclave內(nèi)部執(zhí)行。
RBX包含SECINFO結(jié)構(gòu)的有效地址,而RCX和RDX分別包含EPC頁(yè)面的有效地址。
- EMODPE
這個(gè)葉功能擴(kuò)展了運(yùn)行中的Enclave現(xiàn)有EPC頁(yè)面的訪問權(quán)限。SECINFO參數(shù)的RWX位被視為一個(gè)權(quán)限掩碼;若值表示不擴(kuò)展頁(yè)面權(quán)限,那么指令將不起作用。這個(gè)指令葉只能在Enclave內(nèi)部執(zhí)行。
RBX包含SECINFO結(jié)構(gòu)的有效地址,而RCX包含EPC頁(yè)面的有效地址。
SGX初始化過程
這里將以SGX初始化為例,使讀者能夠?qū)GX指令有更直觀的感受。SGX初始化過程如圖6所示。
圖6:SGX初始化流程
EINIT指令過程
EINIT指令的執(zhí)行過程體現(xiàn)了Enclave實(shí)例是如何被可信的啟動(dòng)起來(lái),因此這里將對(duì)EINIT指令過程展開描述。
如圖7講述了EINIT指令的執(zhí)行過程,既EINIT如何最終完成Enclave創(chuàng)建,用到了三個(gè)結(jié)構(gòu):SIGSTRUCT、EINITTOKEN和SECS。
驅(qū)動(dòng)接口
驅(qū)動(dòng)接口的主要功能還是向不可信運(yùn)行時(shí)uRTS提供管理Enclave生命周期的功能,會(huì)在內(nèi)核權(quán)限硬件指令基礎(chǔ)之上完成具體的生命周期管理能力。
SGX API
這里將介紹運(yùn)行時(shí)環(huán)境(uRTS由Platform Software提供、tRTS由SDK提供)向開發(fā)者提供了哪些API供使用。這是SGX開發(fā)者直接接觸的部分。
1. 可信運(yùn)行時(shí)庫(kù)函數(shù)
由于Enclave程序會(huì)被放在Enclave Page中,與其他內(nèi)存存在隔離,因此無(wú)法鏈接動(dòng)態(tài)鏈接庫(kù)來(lái)實(shí)現(xiàn)各種豐富的傳統(tǒng)開發(fā)能有的功能,只能鏈接靜態(tài)鏈接庫(kù),也就是將需要用到的靜態(tài)鏈接庫(kù)函數(shù)一并放到Enclave內(nèi)存中。因此靜態(tài)鏈接庫(kù)的豐富程度決定了Enclave程序開發(fā)的便利程度。為了滿足Enclave程序盡可能能夠像傳統(tǒng)開發(fā)一樣便利,因此提供了一系列包括C/C++標(biāo)準(zhǔn)庫(kù)、可信密碼學(xué)庫(kù)等源碼用于靜態(tài)鏈接。由于靜態(tài)鏈接庫(kù)一旦出現(xiàn)安全性問題會(huì)直接影響Enclave程序,因此所能使用的庫(kù)函數(shù)是需要經(jīng)過安全審計(jì)的,所以需要剔除或者重新實(shí)現(xiàn)不安全的庫(kù)函數(shù),此外為了便于開發(fā)提供可信的密碼學(xué)相關(guān)操作的庫(kù)函數(shù)。總而言之,可信庫(kù)函數(shù)的提供需要滿足安全性及便利性。
a. 可信運(yùn)行時(shí)系統(tǒng)服務(wù)
一些起到幫助性質(zhì)的庫(kù)函數(shù)。
b. 自定義異常處理函數(shù)
當(dāng)Enclave中發(fā)生了硬件異常,將由異常處理鏈來(lái)逐級(jí)處理硬件異常。tRTS提供了函數(shù)使得開發(fā)者的Enclave程序能通過注冊(cè)處理函數(shù)來(lái)具體處理部分硬件異常,然后再將異常交給原來(lái)的異常處理鏈處理,或者說將這個(gè)異常處理句柄追加到異常處理鏈中。
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進(jìn)入uRTS具體實(shí)現(xiàn)。由于是uRTS下執(zhí)行,所以最好檢查CPUID指令返回值和Ocall返回值。如果Enclave中用到第三方庫(kù)用到了CPUID指令,需要開發(fā)者做分析檢查,處理CPUID異常或者開發(fā)者直接給出CPUID結(jié)果而不去真正調(diào)用CPUID。
d. 可信服務(wù)庫(kù)
可信服務(wù)庫(kù)sgx_tservice主要用于安全的數(shù)據(jù)操作和保護(hù)。第一部分函數(shù)是對(duì)SGX硬件指令包裝。
第二部分函數(shù)是用于將數(shù)據(jù)密封到SGX平臺(tái)的不可信存儲(chǔ)中的函數(shù)。Enclave被關(guān)閉或重啟的情況下,Enclave中數(shù)據(jù)將隨Enclave銷毀而消失,如果有些數(shù)據(jù)未來(lái)需要被用到,那么就需要加密存儲(chǔ)不可信存儲(chǔ)中。
第三部分函數(shù)用于幫助計(jì)算密封數(shù)據(jù)的大小、加密文本長(zhǎng)度和消息驗(yàn)證碼(MAC)文本長(zhǎng)度。
- sgx_calc_sealed_data_size、sgx_get_add_mac_txt_len、sgx_get_encrypt_txt_len:幫助密封庫(kù)函數(shù)確定在具體操作時(shí)為一些關(guān)鍵結(jié)構(gòu)分配內(nèi)存的大小
e. 可信平臺(tái)服務(wù)函數(shù)
允許開發(fā)者使用平臺(tái)服務(wù)(PSE,Paltform Service Enclave)或者獲得平臺(tái)服務(wù)安全屬性。.
?f. Diffie–Hellman (DH)會(huì)話建立函數(shù)?
幫助開發(fā)者使用ECDH密鑰交換協(xié)議在兩個(gè)Enclave間建立安全會(huì)話。
?g. C?標(biāo)準(zhǔn)庫(kù)?
sgx_tstdc提供了可信標(biāo)準(zhǔn)C庫(kù),同時(shí)這個(gè)庫(kù)只能在Enclave中使用。目前支持C99子集,代碼來(lái)自O(shè)penBSD項(xiàng)目。不支持部分函數(shù)的原因:
具體的函數(shù)支持情況:
h. C++ 語(yǔ)言支持
C++語(yǔ)言特性支持情況。ISO/IEC 14882:SGX對(duì)定義的C++庫(kù)大部分語(yǔ)言特性完全支持,包括:
× 不支持全局Destructors,因?yàn)镋nclave銷毀時(shí),EPC會(huì)被回收。
× Enclave接口定義中不支持C++對(duì)象,如果需要外部往Enclave傳參,需要另外保存成C結(jié)構(gòu)體。
C++標(biāo)準(zhǔn)庫(kù)支持情況:支持了一套遵循C++11標(biāo)準(zhǔn)的可信C++標(biāo)準(zhǔn)庫(kù)(包括STL)。有多個(gè)版本的C++標(biāo)準(zhǔn)庫(kù)可以被鏈接:
不支持的函數(shù)如下:
只有C語(yǔ)言函數(shù)可以作為Enclave與外部的橋接函數(shù)。
i. 密碼學(xué)庫(kù)
SDK提供了可信密碼學(xué)庫(kù)sgx_tcrypto,這同時(shí)會(huì)被其他可信庫(kù)如sgx_tservice用到。可信密碼學(xué)庫(kù)基于Intel Integrated Performance Primitives (Intel IPP)或Intel Software Guard Extensions SSL cryptographic library (Intel SGX SSL)。sgx_tcrypto庫(kù)函數(shù)包括(除IPP、SGX SSL外的函數(shù),一類適用于單獨(dú)的直接對(duì)單數(shù)據(jù)集進(jìn)行密碼學(xué)運(yùn)算,另一類是構(gòu)建管理句柄對(duì)多個(gè)數(shù)據(jù)集進(jìn)行管理和運(yùn)算):
j. 可信密鑰交換函數(shù)
- sgx_ra_init、sgx_ra_init_ex、sgx_ra_get_keys、sgx_ra_close:用于遠(yuǎn)程驗(yàn)證和交換密鑰的管理和操作。
?k. Intel受保護(hù)文件系統(tǒng)庫(kù)?
提供了常規(guī)C語(yǔ)言文件操作API的子集,寫過程中,文件被加密存儲(chǔ)在不可信磁盤中,讀取過程中會(huì)驗(yàn)證文件的機(jī)密性和完整性,功能上總體接近傳統(tǒng)的文件庫(kù)函數(shù)。
l. TCMalloc庫(kù)
- malloc、free、realloc、calloc、memalign:提供了可信的經(jīng)過安全審計(jì)的TCMalloc庫(kù)版本(sgx_tcmalloc庫(kù),從gperftools-2.5移植)
m. Switchless調(diào)用庫(kù)
不可信世界包含switchless調(diào)用的不可信部分,如sgx_create_enclave_ex使用switchless模式創(chuàng)建enclave;可信世界中l(wèi)ibsgx_tswitchless.a庫(kù)提供switchless調(diào)用的可信部分,主要是維護(hù)可信世界中switchless調(diào)用的特性,能夠讓不可信世界switchless調(diào)用能夠進(jìn)入到可信世界正常運(yùn)作。(見下文“SGX Switch模式及Switchless模式”章節(jié))
n. 受保護(hù)代碼加載器庫(kù)
維護(hù)不可信世界的“受保護(hù)代碼加載”
2. 不可信運(yùn)行時(shí)庫(kù)
a. Enclave創(chuàng)建與銷毀
b. 證明函數(shù)
向應(yīng)用程序或Enclave程序證明目標(biāo)Enclave程序的確運(yùn)行在SGX環(huán)境中。
c. 不可信密鑰交換函數(shù)
用于不可信環(huán)境下遠(yuǎn)端服務(wù)器和Enclave程序的秘密交換
d. 不可信平臺(tái)服務(wù)函數(shù)
sgx_get_ps_cap:說明平臺(tái)服務(wù)PSE支持哪些功能
e. Intel SGX 使能和啟動(dòng)控制函數(shù)
f. Intel SGX 設(shè)備能力函數(shù)
3. SGX API應(yīng)用舉例——本地DH會(huì)話建立
想象這樣一個(gè)場(chǎng)景,一個(gè)應(yīng)用程序啟動(dòng)了若干不同Enclave實(shí)例,我們想讓實(shí)例間構(gòu)建起可信的會(huì)話通道,既ECDH密鑰交換及會(huì)話建立(API函數(shù)見上文“Diffie–Hellman (DH)會(huì)話建立函數(shù)”章節(jié))。
下文“橋函數(shù)”章節(jié)將會(huì)具體講述應(yīng)用程序如何進(jìn)出Enclave。這里將簡(jiǎn)化此細(xì)節(jié),直接表述為應(yīng)用程序從不可信環(huán)境切換環(huán)境進(jìn)入Enclave。
如圖8所示,這里描述Enclave1、Enclave2(簡(jiǎn)稱E1、E2)之間的會(huì)話建立。創(chuàng)建E1、E2實(shí)例,線程從APP切換至E1,然后調(diào)用sgx_dh_init_session這個(gè)API函數(shù)進(jìn)入可信運(yùn)行時(shí)(tRTS,由SDK提供,tRTS和Enclave同處于安全世界,不需要環(huán)境切換),將自己標(biāo)記為會(huì)話請(qǐng)求方。E1會(huì)繼續(xù)要求外部應(yīng)用程序轉(zhuǎn)告E2它想要和E2建立通訊。
切換至E2后,E2調(diào)用sgx_dh_init_session進(jìn)入tRTS將自己初始化為應(yīng)答方,然后調(diào)用sgx_dh_responder_gen_msg1,這樣會(huì)調(diào)用硬件指令EREPOTE產(chǎn)生E2的報(bào)告,此外創(chuàng)建E2的公私鑰對(duì),把公鑰、報(bào)告封裝成Msg1用于返回給E1。
E1調(diào)用sgx_dh_initiator_proc_msg1處理Msg1產(chǎn)生Msg2:E1創(chuàng)建自己的公私鑰對(duì),通過指令創(chuàng)建E1報(bào)告,用Msg1的E2公鑰和E1私鑰創(chuàng)建共享密鑰,將E1公鑰、報(bào)告等封裝成Msg2交給E2。
E2最終會(huì)返回Msg3:E2調(diào)用sgx_dh_responder_proc_msg2處理Msg2,既用E1公鑰和E2私鑰構(gòu)建共享密鑰,并用Msg2中的共享密鑰散列值驗(yàn)證之。
E1調(diào)用sgx_dh_initiator_proc_msg3處理Msg3。最后驗(yàn)證對(duì)方身份完成會(huì)話建立。
(可以見博客——SGX本地認(rèn)證)
SGX開發(fā)特點(diǎn)
與傳統(tǒng)的C++程序開發(fā)不同,SGX應(yīng)用程序會(huì)分為兩塊,一塊是執(zhí)行在Enclave中的代碼,一塊是執(zhí)行在普通環(huán)境中的代碼。此外,需要在.edl文件中的trusted標(biāo)記中寫上在Enclave中執(zhí)行的函數(shù)的聲明,在untrusted標(biāo)記中寫上在普通環(huán)境中執(zhí)行的函數(shù)的聲明。
SgxEdger8r(SGX Edge Routine,主要用于在編譯過程中對(duì).edl文件中的ecall和ocall重新封裝編寫,即將用戶編寫的e/ocall改寫成實(shí)際執(zhí)行的e/ocall)工具會(huì)在應(yīng)用程序編譯過程中根據(jù)edl文件將可信與不可信函數(shù)聲明重新封裝成給Enclave環(huán)境、普通環(huán)境下代碼所調(diào)用的橋函數(shù),實(shí)現(xiàn)兩種環(huán)境之間的切換。如普通環(huán)境下代碼調(diào)用橋函數(shù)會(huì)進(jìn)而通過sgx_ecall進(jìn)入Enclave環(huán)境,Enclave環(huán)境下代碼調(diào)用橋函數(shù)進(jìn)而通過sgx_ocall進(jìn)入普通環(huán)境,其中調(diào)用sgx_e/ocall的代碼由SgxEdger8r根據(jù)用戶編寫在edl文件中trusted/untrusted標(biāo)記下的函數(shù)聲明來(lái)自動(dòng)生成,即具體的進(jìn)出Enclave代碼不需要用戶來(lái)實(shí)現(xiàn),只需要打上標(biāo)記即可。
環(huán)境切換步驟如下:第一步,通過工具生成的橋函數(shù)會(huì)調(diào)用sgx_ecall、sgx-ocall進(jìn)而調(diào)用硬件指令來(lái)切換環(huán)境;第二步,由于那些打上標(biāo)記的函數(shù)本身有用戶定義的執(zhí)行代碼,因此在切換環(huán)境后會(huì)進(jìn)入真正的函數(shù)定義。舉個(gè)例子,Main()->不可信環(huán)境ECALL_A()->sgx_ecall()->EENTER->可信環(huán)境ECALL_A()。
總而言之,這些打上標(biāo)記的函數(shù)聲明會(huì)最終由SgxEdger8r工具在編譯過程中改造成橋函數(shù),用于切換環(huán)境,然后執(zhí)行函數(shù)聲明對(duì)應(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)境中傳遞一個(gè)“指向緩沖區(qū)的指針”等參數(shù),需要在.edl文件的函數(shù)形參前面聲明如[in]、[out]等參數(shù)標(biāo)記,這是因?yàn)槠胀ōh(huán)境的內(nèi)存往往是不可信的,通過比如將普通環(huán)境下的緩沖區(qū)拷貝一份到Enclave環(huán)境中,然后Enclave代碼在拷貝進(jìn)Enclave的緩沖區(qū)上進(jìn)行操作等才是放心的,不會(huì)中途被惡意篡改等,最后可能再拷貝到普通環(huán)境供普通環(huán)境下的程序使用(具體見下文“SGX參數(shù)”章節(jié))。
橋函數(shù)總結(jié)
通過上文的引入,現(xiàn)在總結(jié)一下橋函數(shù):橋函數(shù)是指在SGX平臺(tái)下,唯一能夠切換可信環(huán)境與不可信環(huán)境的方式,調(diào)用硬件指令ENCLU中的EENTER、EEXIT來(lái)具體實(shí)現(xiàn),是由SgxEdger8r工具來(lái)生成。
代碼層面的環(huán)境切換過程大概是這樣,以傳統(tǒng)Switch模式ecall為例(這種模式便于理解,另一種Switchless模式Ecall見“SGX Switch模式及Switchless模式”章節(jié)):
不可信環(huán)境->假裝調(diào)用由用戶定義的ecall函數(shù)->對(duì)應(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ì)將不可信環(huán)境的RSP、RBP保存到SSA結(jié)構(gòu)中,并完成地址的切換進(jìn)入可信環(huán)境。
這里將描述.edl文件中的SGX橋函數(shù)(接口)中參數(shù)或函數(shù)的修飾符說明,用來(lái)具體說明函數(shù)傳參或函數(shù)聲明的具體屬性。ECALL為例子,OCALL類似。
- public void ecall_array_user_check([user_check] int arr[4]);
這里是對(duì)函數(shù)傳參屬性的說明,下同。
[user_check]:Enclave程序使用數(shù)組時(shí)該數(shù)組不會(huì)被驗(yàn)證、數(shù)組對(duì)應(yīng)緩沖區(qū)不會(huì)拷貝到Enclave內(nèi)存中,Enclave可以直接修改應(yīng)用程序中數(shù)組對(duì)應(yīng)的緩沖區(qū)。(這個(gè)例子中參數(shù)為數(shù)組,指針類似)
- public void ecall_array_in([in] int arr[4]);
[in]:Enclave會(huì)在內(nèi)部分配相同大小的緩沖區(qū),外部緩沖區(qū)的內(nèi)容被拷貝到內(nèi)部緩沖區(qū),內(nèi)部緩沖區(qū)內(nèi)容修改不會(huì)導(dǎo)致(不影響)外部緩沖區(qū)任何變化。
- public void ecall_array_out([out] int arr[4]);
[out]:內(nèi)部緩沖區(qū)的修改在函數(shù)返回時(shí)拷貝到外部緩沖區(qū)。
- public void ecall_array_in_out([in, out] int arr[4]);
[in, out]:Enclave內(nèi)部會(huì)分配一個(gè)緩沖區(qū),將數(shù)組緩沖區(qū)拷貝進(jìn)來(lái),同時(shí)在函數(shù)返回時(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的變量是一個(gè)數(shù)組。
- public void ecall_pointer_string([in, out, string] char *str);
[string]:告訴Edger8r,變量str參數(shù)是一個(gè)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對(duì)應(yīng)的緩沖區(qū)的字節(jié)數(shù)。不能對(duì)[string]屬性施加[size]屬性。
- public void ecall_pointer_count([in, out, count=cnt] int *arr, size_t cnt);
[count]:告訴Edger8r需要拷貝的arr的長(zhǎng)度。
- public void ecall_pointer_isptr_readonly([in, isptr, readonly, size=len] buffer_t buf, size_t len);
[isptr]:告訴Edger8r自定義類型是一個(gè)指針。
[readonly]:禁止Enclave內(nèi)部分配的緩沖區(qū)被拷貝到外部去,因此不能與[out]同時(shí)使用。
- public void ecall_function_public(void);
這里是對(duì)函數(shù)聲明屬性的描述,下同。
[public]:外部可以直接調(diào)用該Ecall
- int ecall_function_private(void);
[private]:默認(rèn),外部不可以直接調(diào)用該Ocall,除非有Ocall調(diào)用這個(gè)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來(lái)進(jìn)入Enclave環(huán)境,類似的,通過Ocall離開Enclave環(huán)境。關(guān)于Ecall效率方面,傳統(tǒng)的Switch模式,應(yīng)用程序?qū)?yīng)的線程(該進(jìn)程只有一個(gè)Main線程)會(huì)切換進(jìn)入Enclave環(huán)境,然后拿上它在Enclave環(huán)境的“工作證”,也就是綁定上TCS這個(gè)結(jié)構(gòu)體,進(jìn)行具體的用戶定義的Ecall函數(shù)的執(zhí)行。
但是這種模式,只能使用一個(gè)線程來(lái)完成具體任務(wù)(我們將這種調(diào)用用戶定義的Ecall函數(shù)稱為Ecall任務(wù),此外還有Ocall任務(wù)),效率很低,同時(shí)還有伴隨開銷,比如進(jìn)入Enclave環(huán)境需要拿起TCS“工作證”。因?yàn)槟壳斑€不支持unix的線程庫(kù),因此在Enclave中不支持創(chuàng)建線程,只能支持互斥量、條件變量等的維護(hù)(用于外部應(yīng)用程序創(chuàng)建多個(gè)線程分別進(jìn)入Enclave的場(chǎng)景),目前不支持線程庫(kù)的原因是一方面Enclave程序旨在保護(hù)敏感代碼,而遠(yuǎn)不需要?jiǎng)?chuàng)建線程等功能,另一方面出于數(shù)據(jù)依賴性、安全性等考量。
為了提高效率問題,定義了Switchless模式,如圖9所示。以Ecall為例,uRTS為外部應(yīng)用程序提供了Ecall任務(wù)池,以及聯(lián)合tRTS初始化了多個(gè)可信Worker線程來(lái)具體執(zhí)行Ecall任務(wù)。舉例來(lái)說,外部應(yīng)用程序調(diào)用了Ecall_A、Ecall_B,Switch做法是只有一個(gè)線程,它執(zhí)行Ecall_A之后后回到不可信環(huán)境繼而執(zhí)行Ecall_B,是一種上下文環(huán)境切換的概念;Switchless做法是構(gòu)建好Ecall Table管理器保存可能執(zhí)行的Ecall函數(shù),同時(shí)構(gòu)建一個(gè)任務(wù)池用于記錄每個(gè)Ecall具體執(zhí)行的先后順序,uRTS線程會(huì)喚醒空閑的可信Worker線程從任務(wù)池中取任務(wù),然后查詢Call Table,進(jìn)而完成具體任務(wù),因此省去了上下文環(huán)境切換的開銷。Ocall方向的類似。
圖9:Switchless模式調(diào)用架構(gòu)
SGX初始化
基本介紹
這張圖改自Intel SGX手冊(cè)的一張圖(一年前看的,實(shí)在記不住在哪個(gè)位置了)。相對(duì)于那張圖,我把PMH、ME兩個(gè)硬件模塊畫上去了。
下圖是Enclave初始化時(shí)硬件間關(guān)系圖,Enclave初始化大致經(jīng)歷了(1)申請(qǐng)Enclave內(nèi)存,(2)創(chuàng)建SECS數(shù)據(jù)結(jié)構(gòu),(3)加載Enclave代碼進(jìn)Enclave內(nèi)存,(4)度量Enclave代碼,(5)完成初始化。
圖中最下面的內(nèi)存中一塊特定區(qū)域用作Enclave內(nèi)存(一般稱為Enclave Page Cache,EPC)。SECS是存儲(chǔ)在EPC中的一個(gè)重要數(shù)據(jù)結(jié)構(gòu),用于Enclave管理。EPCM是存儲(chǔ)于EPC中實(shí)施EPC訪問控制的數(shù)據(jù)結(jié)構(gòu)。CPU中的MEE硬件模塊負(fù)責(zé)對(duì)EPC加密,防止物理攻擊。CPU中的PMH硬件模塊負(fù)責(zé)查詢EPCM項(xiàng)并實(shí)施EPC訪問控制。
以sgx_create_enclave為例初始化Enclave,源碼流程如圖所示。sgx_create_enclave擴(kuò)展支持SGX?PCL、Switchless Calls 初始化和Key Separation & Sharing (KSS).
環(huán)境檢查總結(jié)
SGX初始化過程中部分?jǐn)U展特性的聲明、驗(yàn)證和配置(Switchless特性、PCL特性、KSS特性)。
| ex_features_p數(shù)組項(xiàng) | 說明 |
| 0 | pointer to an Intel? SGX PCL sealed key |
| 1 | pointer to the sgx_uswitchless_config_t structure |
| 2 | pointer to the sgx_kss_config_t structure |
| 3:31 | reserved, must be NULL |
將Enclave文件映射到進(jìn)程的虛擬地址空間。這個(gè)映射的位置就是下圖Enclave虛擬內(nèi)存視圖的虛框部分。
將Enclave文件這個(gè)ELF文件進(jìn)行全面的ELF格式解析,驗(yàn)證Enclave文件格式的正確性,以及對(duì)Enclave文件中關(guān)鍵信息(關(guān)鍵符號(hào)、動(dòng)態(tài)Section、元數(shù)據(jù)【其中包括重要的Enclave布局信息等】)進(jìn)行記錄,后續(xù)在構(gòu)建Enclave時(shí)經(jīng)常會(huì)用到這些信息。比如布局直接填充到ELRANGE,起ELRANGE結(jié)構(gòu)性(堆、棧、TCS等)格局作用,比如動(dòng)態(tài)Section中的REL、PLT用于重定位過程,比如關(guān)鍵符號(hào)用于進(jìn)出Enclave時(shí)提供出入口。
對(duì)當(dāng)前軟件棧平臺(tái)進(jìn)行驗(yàn)證,尤其是版本情況進(jìn)行匹配驗(yàn)證。
對(duì)當(dāng)前CPU的X擴(kuò)展特性進(jìn)行驗(yàn)證、分析和記錄,后續(xù)構(gòu)建Enclave過程中,需要依據(jù)X特性對(duì)細(xì)節(jié)進(jìn)行指定,比如根據(jù)X特性支持情況,在進(jìn)出Enclave時(shí)候針對(duì)X特性,額外保存X特性相關(guān)的上下文環(huán)境(比如SSE、AVX、MPX等CPU擴(kuò)展特性的上下文內(nèi)容,并且值得提醒的是Enclave內(nèi)外是兩套不同的上下文環(huán)境)。一切的目的是為了讓SGX和CPU擴(kuò)展特性有更好地兼容,并且不會(huì)引入任何安全問題。
環(huán)境檢查的事情終于做完了,然后會(huì)進(jìn)入__create_enclave函數(shù)來(lái)完成Enclave的創(chuàng)建。
uRTS端構(gòu)建Enclave總結(jié)
包括部分?jǐn)U展特性的聲明、驗(yàn)證和配置(Switchless特性、PCL特性、KSS特性)。
SGX元數(shù)據(jù)的驗(yàn)證,后面會(huì)用到。
將SGX驅(qū)動(dòng)綁定的設(shè)備作為Enclave或者說ELRANGE的基址,構(gòu)建SECS(管理并代表一個(gè)Enclave的數(shù)據(jù)結(jié)構(gòu)),并加載到EPC中。
對(duì)Enclave文件映射打補(bǔ)丁,將一些全局變量等信息更新到Enclave文件映射,后續(xù)會(huì)使用Enclave文件映射構(gòu)建ELRANGE。
將PT_LOAD、PT_TLS等類型的Segment加載到ELRANGE和對(duì)應(yīng)的EPC中。
將元數(shù)據(jù)中堆、線程上下文等布局信息加載到ELRANGE和對(duì)應(yīng)的EPC中。
布局情況可以參考下圖
上面提到SECS的構(gòu)建會(huì)涉及到ECREATE硬件指令,并且任何頁(yè)加載到EPC的過程都會(huì)涉及到EADD、EEXTEND硬件指令。并且ECREATE、EADD、EEXTEND都是Ring0權(quán)限的ENCLS硬件指令,需要SGX驅(qū)動(dòng)來(lái)完成。
之后EINIT硬件指令判斷Enclave加載過程是否可信,是否是一個(gè)可信啟動(dòng)過程。
uRTS維護(hù)Enclave、tRTS端構(gòu)建Enclave總結(jié)
?
uRTS維護(hù)一個(gè)CEnclave類用來(lái)管理使用Enclave。
如果開啟了調(diào)試模式,那么就對(duì)調(diào)試模式的相關(guān)功能進(jìn)行初始化,比如VTune。
uRTS請(qǐng)求裁剪敏感的或者動(dòng)態(tài)的EPC頁(yè)。
進(jìn)入tRTS完成Enclave初始化相關(guān)的配套工作,比如ELRANGE的符號(hào)、地址重定位過程,比如字符串庫(kù)、加密庫(kù)的優(yōu)選過程,比如保留內(nèi)存、線程棧保護(hù)機(jī)制的初始化,比如初始化或調(diào)整線程棧、TCS等線程相關(guān)信息。此外還有就是對(duì)之前敏感或動(dòng)態(tài)頁(yè)的裁剪申請(qǐng)進(jìn)行批準(zhǔn)接受(調(diào)用EACCEPT硬件指令,Ring3權(quán)限的ENCLU硬件指令)。
這里進(jìn)出Enclave都是通過上下文切換的方式。
收尾及Switchless模式初始化步驟總結(jié)
將通過裁剪申請(qǐng)的裁剪頁(yè)重新放入到可用EPC頁(yè)中。
mprotect設(shè)置ELRANGE中各個(gè)Section的訪問屬性以及各個(gè)Segment對(duì)應(yīng)的訪問屬性
如果元數(shù)據(jù)版本較新,并且當(dāng)前環(huán)境支持EDMM,那么對(duì)PT_GNU_RELRO、PT_LOAD的Segment,用Ring0權(quán)限的EMODPR硬件指令來(lái)設(shè)置這些頁(yè)的訪問權(quán)限為RX,Ring0權(quán)限的EMODPR硬件指令會(huì)對(duì)管理EPC屬性的EPCM進(jìn)行調(diào)整設(shè)置。rsrv內(nèi)存用EMODPR改為RW。不支持EDMM等情況,就不進(jìn)行改動(dòng)。
針對(duì)上下文相關(guān)的內(nèi)存,內(nèi)存訪問控制屬性用mprotect設(shè)置為RW。rsrv內(nèi)存在不支持EDMM情況下,不要用mprotect改變它的屬性。
針對(duì)EREMOVE掉的頁(yè),需要用mprotect設(shè)置為PROT_NONE,不然這個(gè)頁(yè)一旦被訪問,會(huì)發(fā)生總線異常(sigbus exception),因?yàn)檫@個(gè)EPC頁(yè)已經(jīng)被EREMOVE硬件指令給從當(dāng)前Enclave中去除,EPCM也沒有再維護(hù)EREMOVE掉的頁(yè)的信息。
上面所涉及到的ELRANGE的頁(yè)本身在ECREATE、EADD、EREMOVE時(shí)就設(shè)置或更改了基本的EPCM項(xiàng),這里主要是進(jìn)行調(diào)整,以及在進(jìn)程虛擬地址空間用mprotect進(jìn)行訪問控制設(shè)置。
填充TCS最小池,使得TCS最小池現(xiàn)有的TCS數(shù)量達(dá)到最低要求。
Switchless模式的初始化。
Intel SGX ECALL
ECALL Switch/Ordinary總結(jié)
這種方式時(shí)SGX最初支持也是最直接的ECALL方式,切換上下文進(jìn)入Enclave,但是這種切換上下文(EENTER【ENCLU.0x02】)的開銷非常大,幾千個(gè)Cycle,可以查看《Eleos: ExitLess OS services for SGX enclaves》,后來(lái)相關(guān)學(xué)者及Intel就推出了Switchless方案。
這個(gè)總結(jié)主要講ECALL Switch/Ordinary
線程想要執(zhí)行ECALL,那么就帶上ECALL索引值并申請(qǐng)一個(gè)TCS(TCS相當(dāng)于線程進(jìn)入tRTS的許可證或者工作證),然后將uRTS的上下文保存到SSA中,通過EENTER硬件指令切換上下文進(jìn)入tRTS,第一次進(jìn)入tRTS時(shí)的上下文來(lái)自于一個(gè)預(yù)置的模板,并且進(jìn)入到tRTS的enclave_entry地址,之后按照ECALL索引值查ECALL表得到ECALL的虛擬地址并執(zhí)行之。需要補(bǔ)充的是,剛進(jìn)入tRTS時(shí),線程需要確保線程棧保護(hù)機(jī)制開啟、線程數(shù)據(jù)已經(jīng)初始化過。
如果進(jìn)入Enclave是因?yàn)?#xff1a;進(jìn)入到tRTS完成SGX初始化的部分工作;OCALL返回重新進(jìn)入到Enclave內(nèi)部;進(jìn)入tRTS動(dòng)態(tài)構(gòu)建TCS;重新進(jìn)入tRTS為了處理異常(《進(jìn)入Enclave的目的歸類》)。那么就需要調(diào)用各自的處理函數(shù)來(lái)解決這些個(gè)特殊目的。
對(duì)于OCALL返回重新進(jìn)入到Enclave內(nèi)部,線程會(huì)使用之前OCALL時(shí)保存到tRTS的SSA進(jìn)行上下文的恢復(fù)。對(duì)于AEX,是通過ERESUME硬件指令重新進(jìn)入Enclave。
《SGXv2.8起Enclave內(nèi)新增pthread庫(kù)》從linux-sgx v2.8開始,SGX支持在tRTS創(chuàng)建pthread線程,這個(gè)會(huì)要求在tRTS內(nèi)部開辟線程空間,然后OCALL到uRTS創(chuàng)建pthread線程并分配TCS給這個(gè)pthread線程。創(chuàng)建pthread線程者會(huì)重新回到tRTS中(OCALL返回),新創(chuàng)建的pthread線程會(huì)切換上下文進(jìn)入到tRTS。
ECALL Switchless總結(jié)
SGX初始化末期的時(shí)候,根據(jù)用戶選擇,可以對(duì)ECALL Switchless進(jìn)行初始化。此時(shí)主要完成的任務(wù)是uRTS端的ECALL Switchless初始化。(SGXv2.8調(diào)整后,tRTS端初始化Switchless的操作被放到了第一次Swtichless ECALL時(shí)執(zhí)行)
內(nèi)容主要包括:
(SGXv2.8調(diào)整后,tRTS端初始化Switchless的操作被放到了第一次Swtichless ECALL時(shí)執(zhí)行)
當(dāng)發(fā)生第一個(gè)Switchless ECALL時(shí),主線程需要切換上下文進(jìn)入Enclave,并在tRTS端對(duì)ECALL Switchless進(jìn)行初始化,主要是為了讓tRTS內(nèi)部也保管一份uSwtichless管理器,并往tRTS內(nèi)部傳入OCALL表。然后喚醒所有工人線程,其中tWorker切換上下文進(jìn)入tRTS,并且在tRTS初始化ECALL管理器、信號(hào)線和ECALL表,等待著信號(hào)置位并處理ECALL任務(wù)。
調(diào)用ECALL Switchless者,會(huì)開始構(gòu)建ECALL任務(wù)并發(fā)送信號(hào)(將信號(hào)線某個(gè)空閑的Bit置位),此時(shí)ECALL任務(wù)的狀態(tài)從【SL_INIT】變成【SL_SUBMITTED】,然后將ECALL任務(wù)放到ECALL管理器開辟的任務(wù)池中,并循環(huán)等待tWorker線程接收【SL_ACCEPTED】及處理完【SL_DONE】ECALL任務(wù)。
tWorker工人線程這邊,第一次進(jìn)入Enclave時(shí),會(huì)在tRTS端初始化ECALL管理器、信號(hào)線管理器和ECALL表。然后tWorker工人線程就循環(huán)等待信號(hào)置位。當(dāng)接收到信號(hào)時(shí),它就將ECALL任務(wù)取出,并將ECALL任務(wù)狀態(tài)設(shè)置為【SL_ACCEPTED】。然后tWorker工人線程根據(jù)ECALL任務(wù)中的索引值查ECALL表并執(zhí)行對(duì)應(yīng)ECALL,執(zhí)行完后將ECALL任務(wù)狀態(tài)設(shè)置為【SL_DONE】。
OCALL Switch/Ordinary總結(jié)
這個(gè)OCALL Switch/Ordinary和ECALL Switch/Ordinary非常相像,就是方向反了。
將tRTS的上下文保存到SSA,然后使用EEXIT【ENCLU.0x04】回到uRTS并從之前進(jìn)入tRTS時(shí)保存的SSA中上下文信息來(lái)恢復(fù)uRTS的上下文。EEXIT【ENCLU.0x04】的返回點(diǎn)是當(dāng)時(shí)EENTER【ENCLU.0x02】的下一條指令。然后用OCALL索引值查OCALL表獲得OCALL的虛擬地址并執(zhí)行之。
OCALL Switchless總結(jié)
和ECALL Switchless和接近
總結(jié)
以上是生活随笔為你收集整理的小谈Intel SGX的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 插入USB麦克风电脑没有声音了的解决方法
- 下一篇: 基于springboot和mysql的人