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