文/程越強(qiáng)
Intel SGX 技術(shù)是一種新的基于硬件的可信計(jì)算技術(shù)。該技術(shù)通過(guò)CPU的安全擴(kuò)展,對(duì)用戶空間運(yùn)行環(huán)境(enclave)提供機(jī)密性和完整性保護(hù)。即使是攻擊者獲得 OS、hypervisor、BIOS 和 SMM 等權(quán)限,也無(wú)法直接攻擊enclave。因此,攻擊者不得不通過(guò)側(cè)信道的攻擊方法來(lái)間接獲取數(shù)據(jù)(比如隱私數(shù)據(jù),加密密鑰等)。得益于enclave 的強(qiáng)安全假設(shè)和工作模型,攻擊者有大量的側(cè)信道攻擊面可以選擇,比如頁(yè)表、Cache 、DRAM 等。這項(xiàng)工作是對(duì)側(cè)信道攻擊面進(jìn)行一個(gè)全面的總結(jié),并討論一些可能的防御和檢測(cè)方法。
當(dāng)我們不能夠完全相信某個(gè)計(jì)算平臺(tái)(比如公有云和可能被攻破的操作系統(tǒng))的時(shí)候,建立一個(gè)可信的運(yùn)行環(huán)境(TEE)是非常重要的安全要求。近些年研究人員提出了很多TEE 系統(tǒng)用于保護(hù)應(yīng)用程序,使其能夠抵御來(lái)自操作系統(tǒng)的攻擊。
Enclave 的運(yùn)行環(huán)境有大量的資源和外面non-enclave 公用,比如Cache 、頁(yè)表、DRAM 和分支預(yù)測(cè)器等,這就給攻擊者提供了豐富的側(cè)信道攻擊面。而且,不可信的操作系統(tǒng)還仍然負(fù)責(zé)管理系統(tǒng)的資源,比如頁(yè)表、內(nèi)存、中斷、進(jìn)程調(diào)度等,這就進(jìn)一步方便攻擊者減小側(cè)信道攻擊過(guò)程中的噪音,從而提高側(cè)信道攻擊的成功率。
本文主要調(diào)研和總結(jié)目前已有的側(cè)信道攻擊。根據(jù)攻擊面的不同,將從頁(yè)表、TLB、Cache 、DRAM 和分支預(yù)測(cè)器等幾個(gè)面進(jìn)行側(cè)信道攻擊的介紹。SGX 的側(cè)信道攻擊十分難以防御。目前還沒(méi)有一種防御策略可以防御以上所有攻擊。本文最后對(duì)可能的側(cè)信道防御攻擊方法進(jìn)行簡(jiǎn)要的總結(jié),希望讀者能夠在某些方面受到啟發(fā)。
Intel SGX 是一種基于硬件的TEE系統(tǒng)。該功能已經(jīng)集成在Intel Sky-Lake 系列。區(qū)別以往的TEE 系統(tǒng)有著較大的可信計(jì)算基(TCB),SGX 的可信計(jì)算基非常小,僅僅包含CPU 和enclave 本身。任何的特權(quán)軟件,比如OS、hypervisor、BIOS、SMM等都不包含在可信計(jì)算基內(nèi)。Enclave有SGX 硬件專門預(yù)留的EPC(Enclave Page Cache )內(nèi)存。EPC是PRM(processor reserved memory)的子集,并被系統(tǒng)軟件按照4KB粒度進(jìn)行分頁(yè)管理。每一個(gè)EPC 頁(yè)面只能分配給一個(gè)enclave。CPU 阻止任何nonenclave 去訪問(wèn)PRM,任何non-enclave 的訪問(wèn)都會(huì)導(dǎo)致一個(gè)失敗的事務(wù)(aborted transaction)。在目前SkyLake 的處理器上面,失敗的寫(xiě)操作被忽略,失敗的讀操作直接返回一個(gè)全1的值。
每個(gè)enclave 的程序指定一段ELRANGE(Enclave Linear AddressRange)的虛擬空間供自身運(yùn)行。頁(yè)表負(fù)責(zé)把虛擬地址映射為EPC所在的物理地址。頁(yè)表的工作原理和以往的頁(yè)表一樣,比如會(huì)進(jìn)行權(quán)限的檢測(cè)、會(huì)設(shè)置access bit和dirty bit等等。Enclave 和 non-enclave 可以通過(guò)EENTER 和EEXIT 來(lái)主動(dòng)切換工作模式。Enclave 運(yùn)行時(shí)可能會(huì)被中斷或者異常打斷,這個(gè)時(shí)候enclave 會(huì)通過(guò)AEX(Asynchronous EnclaveExit)機(jī)制退出,切換到non-enclave工作模式。在模式切換過(guò)程中,運(yùn)行狀態(tài)會(huì)保存到SSA(State Save Area )結(jié)構(gòu)體里面,同時(shí)清除TLB以保證enclave 的安全。
圖1是 Intel SGX 內(nèi)存分布和隔離機(jī)制。Enclave 跑在EPC 上面。Enclave的數(shù)據(jù)僅可以被enclave 自己訪問(wèn),任何外界代碼的訪問(wèn)都會(huì)被拒絕。

圖1 Intel SGX 內(nèi)存分布和隔離機(jī)制
威脅模型
側(cè)信道攻擊主要目標(biāo)是攻擊enclave數(shù)據(jù)的機(jī)密性(confidentiality)。攻擊者來(lái)自non-enclave 部分,包括應(yīng)用程序和系統(tǒng)軟件。系統(tǒng)軟件包括OS、hypervisor、SMM、BIOS 等特權(quán)級(jí)軟件。
側(cè)信道攻擊一般假設(shè)攻擊者知道enclave 初始化時(shí)的代碼和數(shù)據(jù),并且知道內(nèi)存布局。內(nèi)存布局包括虛擬地址,物理地址以及他們之間的映射關(guān)系。側(cè)信道攻擊還假設(shè)攻擊者知道運(yùn)行enclave 平臺(tái)的硬件配置、特性和性能,比如CPU、TLB、Cache 、DRAM、頁(yè)表、中斷以及異常等各種系統(tǒng)底層機(jī)制。

圖2 Intel SGX 側(cè)信道的攻擊面
側(cè)信道的攻擊面
enclave和non-enclave共享大量的系統(tǒng)資源,這就給側(cè)信道攻擊留下了非常大的攻擊面。經(jīng)過(guò)對(duì)現(xiàn)有資料的總結(jié)和系統(tǒng)結(jié)構(gòu)的分析,我們把SGX的攻擊總結(jié)在圖2中。如圖2所示,enclave 的運(yùn)行過(guò)程中會(huì)用到:
1. CPU 內(nèi)部結(jié)構(gòu)。比如pipeline,branch prediction Buffer(BPB)等,這些結(jié)構(gòu)不能夠直接訪問(wèn),但是如果可以間接利用,仍然可能泄露enclave的控制流或數(shù)據(jù)流。
2.TLB。TLB 有包括iTLB、dTLB和L2 TLB。如果HyperThreading打開(kāi),兩個(gè)邏輯核共享一個(gè)物理核,這個(gè)時(shí)候會(huì)大大增加側(cè)信道的可能。
3.Cache 。Cache包 括 L1 instruction Cache 、L1 data Cache 、L2Cache和 L3 Cache (又叫 LLC Cache )。
4. DRAM。DRAM 包含 channels、DIMMs、ranks、banks。每個(gè) banks又包含rows、columns 和 row buffer。
5.Pagetable(頁(yè)表)。頁(yè)表可以通過(guò)權(quán)限控制來(lái)觸發(fā)缺頁(yè)異常,也可以通過(guò)頁(yè)表的狀態(tài)位來(lái)表明CPU 的某些操作。對(duì)于不同的攻擊面,攻擊者需要了解具體的細(xì)節(jié)和工作原理。其中比較重要的參考的文檔就是Intel 的手冊(cè)。目前SGX 已經(jīng)部署在SkyLake 的機(jī)器上面。因此我們需要對(duì)SkyLake 的一些硬件和性能細(xì)節(jié)重點(diǎn)掌握。
側(cè)信道攻擊
側(cè)信道攻擊主要手段是通過(guò)攻擊面獲取數(shù)據(jù),推導(dǎo)獲得控制流和數(shù)據(jù)流信息,最終獲取被enclave的代碼和數(shù)據(jù)的信息,比如加密密鑰、隱私數(shù)據(jù)等等。在此一一列舉具體的工作,而是試圖從攻擊面的角度,全面的介紹側(cè)信道攻擊。本章節(jié)下面的內(nèi)容,就從典型的攻擊面,包括頁(yè)表、TLB、Cache、DRAM以及CPU內(nèi)部結(jié)構(gòu),描述目前已知的側(cè)信道攻擊。
1. 基于頁(yè)表的攻擊
最早的SGX側(cè)信道攻擊就是基于頁(yè)表的攻擊。這類利用頁(yè)表對(duì)enclave頁(yè)面的訪問(wèn)控制權(quán),設(shè)置enclave頁(yè)面為不可訪問(wèn)。這個(gè)時(shí)候任何訪問(wèn)都會(huì)觸發(fā)缺頁(yè)異常,從而能夠區(qū)分enclave訪問(wèn)了哪些頁(yè)面。按照時(shí)間順序把這些信息組合,就能夠反推出enclave的某些狀態(tài)和保護(hù)的數(shù)據(jù)。該類典型的攻擊包括controlledchannel attack和pigeonholeattack。這類攻擊的缺點(diǎn)就是精度只能達(dá)到頁(yè)粒度,無(wú)法區(qū)分更細(xì)粒度的信息。但是在某些場(chǎng)景下,這類攻擊已經(jīng)能夠獲得大量有用信息。
后來(lái),基于頁(yè)表的攻擊有了新的變種。這些側(cè)信道攻擊主要利用頁(yè)表的狀態(tài)位。一個(gè)頁(yè)表項(xiàng)有很多位,有些是用來(lái)做訪問(wèn)控制,比如P, RW, US, XD,有些則標(biāo)識(shí)狀態(tài),比如D(dirty bit)和A(accessbit)。如果A bit 被設(shè)置,則表明該頁(yè)表項(xiàng)指向的頁(yè)面已經(jīng)被訪問(wèn);如果Dbit被設(shè)置,則表明該頁(yè)表項(xiàng)指向的頁(yè)面發(fā)生了寫(xiě)操作。通過(guò)監(jiān)控觀察這些狀態(tài)位,攻擊者就可以獲取和controlled-channel/pigeonhole 攻擊類似的信息。
2.基于 TLB 的攻擊
目前還沒(méi)有完全基于TLB 的攻擊,但是已經(jīng)出現(xiàn)TLB 作為輔助手段的側(cè)信道攻擊。關(guān)于TLB的兩點(diǎn)重要信息,我們需要了解,希望對(duì)提出新的基于TLB 的側(cè)信道攻擊和防御有所幫助。
TLB 的層次結(jié)構(gòu):目前SkyLake 的機(jī)器,分為L(zhǎng)1 和L2 兩層。不同層次出現(xiàn)的TLB miss 的時(shí)間代價(jià)不同。
TLB 對(duì)代碼和數(shù)據(jù)的區(qū)分:L1 區(qū)分代碼(iTLB)和數(shù)據(jù)(dTLB)。兩者直接有Cache coherence 的保證。L2 不區(qū)分代碼和數(shù)據(jù)。
3.基于 Cache 的攻擊
傳統(tǒng)側(cè)信道有很多基于Cache 的攻擊在SGX的環(huán)境里面,這些側(cè)信道技術(shù)仍然適用,而且可以做的更好。原因在于,在SGX 環(huán)境里面攻擊者可以控制整個(gè)系統(tǒng)的資源。因此,攻擊者可以有針對(duì)性地調(diào)度資源,減小側(cè)信道的噪音,增加側(cè)信道的成功率。降低噪音的策略大體可以有以下幾種。
Core Isolation(核隔離)。這個(gè)方法的主要目標(biāo)就是讓enclave 獨(dú)自占有一個(gè)核(不允許其他程序運(yùn)行在該核上面)。
Cache Isolation(緩存隔離)。盡量使用L1 或者L2 級(jí)別的Cache進(jìn)行側(cè)信道攻擊。L3 的Cache被所有的核共用,會(huì)引入不必要的噪音。
Uninterupted Execution(不間斷運(yùn)行)。也就是不觸發(fā)或盡量少觸發(fā)AEX,因?yàn)锳EX 和后續(xù)的ISR(Interrupt Sevice Rountine) 都會(huì)使用Cache ,從而引入不必要噪音。少觸發(fā)AEX 就是要使用中斷綁定(Interrupt Affinity)和將時(shí)鐘頻率。不觸發(fā)AEX 基本上就是讓系統(tǒng)軟件(比如OS)屏蔽所有中斷。
除了降低噪音,攻擊者還可以提高攻擊的精度,大體策略有:一是高精度時(shí)鐘。可以采用APIC 提供的高精度時(shí)鐘和硬件TSC;二是放大時(shí)間差異。比如攻擊者可以配置側(cè)信道攻擊代碼所在的CPU 以最高頻率運(yùn)行,而對(duì)enclave 所在的CPU 進(jìn)行降頻處理。
基于Cache的側(cè)信道攻擊可以進(jìn)行細(xì)粒度的監(jiān)控。最小粒度可以做到一個(gè)Cache line,即64 個(gè)字節(jié)。由于粒度更小,基于Cache的側(cè)信道可以比基于頁(yè)表的側(cè)信道(以及后面介紹的基于DRAM的側(cè)信道)獲得更多的信息。
4.基于DRAM 的攻擊
RAM 一 般 由 channel、DIMM、rank、bank等部分構(gòu)成。每個(gè)bank又有columns 和rows 組成。每個(gè)bank里面還有一個(gè)row buffer 用來(lái)緩存最近訪問(wèn)過(guò)的一個(gè)row。在訪問(wèn)DRAM 的時(shí)候,如果訪問(wèn)地址已經(jīng)被緩存在row buffer當(dāng)中(情況A),就直接從buffer 里面讀取,否則需要把訪問(wèn)地址對(duì)應(yīng)的整個(gè)row都加載到row buffer 當(dāng)中(情況B)。當(dāng)然,如果row buffer 之前緩存了其他row的內(nèi)容,還需要先換出row buffer 的內(nèi)容再加載新的row(情況C)。A、B、C 對(duì)應(yīng)的三種情況,訪問(wèn)速度依次遞減(情況A 最快,情況C 最慢)。這樣,通過(guò)時(shí)間上的差異,攻擊者就可以了解當(dāng)前訪問(wèn)的內(nèi)存地址是否在row buffer 里面,以及是否被換出。
基于DRAM的側(cè)信道攻擊有一些不足:第一,enclave 使用的內(nèi)存通常都在緩存里面,只有少部分需要從DRAM里面去取;第二,DRAM的精度不夠。例如,一個(gè)頁(yè)面(4KB) 通常分布在4 個(gè)DRAM row 上面。這樣,基于DRAM的側(cè)信道攻擊的精度就是1KB。僅僅比基于頁(yè)表的側(cè)信道攻擊好一些,遠(yuǎn)遠(yuǎn)不及基于Cache 的側(cè)信道攻擊的精度;第三,DRAM里面存在很難避免的噪音干擾,因?yàn)橐粋€(gè)DRAM row 被很多頁(yè)面使用,同時(shí)同一個(gè)bank 不同row的數(shù)據(jù)讀取也會(huì)對(duì)時(shí)間測(cè)量造成干擾,使得誤報(bào)時(shí)常發(fā)生。
5.基于CPU 內(nèi)部結(jié)構(gòu)的攻擊
CPU 內(nèi)部有大量的結(jié)構(gòu)是在enclave和non-enclave 之間共用的,這就給側(cè)信道攻擊提供了大量的攻擊面素材。
目前對(duì)以CPU內(nèi)部結(jié)構(gòu)為攻擊面的工作才剛剛開(kāi)始,僅僅有一個(gè)工作發(fā)表。相信通過(guò)進(jìn)一步研究,還會(huì)有其他的攻擊面被陸續(xù)發(fā)掘。
從設(shè)計(jì)上來(lái)講,SGX可以避免這類側(cè)信道攻擊。具體來(lái)講,在enclave到nonenclave的切換過(guò)程中,CPU清除這些共用的內(nèi)部結(jié)構(gòu)體。這樣,non-enclave就不會(huì)得到任何殘留的記錄。但在具體實(shí)現(xiàn)的時(shí)候,還要注意一些細(xì)節(jié),比如清除的時(shí)間也必須是穩(wěn)定不變的。如果enclave運(yùn)行的差異會(huì)導(dǎo)致清除操作的時(shí)間差異,攻擊者很可能據(jù)此推導(dǎo)出enclave的某些運(yùn)行狀態(tài)。
6.混合側(cè)信道攻擊
混合側(cè)信道攻擊是同時(shí)采集多個(gè)側(cè)信道攻擊面的信息,或通過(guò)多個(gè)攻擊面共同作用放大差異增加準(zhǔn)確度。比較典型的做法包括:一是TLB 和頁(yè)表混合攻擊。比如TLB miss 的時(shí)會(huì)加載頁(yè)表,這個(gè)時(shí)候CPU 會(huì)設(shè)置頁(yè)表的Access bi;二是Cache和DRAM 混合攻擊。基于DRAM的攻擊只能精確到row(一個(gè)row 通常8KB)的粒度。
除了結(jié)合兩個(gè)攻擊面的側(cè)信道攻擊,還可以采用多個(gè)攻擊面相結(jié)合的側(cè)信道攻擊。這類混合攻擊我還沒(méi)有在SGX的環(huán)境下面看到相關(guān)工作。
7.未來(lái)可能的側(cè)信道攻擊
未來(lái)新的側(cè)信道攻擊可能來(lái)自兩個(gè)方面。第一就是發(fā)掘新的混合側(cè)信道攻擊。前面列出的經(jīng)典的混合側(cè)信道攻擊,他們往往使用兩種攻擊面信息。因此,我們可以考慮多個(gè)攻擊面結(jié)合的側(cè)信道攻擊。以往的混合側(cè)信道攻擊往往專注于內(nèi)存管理和地址轉(zhuǎn)換等方面,新的側(cè)信道攻擊可以結(jié)合其他方面的信息,進(jìn)行一些新的嘗試。
enclave所有和non-enclave共享的資源都可能成為潛在的側(cè)信道攻擊面。因此,發(fā)掘新的側(cè)信道攻擊的第二個(gè)途徑就是發(fā)現(xiàn)新的共享資源,比如未被發(fā)掘的CPU內(nèi)部共享結(jié)構(gòu)。這些新的的共享資源可能來(lái)自一些新的硬件特性,比如Intel PT、Intel TSX、Intel MPX、Intel CAT等。
目前已經(jīng)有很多文章給出了防御SGX側(cè)信道的方案,有些只是大體的思路,有些則已經(jīng)有成型的設(shè)計(jì)和實(shí)現(xiàn)。我們?cè)谶@里主要介紹防御的思路和方法,不涉及設(shè)計(jì)和實(shí)現(xiàn)的細(xì)節(jié)。首先,我們把這些方法涉及的層次,分為源碼級(jí)別,系統(tǒng)級(jí)別和硬件級(jí)別。
1.源碼層次的解決方案
這類方法的主要思想就是通過(guò)修改源碼,編寫(xiě)出能夠防御側(cè)信道的代碼實(shí)現(xiàn),其核心思想就是隱藏控制流和數(shù)據(jù)流。這類方法的探索已經(jīng)在一些密碼算法中有所涉及。
2.系統(tǒng)層次的解決方案
系統(tǒng)層次的解決方案主要是利用一些系統(tǒng)特性來(lái)防御或檢測(cè)SGX側(cè)信道。這里有幾個(gè)思路可以參考: 隨機(jī)化技術(shù)(Randomization)、 檢測(cè)可疑異常和中斷、檢測(cè)時(shí)間異常、Cache 隔離。
3.硬件層次的解決方案
硬件層次的解決方案還處于探索階段。加上側(cè)信道防御,將會(huì)顯著增加硬件復(fù)雜度,影響功耗和性能。這也可能是Intel 在最初推出SGX的時(shí)候沒(méi)有加入側(cè)信道防御的一個(gè)原因。硬件解決方案可能有硬件分割和硬件隔離兩種。
本文總結(jié)了SGX所面臨的側(cè)信道攻擊,并展望了潛在的攻擊和防御方法。SGX 的側(cè)信道攻擊十分難以防御。究其原因是SGX的安全假設(shè)和應(yīng)用模型允許enclave和不可信的non-enclave共享大量的資源。這些就給攻擊者以很大的攻擊面去區(qū)分時(shí)間上的差異和資源使用的不同,從而泄露enclave的控制流和數(shù)據(jù)流。而且攻擊者擁有管理系統(tǒng)資源的能力,從而能夠最大程度上減小噪音干擾,增加側(cè)信道攻擊的成功率。總之,SGX側(cè)信道攻擊是一個(gè)實(shí)用的攻擊,我們?cè)趯?shí)際部署應(yīng)用SGX的時(shí)候,必須考慮潛在的側(cè)信道攻擊。