鄒德清,張盼,劉偉,陳維杰,陸弈帆
(1. 大數(shù)據(jù)技術(shù)與系統(tǒng)國(guó)家地方聯(lián)合工程研究中心,湖北 武漢 430074;2. 服務(wù)計(jì)算技術(shù)與系統(tǒng)教育部重點(diǎn)實(shí)驗(yàn)室,湖北 武漢 430074; 3. 大數(shù)據(jù)安全湖北省工程研究中心,湖北 武漢 430074;4. 華中科技大學(xué)網(wǎng)絡(luò)空間安全學(xué)院,湖北 武漢 430074; 5. 北京京航計(jì)算通訊研究所,100089 北京)
微架構(gòu)側(cè)信道在硬件架構(gòu)中非常普遍,這些側(cè)信道產(chǎn)生的一個(gè)主要原因是硬件組件被系統(tǒng)內(nèi)的不同進(jìn)程所共享,特別是硬件在設(shè)計(jì)中基于局部性原理引入的各種緩存組件,如緩存、頁表、頁表緩存和分支目標(biāo)緩存等。在執(zhí)行程序過程中,數(shù)據(jù)或代碼是否被暫存到這些組件中會(huì)表現(xiàn)出比較明顯的響應(yīng)時(shí)間差異。由于這些組件被系統(tǒng)內(nèi)的進(jìn)程共享,攻擊者可利用多種方式[1-11]影響進(jìn)程對(duì)緩存組件的使用,然后通過測(cè)量時(shí)間差披露受害程序的運(yùn)行軌跡。
含有微架構(gòu)側(cè)信道漏洞(以下簡(jiǎn)稱漏洞)的程序在運(yùn)行時(shí)會(huì)表現(xiàn)出與機(jī)密輸入有關(guān)的非功能性行為。例如,不同機(jī)密輸入的變化會(huì)影響基于控制流泄露漏洞選擇不同執(zhí)行路徑,或影響基于數(shù)據(jù)訪問泄露的漏洞訪問不同目標(biāo)地址。攻擊者可在獲取程序運(yùn)行軌跡后,還原程序行為,通過分析輸入與漏洞代碼行為間的關(guān)系,還原用戶機(jī)密數(shù)據(jù)內(nèi)容。
常見的側(cè)信道防御策略包括異常檢測(cè)和行為混淆,學(xué)術(shù)界提出了許多硬件層的[12-15]和系統(tǒng)層的[16-24]的解決方法。這些方法都存在性能或兼容性方面的限制,未得到廣泛使用。開發(fā)人員在實(shí)際中傾向于采用細(xì)粒度的靶向防御,即在軟件層對(duì)代碼實(shí)施側(cè)信道漏洞檢測(cè)[25-30],然后修補(bǔ)程序中的側(cè)信道漏洞,這類方法通常只會(huì)給程序帶來很小的性能損耗,并且因?yàn)闊o須修改硬件或系統(tǒng),可實(shí)現(xiàn)側(cè)信道漏洞的快速修補(bǔ)以及大范圍部署,被主流的加密實(shí)現(xiàn)采用。
基于軟件的漏洞修補(bǔ)可分為行為一致[31]和噪聲混淆[2]?;谛袨橐恢碌牟呗詫?shí)現(xiàn)難度較大,首先需要對(duì)代碼進(jìn)行準(zhǔn)確分析,然后對(duì)路徑平衡補(bǔ)全[31]。這種策略在面對(duì)復(fù)雜程序時(shí)很難保障行為的完全一致,特別是循環(huán)嵌套。因此多數(shù)情況下,開發(fā)者需要手工完成修補(bǔ),這就對(duì)開發(fā)者的專業(yè)素養(yǎng)要求很高,此外在程序代碼量特別大時(shí),漏洞分析和修補(bǔ)非常容易出現(xiàn)偏差。噪聲混淆的策略雖然容易實(shí)現(xiàn)自動(dòng)化,但簡(jiǎn)單的噪聲混淆容易被攻擊者通過預(yù)先構(gòu)建好的統(tǒng)計(jì)學(xué)模型移除[32]或者細(xì)粒度的側(cè)信道攻擊繞過[2,33],并不能達(dá)到好的防御效果。
本文提出了一種全自動(dòng)的基于原子混淆的通用側(cè)信道漏洞修補(bǔ)方法。該方法的核心思想是結(jié)合硬件原子事務(wù)技術(shù)和噪聲混淆技術(shù),在漏洞代碼中增加用于混淆的訪存操作,然后把漏洞代碼和混淆操作代碼封裝為原子事務(wù),并在程序運(yùn)行時(shí)監(jiān)控事務(wù)執(zhí)行狀態(tài),保障原子事務(wù)內(nèi)的代碼在結(jié)束前連續(xù)執(zhí)行未被中斷,否則立即中止執(zhí)行并回退?;煜L存使得攻擊者在攻擊過程中獲取到的軌跡除了真實(shí)目標(biāo)訪存外,還包含非常多的用于混淆的噪聲訪存;原子事務(wù)保障攻擊者無法通過細(xì)粒度的側(cè)信道攻擊去辨別真實(shí)的訪存和噪聲訪存。完成漏洞修補(bǔ)后的程序,攻擊者即便能夠搜集到程序運(yùn)行軌跡,也只能觀察到事務(wù)內(nèi)一段連續(xù)執(zhí)行的代碼對(duì)硬件組件狀態(tài)的改變,這些包含大量噪聲的狀態(tài)信息難以被用于還原用戶的機(jī)密信息。
本文基于LLVM編譯器實(shí)現(xiàn)了自動(dòng)修補(bǔ)方法的原型系統(tǒng)SC-Patcher,并在實(shí)現(xiàn)中采用了多種安全和性能方面的優(yōu)化策略。首先,SC-Patcher針對(duì)不同類型的漏洞設(shè)計(jì)了不同的混淆策略,在保障混淆的安全性的同時(shí),盡可能減少額外訪存指令數(shù)量以降低對(duì)程序性能的影響。其次,在封裝原子事務(wù)時(shí),SC-Patcher采取事務(wù)聚合的優(yōu)化操作將多個(gè)離散代碼(包括漏洞代碼、混淆操作和正常代碼)封裝到同一事務(wù),在提高性能的同時(shí)增加事務(wù)內(nèi)噪聲的多樣性。通過真實(shí)的側(cè)信道攻擊驗(yàn)證SC-Patcher修補(bǔ)后的密碼算法的安全性,結(jié)果表明修補(bǔ)后的程序能夠很好地抵御攻擊者竊取機(jī)密數(shù)據(jù)的行為。通過SC-Patcher對(duì)修補(bǔ)后的OpenSSL加密算法進(jìn)行性能測(cè)試,結(jié)果表明SC-Patcher的漏洞補(bǔ)丁給程序帶來的性能損耗(3.11%)幾乎可以忽略不計(jì)。與現(xiàn)有的側(cè)信道防御方法T-SGX[24]的結(jié)果進(jìn)行對(duì)比,SC-Patcher在安全性和性能方面有顯著提高。
本文貢獻(xiàn)包括:
1) 提出了一種基于原子混淆的通用方案能夠?qū)崿F(xiàn)側(cè)信道漏洞的自動(dòng)修補(bǔ);
2) 實(shí)現(xiàn)了原型系統(tǒng)SC-Patcher,并給出了許多安全和性能方面的優(yōu)化設(shè)計(jì)方案;
3) 使用SC-Patcher對(duì)真實(shí)的程序進(jìn)行漏洞修補(bǔ),對(duì)修補(bǔ)后的程序進(jìn)行安全和性能測(cè)試,證明了修補(bǔ)方法的安全性和實(shí)用性。
微架構(gòu)的側(cè)信道攻擊指的是攻擊者通過觀察硬件組件的狀態(tài)信息竊取目標(biāo)程序的私密內(nèi)容的行為。在側(cè)信道攻擊中,只有目標(biāo)程序的機(jī)密輸入S、程序運(yùn)行時(shí)表現(xiàn)的行為P(如分支選擇或者數(shù)據(jù)訪問)和可被觀察到的組件狀態(tài)信息I之間存在關(guān)聯(lián)關(guān)系: I~P~S,攻擊者才能通過使用觀察到的狀態(tài)信息I還原出機(jī)密輸入S。其中I~P表示狀態(tài)信息I與程序行為P之間存在關(guān)聯(lián)關(guān)系。系統(tǒng)會(huì)泄露程序行為的狀態(tài)信息,如基于處理器的緩存[3-6]、頁表[8-9]、頁表緩存[7]和分支目標(biāo)緩存[2]??梢酝ㄟ^產(chǎn)生各類中斷來減少攻擊時(shí)的噪聲,提高還原信息的準(zhǔn)確度[8-9]。 P ~S表示程序行為P和機(jī)密輸入S之間存在關(guān)聯(lián)關(guān)系,即機(jī)密輸入的變化會(huì)導(dǎo)致程序的行為發(fā)生改變,而攻擊者可以通過獲取程序的行為推測(cè)出機(jī)密輸入的內(nèi)容。常見的關(guān)聯(lián)關(guān)系有:分支選擇依賴,即程序控制流選擇的目標(biāo)分支依賴機(jī)密輸入;數(shù)據(jù)訪問依賴,程序內(nèi)數(shù)據(jù)訪問的目的地址依賴機(jī)密輸入。通常程序中存在分支選擇依賴和數(shù)據(jù)訪問依賴關(guān)系的代碼被分別視為程序的基于控制依賴的側(cè)信道漏洞和基于數(shù)據(jù)訪問依賴的側(cè)信道漏洞[31,34]。
從部署層上對(duì)側(cè)信道的防御策略進(jìn)行分類,可分為硬件架構(gòu)層、系統(tǒng)層和軟件層的防御策略。
硬件架構(gòu)層的防御策略,最直接的方法是分隔共享的資源,如處理器的緩存分隔[11,13]和頁表緩存分隔[15]。另外一種方法是隨機(jī)化資源的使用,混淆側(cè)信道的觀察[12]。
系統(tǒng)層的側(cè)信道防御策略包括:① 硬件組件分割,把組件的不同部分分配給不同的進(jìn)程,如頁染色[16]或者頁鎖定[17];② 刷新系統(tǒng)狀態(tài)以降低信息的泄露風(fēng)險(xiǎn)[18];③ 降低系統(tǒng)測(cè)量的準(zhǔn)確值,如修改虛擬機(jī)的rdtsc指令,添加隨機(jī)值[19-21];④ 檢測(cè)程序的異常行為,如通過計(jì)數(shù)器判斷程序的運(yùn)行是否過慢[22],或者檢測(cè)程序運(yùn)行過程中產(chǎn)生的中斷是否過多[23-24]。
軟件層的側(cè)信道防御策略主要有3類:一致化、隨機(jī)混淆和漏洞檢測(cè)。一致化指的是,開發(fā)者通過修改程序或者算法,使得攻擊者在機(jī)密輸入變化的情況下搜集到的程序軌跡是一樣的。隨機(jī)混淆是在程序中添加噪聲來隱藏真實(shí)的程序軌跡,一般是在與程序機(jī)密數(shù)據(jù)相關(guān)的訪問中添加額外的混淆訪存,或者對(duì)代碼或者數(shù)據(jù)進(jìn)行隨機(jī)重排。漏洞檢測(cè)主要分為靜態(tài)和動(dòng)態(tài)方法。靜態(tài)檢測(cè)方法常用抽象表征去分析源碼并測(cè)量泄露的上確界。CacheAudit[25]通過馬爾可夫鏈量化程序泄露信息的上限。還有很多工具用于驗(yàn)證程序是否有依賴機(jī)密數(shù)據(jù)的條件跳轉(zhuǎn)和內(nèi)存訪問[26-28]。動(dòng)態(tài)檢測(cè)方法是根據(jù)程序運(yùn)行時(shí)的真實(shí)軌跡去判斷側(cè)信道漏洞。CacheD[29]檢查每條指令在不同的機(jī)密輸入下是否會(huì)訪問不同的緩存地址。Shin等[30]運(yùn)用K-means聚合算法去檢查緩存行為和機(jī)密輸入的關(guān)聯(lián)關(guān)系。MicroWalk[30]采用相互信息測(cè)量相同的關(guān)系。側(cè)信道漏洞檢測(cè)只負(fù)責(zé)發(fā)現(xiàn)和定位漏洞,而側(cè)信道漏洞自動(dòng)修補(bǔ)方面的工作相對(duì)較少,通常需要專家的人工介入,對(duì)漏洞進(jìn)行分析與重新設(shè)計(jì)算法,專業(yè)性很強(qiáng),門檻很高。文獻(xiàn)[31]通過分析程序,平衡分支路徑實(shí)現(xiàn)側(cè)信道漏洞修補(bǔ),該方法一方面并不支持復(fù)雜邏輯程序,另一方面攻擊者仍可以通過細(xì)粒度的側(cè)信道攻擊分辨真實(shí)的軌跡和混淆的軌跡[33]。
硬件層和系統(tǒng)層的防御策略很少被應(yīng)用于真實(shí)的平臺(tái)或者場(chǎng)景中,主要原因是這些方案存在性能或兼容性方面的問題,難以被部署到實(shí)際的生產(chǎn)環(huán)境中。相對(duì)而言,軟件層的防御策略則更加實(shí)用,具體為:這類策略能夠快速修復(fù)漏洞并完成大范圍的部署;另外,軟件層的漏洞修復(fù)大多不會(huì)給程序帶來額外的性能開銷。
事務(wù)內(nèi)存的設(shè)計(jì)目的是簡(jiǎn)化并行編程模型,降低多核處理器上獲取互斥鎖的開銷,提高并行的線程對(duì)共享內(nèi)存操作的效率。事務(wù)內(nèi)存的特性包含原子性、一致性和隔離性。原子性指的是事務(wù)內(nèi)的操作作為一個(gè)整體是不可被分割的,要么事務(wù)內(nèi)的所有讀寫提交全部被系統(tǒng)接受,要么全部被系統(tǒng)拋棄;一致性指的是事務(wù)執(zhí)行的前后,系統(tǒng)都必須處于一致性狀態(tài);隔離性指的是事務(wù)在提交之前,內(nèi)部操作對(duì)象的狀態(tài)對(duì)外界不可見,不會(huì)影響系統(tǒng)的狀態(tài)。如果一個(gè)事務(wù)在沒有沖突的情況下執(zhí)行結(jié)束,其所有的讀寫會(huì)被提交到內(nèi)存中,否則所有因?yàn)樽x寫而保存的中間狀態(tài)將被拋棄(不會(huì)被提交到真實(shí)的內(nèi)存中),同時(shí)系統(tǒng)會(huì)將程序的控制權(quán)交給進(jìn)入事務(wù)區(qū)前注冊(cè)的一個(gè)異常處理句柄去決定是否重新執(zhí)行事務(wù)區(qū)。在運(yùn)行事務(wù)時(shí),硬件需要把事務(wù)內(nèi)所有讀數(shù)據(jù)和寫數(shù)據(jù)的內(nèi)容暫存到一個(gè)緩沖區(qū)中,然后在事務(wù)運(yùn)行結(jié)束前,再把緩存的內(nèi)容提交到內(nèi)存中。Intel TSX(transactional synchronization extensions)將L1緩存作為緩沖區(qū)。這種設(shè)計(jì)無須在硬件上增加新的事務(wù)緩存硬件,可直接復(fù)用現(xiàn)有的緩存一致性協(xié)議檢測(cè)事務(wù)間的訪問沖突,能夠極大地簡(jiǎn)化硬件的設(shè)計(jì)。但是這種設(shè)計(jì)導(dǎo)致TSX需要對(duì)事務(wù)內(nèi)的讀寫集施加嚴(yán)格的限制,即L1數(shù)據(jù)緩存必須能夠容納事務(wù)的所有內(nèi)存的寫操作,否則會(huì)導(dǎo)致事務(wù)的退出。
RTM(restricted transactional memory)是Intel TSX的硬件事務(wù)內(nèi)存解決方案提供的接口。CPU的指令集中一共有4條與RTM相關(guān)的指令,其中XBEGIN用于初始化事務(wù);XEND用于結(jié)束事務(wù)的執(zhí)行;XABORT用于中斷事務(wù)的執(zhí)行;XTEST用于測(cè)試代碼是否在事務(wù)中執(zhí)行。前SC-Patcher的實(shí)現(xiàn)采用RTM指令對(duì)代碼進(jìn)行原子事務(wù)封裝,它同樣適應(yīng)于其他廠商的硬件事務(wù)內(nèi)存解決方案,如ARM的TME(transactional memory extension),AMD的ASF(advanced synchronization facility)。
假設(shè)開發(fā)人員已通過各種手段,發(fā)現(xiàn)并標(biāo)識(shí)出應(yīng)用程序代碼中的側(cè)信道漏洞。本文方法的目標(biāo)是修補(bǔ)程序中的這些側(cè)信道漏洞,阻止攻擊者利用這些側(cè)信道漏洞竊取用戶的私密信息。在普通場(chǎng)景中,攻擊來自系統(tǒng)內(nèi)非root權(quán)限的普通用戶,不能直接訪問被攻擊程序的內(nèi)容。在可信執(zhí)行環(huán)境(如IntelSGX)的場(chǎng)景中,攻擊可以來自于惡意的操作系統(tǒng),攻擊者可以調(diào)度所有的進(jìn)程,利用各種頁級(jí)、緩存級(jí)、指令級(jí)的側(cè)信道攻擊,探測(cè)系統(tǒng)狀態(tài),但不能直接觀察目標(biāo)程序的內(nèi)存。
不考慮類似能量分析[32]、電磁輻射[35]等物理級(jí)的側(cè)信道攻擊,這些攻擊通常需要攻擊者近距離地去搜集物理機(jī)的各類信號(hào)。瞬態(tài)執(zhí)行攻擊,如Meltdown[36]和Spectre[37]攻擊及其變種[38]不在防御范圍內(nèi),這些攻擊與程序中是否存在微架構(gòu)側(cè)信道漏洞并無關(guān)系,并且屬于硬件漏洞。
本節(jié)首先簡(jiǎn)單介紹修補(bǔ)方法的工作流程,然后詳細(xì)介紹工作流程中涉及的各個(gè)模塊。
側(cè)信道漏洞修補(bǔ)的工作流程如圖1所示,含有編譯和運(yùn)行兩個(gè)階段,整個(gè)過程涉及多個(gè)模塊的參與。編譯階段包含代碼標(biāo)識(shí)模塊、混淆插樁模塊和原子事務(wù)封裝模塊;運(yùn)行階段包含動(dòng)態(tài)混淆模塊和異常檢測(cè)模塊。在編譯階段,開發(fā)者提供程序源碼和側(cè)信道漏洞位置信息給一個(gè)修改后的編譯器。代碼標(biāo)識(shí)模塊處于編譯器前端,基于漏洞位置信息標(biāo)識(shí)應(yīng)用代碼,并將這些標(biāo)識(shí)信息作為元數(shù)據(jù)傳遞給編譯器后端。混淆插樁模塊和原子事務(wù)封裝模塊根據(jù)代碼標(biāo)識(shí)信息,以基本塊為最小單元對(duì)漏洞代碼做進(jìn)一步處理:混淆插樁模塊在編譯時(shí)向漏洞代碼插入額外的混淆訪存指令,以達(dá)到隱藏程序真實(shí)運(yùn)行軌跡的目的;原子事務(wù)封裝模塊封裝漏洞代碼和混淆代碼為原子事務(wù),保障代碼在執(zhí)行中不可被中斷。在運(yùn)行階段,動(dòng)態(tài)混淆模塊與異常檢測(cè)模塊被加載到程序進(jìn)程空間中,動(dòng)態(tài)混淆模塊在程序執(zhí)行時(shí)不斷變換混淆訪存目標(biāo)地址,增加混淆噪聲的不確定性,異常檢測(cè)模塊則監(jiān)控原子事務(wù)在執(zhí)行過程中未被惡意中斷,確保代碼是以原子性運(yùn)行的。
圖1 側(cè)信道漏洞修補(bǔ)的工作流程 Figure 1 The workflow of patching side-channel vulnerabilities
圖1展示了代碼經(jīng)各個(gè)模塊處理后的變化。其中基本塊bb_0使用機(jī)密數(shù)據(jù)secret作為數(shù)組內(nèi)數(shù)據(jù)訪問的索引,存在基于數(shù)據(jù)訪問的側(cè)信道漏洞;基本塊bb_p使用機(jī)密數(shù)據(jù)secret_1作為分支判斷條件,執(zhí)行基本塊bb_1或基本塊bb_2會(huì)導(dǎo)致機(jī)密數(shù)據(jù)secret_1值的泄露,存在基于控制依賴的側(cè)信道漏洞。
代碼標(biāo)識(shí)模塊根據(jù)用戶提供的側(cè)信道漏洞信息標(biāo)識(shí)應(yīng)用的源碼。漏洞信息包括:文件名、漏洞行和側(cè)信道漏洞類型。表1展示了模塊用于標(biāo)識(shí)代碼的4種類型,為了簡(jiǎn)化稱呼,分別稱這些代碼為D(data)類代碼、B(branch)類代碼、U(unsafe)類代碼和S(safe)類代碼。需要特別注意的是U類代碼,這類代碼為B類或U類代碼中被調(diào)用的函數(shù)。暴露這類代碼的執(zhí)行信息會(huì)導(dǎo)致調(diào)用函數(shù)執(zhí)行信息的泄露。假如一段代碼中同時(shí)包含數(shù)據(jù)訪問依賴和控制選擇依賴的漏洞,則被同時(shí)標(biāo)記為D類和B類。
表1 SC-Patcher中的代碼類型標(biāo)識(shí)Table 1 Code Type Identification in SC-Patcher
圖1采用不同顏色對(duì)D、B、U和S類代碼進(jìn)行區(qū)分,如基本塊bb_0使用機(jī)密數(shù)據(jù)作為訪問數(shù)組的索引值,存在數(shù)據(jù)訪問依賴的側(cè)信道漏洞,被標(biāo)記為D類代碼(藍(lán)色基本塊);分支在選擇基本塊bb_1和bb_2時(shí)依賴機(jī)密數(shù)據(jù)的值,因此包含控制選擇依賴的側(cè)信道漏洞,被標(biāo)記為B類代碼(黃色基本塊);函數(shù)bar在基本塊bb_2內(nèi)被調(diào)用,bar的泄露會(huì)導(dǎo)致基本塊bb_2的執(zhí)行信息泄露,被標(biāo)記為U類代碼(棕黃色基本塊)。
混淆插樁模塊負(fù)責(zé)向漏洞代碼中插入混淆訪存指令,達(dá)到在運(yùn)行時(shí)隱藏漏洞代碼的真實(shí)運(yùn)行軌跡的目的。模塊根據(jù)漏洞代碼的類型的不同,采取了不同混淆策略。
針對(duì)D類包含數(shù)據(jù)訪問依賴漏洞的代碼,混淆插樁模塊在原始訪存操作的前后增加多個(gè)用于混淆的內(nèi)存讀寫操作。數(shù)量過多的混淆訪存指令會(huì)給程序帶來比較明顯的性能損耗,而過少的數(shù)據(jù)混淆訪存又無法提供充足的安全保障,為解決這一矛盾,該模塊引入動(dòng)態(tài)隨機(jī)訪存機(jī)制以增強(qiáng)混淆噪聲,在提高安全性的同時(shí)降低了混淆訪存的數(shù)量。圖1中基本塊bb_0的變化展示了混淆插樁模塊增加數(shù)據(jù)訪問混淆的效果:模塊在array[secret]附近插入額外訪存操作,訪存目標(biāo)地址基于混淆偏移表o_table對(duì)應(yīng)表項(xiàng)的偏移值動(dòng)態(tài)計(jì)算得到。
針對(duì)B類代碼,即代碼中包含控制選擇依賴的側(cè)信道漏洞,混淆插樁模塊采取串聯(lián)預(yù)訪問的混淆策略:使用直接跳轉(zhuǎn)指令,在執(zhí)行真實(shí)代碼前,穿插預(yù)先訪問區(qū)域內(nèi)的基本塊,達(dá)到隱藏真實(shí)代碼訪問的目的。不同分支執(zhí)行的指令數(shù)量存在不同,從而導(dǎo)致分支執(zhí)行所耗費(fèi)的時(shí)間存在差異。為降低因時(shí)間產(chǎn)生的信息泄露,混淆模塊也在B類代碼的不同分支中添加額外的訪存指令,平衡不同分支的指令數(shù)量,分支執(zhí)行時(shí)間盡可能相似。如圖1中混淆插樁模塊對(duì)基本塊bb_p、基本塊bb_1、基本塊bb_2的處理,展示了插樁代碼如何實(shí)現(xiàn)混淆執(zhí)行:控制流在進(jìn)入基本塊bb_p分支選擇前,先跳轉(zhuǎn)到基本bb_1,然后到基本塊bb_2,最后執(zhí)行條件選擇進(jìn)入真正的基本塊執(zhí)行,這樣會(huì)強(qiáng)制加載其他基本塊的內(nèi)容到緩存中,從而達(dá)到混淆的目的。
原子事務(wù)封裝模塊將漏洞代碼和混淆代碼封裝為原子事務(wù)。針對(duì)不同分類標(biāo)識(shí)代碼,該模塊所采用的封裝策略存在差異。
對(duì)于只包含D類標(biāo)識(shí)的代碼,即存在數(shù)據(jù)訪問依賴的側(cè)信道漏洞的代碼,原子事務(wù)封裝模塊將漏洞所在基本塊封裝為原子事務(wù)。圖1中transaction_begin函數(shù)表示原子事務(wù)的開始,transaction_end函數(shù)表示原子事務(wù)的結(jié)束。
模塊對(duì)于B類代碼的處理,是期望避免代碼的執(zhí)行信息被泄露,但代碼的前驅(qū)節(jié)點(diǎn)和代碼對(duì)后繼節(jié)點(diǎn)的分支選擇都會(huì)暴露執(zhí)行信息。因此原子事務(wù)封裝模塊會(huì)將基本塊的前驅(qū)結(jié)點(diǎn)以及前驅(qū)結(jié)點(diǎn)的所有子基本塊添加到原子區(qū)內(nèi),同時(shí)通過一個(gè)跳板代碼完成狀態(tài)切換并跳轉(zhuǎn)到后繼節(jié)點(diǎn)。圖1的原子事務(wù)封裝模塊在基本塊bb_p首指令處插入transaction_begin開始原子事務(wù),并在基本塊bb_s的入口處的transaction_end結(jié)束原子事務(wù)。這樣基本塊bb_p和bb_s間的基本塊(包括函數(shù)bar的所有基本塊)執(zhí)行都處于同一原子事務(wù)區(qū)中。
當(dāng)代碼同時(shí)包含B類和D類標(biāo)識(shí)時(shí),原子事務(wù)封裝模塊采用B類代碼的封裝策略。U類代碼的處理邏輯同B類代碼,但在封裝的實(shí)現(xiàn)細(xì)節(jié)上存在稍許差異。
動(dòng)態(tài)混淆模塊在程序運(yùn)行時(shí),通過隨機(jī)改變混淆偏移表內(nèi)的偏移值,實(shí)現(xiàn)混淆指令的動(dòng)態(tài)地址訪存,達(dá)到增強(qiáng)混淆噪聲強(qiáng)度、提高安全性的目的。混淆訪存目標(biāo)地址是通過原目標(biāo)地址值加上對(duì)應(yīng)偏移表表項(xiàng)的偏移值計(jì)算所得。通常偏移表的表項(xiàng)值為?4 096~4 096的任意數(shù),這個(gè)范圍覆蓋了緩存級(jí)到頁級(jí)的地址。一方面能夠適應(yīng)多種粒度的側(cè)信道攻擊;另一方面計(jì)算得到的混淆訪存內(nèi)容的地址都比較靠近目標(biāo)訪存,使得混淆地址和實(shí)際地址的相關(guān)性比較強(qiáng),從邏輯上講更具有迷惑性。動(dòng)態(tài)混淆模塊在記錄原子事務(wù)執(zhí)行次數(shù)的同時(shí)會(huì)隨機(jī)生成一個(gè)閾值與所記錄次數(shù)進(jìn)行比較,當(dāng)原子事務(wù)的執(zhí)行次數(shù)大于閾值時(shí),模塊重置混淆偏移表,并使用隨機(jī)值再次填充,最后清零事務(wù)執(zhí)行次數(shù)并重新生成閾值后,繼續(xù)程序執(zhí)行。
異常檢測(cè)模塊負(fù)責(zé)監(jiān)控原子事務(wù)內(nèi)代碼的運(yùn)行狀態(tài),判斷事務(wù)在執(zhí)行過程中是否存在被攻擊的異常行為。若被封裝的代碼的原子性在執(zhí)行過程中被破壞,硬件會(huì)立即中斷事務(wù)的執(zhí)行并回滾到事務(wù)初始狀態(tài),然后跳轉(zhuǎn)到異常檢測(cè)模塊進(jìn)行攻擊判定。異常檢測(cè)模塊根據(jù)硬件交易事務(wù)退出時(shí)返回的狀態(tài)碼,決定是否停止代碼的執(zhí)行。運(yùn)行過程中事務(wù)退出的原因有多種,其中包含許多正常的系統(tǒng)行為。例如,現(xiàn)代操作系統(tǒng)以固定時(shí)間間隔發(fā)送時(shí)鐘中斷,達(dá)到多任務(wù)分時(shí)輪轉(zhuǎn)的目的,被封裝為原子事務(wù)的代碼在執(zhí)行過程中很有可能因當(dāng)前進(jìn)程輪詢的時(shí)間片結(jié)束,收到時(shí)鐘中斷信號(hào),最終導(dǎo)致事務(wù)的中斷。另外一種情況是,在代碼執(zhí)行過程中,目標(biāo)執(zhí)行代碼、訪存的代碼頁不在內(nèi)存中,而產(chǎn)生缺頁異常情況,導(dǎo)致交易事務(wù)區(qū)中的代碼執(zhí)行中斷。事務(wù)內(nèi)的代碼在異常退出時(shí),檢測(cè)模塊可讀取硬件返回的退出狀態(tài)。異常檢測(cè)模塊為每個(gè)異常設(shè)定可接受數(shù)量的閾值,然后統(tǒng)計(jì)導(dǎo)致事務(wù)退出的各個(gè)異常發(fā)生的次數(shù),當(dāng)次數(shù)超出閾值時(shí),異常檢測(cè)模塊會(huì)判定程序存在被攻擊的可能而立即停止代碼的執(zhí)行。
基于上述的側(cè)信道漏洞修補(bǔ)方法,本文在LLVM 11.0的基礎(chǔ)上實(shí)現(xiàn)了原型系統(tǒng)SC-Patcher,其支持對(duì)大部分C和C++的程序進(jìn)行漏洞修補(bǔ)的處理。
原型系統(tǒng)的主要部分包括事務(wù)混淆插樁模塊和原子事務(wù)封裝模塊,被整合在LLVM編譯器的后端;代碼標(biāo)識(shí)模塊作為L(zhǎng)LVM編譯器的一個(gè)前端插件,將每個(gè)導(dǎo)出函數(shù)的函數(shù)包裝器注入LLVM 中間表示中;動(dòng)態(tài)混淆模塊和異常檢測(cè)模塊作為靜態(tài)鏈接庫,在編譯時(shí)被自動(dòng)鏈接到程序中,整個(gè)原型系統(tǒng)的核心實(shí)現(xiàn)部分約4 200行代碼。
本節(jié)將介紹SC-Patcher中原子事務(wù)分割、原子事務(wù)聚合、安全跳板、敏感函數(shù)的封裝、寄存器優(yōu)化的實(shí)現(xiàn)細(xì)節(jié)。
SC-Patcher需要分割存在緩存使用沖突的原子事務(wù),這是因?yàn)樵谶\(yùn)行Intel TSX的事務(wù)時(shí),原子事務(wù)內(nèi)的所有寫操作內(nèi)容必須保留在 L1數(shù)據(jù)緩存中,直到事務(wù)結(jié)束后才會(huì)真正地提交到內(nèi)存中。任何導(dǎo)致暫存數(shù)據(jù)被驅(qū)逐出緩存的行為,都會(huì)導(dǎo)致事務(wù)執(zhí)行的中止。因此若一個(gè)事務(wù)內(nèi)的所有寫操作不能暫存到L1數(shù)據(jù)緩存,這個(gè)事務(wù)將永遠(yuǎn)不會(huì)被成功執(zhí)行。而L1數(shù)據(jù)緩存受硬件實(shí)現(xiàn)的影響,其大小有限,以Skylake處理器為例,L1數(shù)據(jù)緩存為8路組相聯(lián),單個(gè)緩存行為64 byte,緩存大小為32 kB。對(duì)于單個(gè)緩存行大小的任意數(shù)據(jù)訪問,處理器都會(huì)將該緩存行的所有內(nèi)容加載到8路L1緩存組的任意一個(gè)槽。假如存在8 個(gè)以上的不同緩存行的寫操作內(nèi)容映射到同一緩存組,會(huì)導(dǎo)致L1數(shù)據(jù)緩存驅(qū)逐事務(wù)的寫內(nèi)容,事務(wù)將立即執(zhí)行失敗。SC-Patcher將緩存沖突作為事務(wù)切割的依據(jù),盡可能降低緩存行的沖突,提高事務(wù)執(zhí)行的成功率。
SC-Patcher移植T-SGX[24]內(nèi)一個(gè)用于分析代碼中的緩存使用量的靜態(tài)分析組件,在編譯時(shí)對(duì)漏洞和混淆代碼進(jìn)行緩存沖突分析。由于編譯器在編譯時(shí)不能獲取程序在運(yùn)行時(shí)的確切訪存地址,因此該組件實(shí)現(xiàn)采取了保守的過近似分析算法以估算代碼中最糟糕的緩存沖突情況:對(duì)于可獲取準(zhǔn)確地址的對(duì)象,分析組件,直接將其分配給對(duì)應(yīng)的緩存組,并且相應(yīng)路數(shù)加1;對(duì)于訪問對(duì)象的地址是未知寄存器以及固定偏移的組合(如rbp+16),分析組件根據(jù)基指針分組計(jì)算,分別估計(jì)新增的緩存使用路數(shù),并把這些路數(shù)累加到所有的緩存組;對(duì)于地址完全未知的對(duì)象,分析組件,將該對(duì)象分配給所有緩存組。事務(wù)區(qū)內(nèi)緩存的使用是上述3種情況累加的上確值。組件會(huì)在分析結(jié)束后根據(jù)結(jié)果分割代碼。
SC-Patcher嘗試在不產(chǎn)生緩存沖突的前提下,將多個(gè)離散的原子事務(wù)聚合到同一原子事務(wù)中。該聚合處理提升了程序的安全性和執(zhí)行效率:從安全方面講,原子事務(wù)內(nèi)執(zhí)行的指令越多,累積的硬件狀態(tài)的改變?cè)蕉?,攻擊者攻擊時(shí)的噪聲越大,攻擊越困難;從性能方面講,執(zhí)行一個(gè)空的Intel TSX事務(wù)(只執(zhí)行XBEGIN和XEND指令),會(huì)耗費(fèi)大約200時(shí)鐘周期,因此減少頻繁的事務(wù)創(chuàng)建和結(jié)束,可提升程序性能。SC-Patcher首先分析各原子事務(wù)內(nèi)的緩存使用,然后通過動(dòng)態(tài)規(guī)劃,在不產(chǎn)生緩存沖突的情況下,盡可能地合并事務(wù)。此外,事務(wù)間通過安全代碼完成控制流的轉(zhuǎn)移,因此SC-Patcher在進(jìn)行緩存分析和事務(wù)封裝時(shí),需要考慮這些安全代碼。
SC-Patcher使用安全跳板實(shí)現(xiàn)原子事務(wù)間的安全切換。事務(wù)的開始指令(XBEGIN)在執(zhí)行前和結(jié)束指令(XEND)在執(zhí)行結(jié)束并不在事務(wù)的保護(hù)中,假如把原子事務(wù)封裝的開始指令(XBEGIN)和結(jié)束指令(XEND)直接嵌在基本塊中,攻擊者可以在程序運(yùn)行時(shí)探測(cè)到兩個(gè)相鄰事務(wù)間非保護(hù)指令的執(zhí)行,而導(dǎo)致受保護(hù)的基本塊的執(zhí)行信息泄露。如圖2所示,控制流在基本塊 bb_leaky_1執(zhí)行結(jié)束后跳到基本塊bb_leaky_2,兩個(gè)基本塊被分割到不同事務(wù),如果將XBEGIN指令直接嵌在基本塊bb_leaky_2的入口處,攻擊者通過不斷地探測(cè)這條指令的地址,可推測(cè)出基本塊bb_leaky_2的執(zhí)行狀態(tài)。為避免信息泄露,SC-Patcher在安全跳板中完成原子事務(wù)的狀態(tài)切換:基本塊首先跳轉(zhuǎn)到安全跳板中,完成原子事務(wù)切換,然后跳轉(zhuǎn)到目標(biāo)地址(如圖2中黑色箭頭指向的程序控制流)。通過安全跳板的防護(hù)策略,攻擊者僅可以獲取安全跳板內(nèi)的公共指令地址的訪問信息,而原子事務(wù)內(nèi)的代碼的執(zhí)行信息仍受到保護(hù)。
圖2 安全跳板 Figure 2 Secure springboard
SC-Patcher設(shè)計(jì)了專門的指令片段用于進(jìn)入和退出U類敏感函數(shù)。原因是無泄漏的S類代碼需要在普通狀態(tài)下調(diào)用U類敏感函數(shù),而受保護(hù)的B類代碼需要在原子事務(wù)狀態(tài)下進(jìn)入U(xiǎn)類敏感函數(shù)。圖3包含上述兩種不同類型的函數(shù)調(diào)用,其中被標(biāo)記為S類的安全基本塊bb_safe調(diào)用了U類敏感函數(shù)bar,包含漏洞的基本塊bb_leaky為B類代碼同樣調(diào)用了函數(shù)bar。
圖3 臨界狀態(tài)的控制流 Figure 3 Critical control flow
基本塊bb_leaky在調(diào)用函數(shù)bar的開始和結(jié)尾處運(yùn)行了兩次原子事務(wù)的狀態(tài)切換,是因?yàn)殪o態(tài)分析函數(shù)間的緩存沖突幾乎不太現(xiàn)實(shí),因此SC-Patcher通過事務(wù)切換消除潛在的緩存沖突。為避免攻擊者通過探測(cè)原子事務(wù)封裝指令的地址泄露被調(diào)用的函數(shù)執(zhí)行信息,SC-Patcher在處理受保護(hù)目標(biāo)函數(shù)調(diào)用時(shí)(如基本塊bb_leaky調(diào)用函數(shù)bar),首先通過安全跳板內(nèi)的一個(gè)中間片段sp.call完成原子事務(wù)狀態(tài)切換,然后跳轉(zhuǎn)到目標(biāo)函數(shù)bar內(nèi)繼續(xù)執(zhí)行代碼。此外,函數(shù)bar在執(zhí)行結(jié)束后,首先通過一個(gè)直接跳轉(zhuǎn)指令轉(zhuǎn)到安全跳板中的指令片段sp.ret完成原子事務(wù)切換后,然后回到基本塊bb_leaky中。
基本塊bb_safe在普通狀態(tài)下調(diào)用函數(shù)bar,由于函數(shù)bar被封裝為原子事務(wù),因此CPU在進(jìn)入bar函數(shù)前,需要先開啟事務(wù),否則函數(shù)會(huì)在執(zhí)行中,由于不處于事務(wù)狀態(tài)下執(zhí)行XEND指令而產(chǎn)生異常。函數(shù)bar返回時(shí)(基本塊bb_safe),需要退出原子事務(wù)狀態(tài)恢復(fù)到普通模式后,才可繼續(xù)執(zhí)行bb_safe。因此,SC-Patcher在每個(gè)U類敏感函數(shù)的入口函數(shù)前插入事務(wù)判斷片段,若發(fā)現(xiàn)U類函數(shù)不處于事務(wù)狀態(tài),便立即開啟一個(gè)事務(wù)。
SC-Patcher修改了編譯器后端對(duì)寄存器的分配策略,簡(jiǎn)化了安全跳板代碼的實(shí)現(xiàn)。Intel TSX會(huì)在事務(wù)異常中止時(shí)將中止?fàn)顟B(tài)碼(abort status code)保存到rax寄存器中,該操作會(huì)覆蓋rax寄存器的原始值。一種解決方法是在彈簧跳板中插入相關(guān)指令,在事務(wù)執(zhí)行前保存rax的值,在事務(wù)執(zhí)行時(shí)再還原rax的值,而這種設(shè)計(jì)需要分析哪些代碼使用了rax寄存器,并在跳轉(zhuǎn)代碼中插入額外的指令,處理比較煩瑣。SC-Patcher通過修改編譯器的寄存器分配策略,在泄露的函數(shù)中設(shè)置rax為保留寄存器,限制rax寄存器只被用于基本塊內(nèi)的傳值,而基本塊間的數(shù)據(jù)流則不會(huì)使用rax寄存器。該優(yōu)化操作省去了復(fù)雜的寄存器分析步驟,簡(jiǎn)化了設(shè)計(jì)。
本節(jié)對(duì)SC-Patcher實(shí)現(xiàn)的安全性進(jìn)行分析,并通過真實(shí)的側(cè)信道攻擊進(jìn)行安全測(cè)試驗(yàn)證。
本文提出的側(cè)信道漏洞修補(bǔ)方法的核心策略為混淆代碼和原子事務(wù)?;煜a是在編譯時(shí)在側(cè)信道漏洞的相關(guān)代碼中插入額外的混淆訪存指令,用于隱藏漏洞代碼的執(zhí)行軌跡。本文方法針對(duì)控制流選擇依賴的漏洞和數(shù)據(jù)訪問依賴的漏洞分別采用了串聯(lián)預(yù)訪問和動(dòng)態(tài)隨機(jī)混淆訪存的策略。對(duì)于攻擊者而言,在程序運(yùn)行時(shí),硬件狀態(tài)由漏洞的真實(shí)訪存和混淆噪聲訪存共同作用,收集到的狀態(tài)信息包含大量噪聲,難以被攻擊者用于還原程序的準(zhǔn)確運(yùn)行軌跡,進(jìn)而無法被用于恢復(fù)用戶的私密數(shù)據(jù)。攻擊者可以利用細(xì)粒度的側(cè)信道攻擊識(shí)別運(yùn)行過程中的真實(shí)操作和混淆操作從而達(dá)到繞過混淆策略的目的,但這類方法通常需要利用中斷操作,暫停程序的執(zhí)行以降低噪聲。而本文方法基于硬件特性的原子事務(wù)把漏洞代碼和混淆指令封裝到原子事務(wù)中,在運(yùn)行時(shí),通過異常檢測(cè)模塊監(jiān)控事務(wù)狀態(tài),保障原子事務(wù)內(nèi)的代碼在執(zhí)行未結(jié)束前不被中斷,從而阻斷攻擊者實(shí)施細(xì)粒度的側(cè)信道攻擊途徑。通過雙重安全保障,本文實(shí)現(xiàn)了漏洞代碼的修補(bǔ),保護(hù)程序敏感信息不被泄露。
原子事務(wù)的臨界代碼,如事務(wù)的進(jìn)入和退出,會(huì)導(dǎo)致部分原子事務(wù)內(nèi)執(zhí)行的狀態(tài)信息泄露,因此SC-Patcher內(nèi)所有與原子事務(wù)狀態(tài)相關(guān)的切換操作均在安全跳板中完成后,再跳轉(zhuǎn)回目標(biāo)地址。這種設(shè)計(jì)保障了臨界代碼的安全邊際,使得攻擊者即便能夠獲取跳轉(zhuǎn)代碼的地址,也不能通過這類公共地址推測(cè)出有用的執(zhí)行信息。
SC-Patcher對(duì)基于時(shí)間的側(cè)信道攻擊防御存在不足。盡管SC-Patcher在插入混淆指令時(shí),會(huì)根據(jù)不同分支所包含的指令數(shù)量,盡可能地實(shí)現(xiàn)分支平衡。但對(duì)于復(fù)雜程序(如循環(huán)和函數(shù)調(diào)用)而言,其很難使不同分支的執(zhí)行時(shí)間完全一致。不過由于基于時(shí)間的攻擊精度并不高,特別在SC-Patcher保護(hù)的程序中,攻擊者只能測(cè)量各個(gè)原子事務(wù)內(nèi)所包含的多段代碼執(zhí)行耗費(fèi)的粗粒度的時(shí)間信息,因此可推測(cè)到的內(nèi)容極其有限。在后續(xù)工作中,SC-Patcher可通過在安全跳板中增加包含隨機(jī)訪存次數(shù)的混淆函數(shù),并在執(zhí)行過程中動(dòng)態(tài)調(diào)用這些函數(shù),達(dá)到動(dòng)態(tài)變換原子事務(wù)執(zhí)行時(shí)間的目的。
本次測(cè)試的目標(biāo)是評(píng)估攻擊者能否通過Prime + Probe攻擊竊取使用SC-Patcher修補(bǔ)后的AES程序中的加密密鑰。
(1)攻擊工具
Mastik[39]是一個(gè)實(shí)現(xiàn)側(cè)信道攻擊和分析的工具集,已提供包括Prime + Probe和Flush + Reload在內(nèi)的多種側(cè)信道攻擊。
(2)安全性測(cè)試
使用SC-Patcher對(duì)AES加密算法中關(guān)于S-box和T-box的訪問操作進(jìn)行修補(bǔ)。使用 修補(bǔ)后的程序加密明文,并在運(yùn)行時(shí),利用Mastik進(jìn)行Prime + Probe的攻擊,重復(fù)10 000次,并分析預(yù)測(cè)密鑰。實(shí)驗(yàn)中增加了同樣使用事務(wù)交易特性進(jìn)行側(cè)信道保護(hù)的T-SGX[24]作為對(duì)比測(cè)試對(duì)象。測(cè)試中修改了T-SGX的代碼,從而支持在非SGX環(huán)境中執(zhí)行。
(3)測(cè)試原子事務(wù)的有效性
攻擊測(cè)試中觀察到的現(xiàn)象同5.1節(jié)的分析一致,當(dāng)Prime + Probe攻擊采樣發(fā)生在原子事務(wù)內(nèi)時(shí),SC-Patcher立即檢測(cè)到攻擊并中止程序執(zhí)行,攻擊將無法繼續(xù),因此恢復(fù)密鑰失敗。T-SGX的交易事務(wù)同樣能準(zhǔn)確識(shí)別攻擊。
(4)測(cè)試動(dòng)態(tài)混淆的有效性
實(shí)驗(yàn)假設(shè)攻擊者改良了攻擊的采樣步驟,使得攻擊可以成功繞過SC-Patcher和T-SGX事務(wù)區(qū)代碼的檢查(測(cè)試時(shí)通過在原子事務(wù)開始前和結(jié)束后添加鉤子代碼以達(dá)到繞過的目的)。實(shí)驗(yàn)中增加靜態(tài)混淆的測(cè)試作為參照組,即在程序運(yùn)行過程中保持動(dòng)態(tài)混淆的偏移表表項(xiàng)內(nèi)容不變。
表2展示了針對(duì)不同防御方法保護(hù)下的AES程序,利用Prime + Probe攻擊所恢復(fù)的密鑰比特位的準(zhǔn)確率結(jié)果。攻擊者在精準(zhǔn)避開事務(wù)區(qū)邊界的情況下,可以準(zhǔn)確恢復(fù)T-SGX保護(hù)的程序的密鑰內(nèi)容。該結(jié)果直接說明單純基于原子事務(wù)的防御策略并不能為程序提供完善的安全防護(hù)。在SC-Patcher的測(cè)試結(jié)果中,攻擊者仍可以從靜態(tài)混淆策略的防護(hù)中恢復(fù)78.6%密鑰內(nèi)容,防護(hù)效果并不是非常理想;而在動(dòng)態(tài)混淆的防護(hù)加持下,由于攻擊者獲取的狀態(tài)信息中包含大量動(dòng)態(tài)混淆訪問操作,密鑰還原的準(zhǔn)確率僅達(dá)到7.1%。因此從實(shí)驗(yàn)測(cè)試的分析結(jié)果可得,SC-Patcher的動(dòng)態(tài)混淆的修補(bǔ)策略是安全有效的。
表2 還原AES密鑰的準(zhǔn)確率Table 2 The accuracy of restoring AES keys
本節(jié)測(cè)試原型系統(tǒng)SC-Patcher的側(cè)信道漏洞修補(bǔ)給應(yīng)用帶來的額外性能開銷。
(1)實(shí)驗(yàn)環(huán)境
所有測(cè)試運(yùn)行在1臺(tái)x86架構(gòu)的工作站上。硬件配置包括:Intel(R) Core(TM) i9-9900K CPU(代號(hào)Coffee Lake,8核心16線程,32 kB 的L1數(shù)據(jù)緩存,32 kB的L1代碼緩存,1 MB的L2緩存,16 MB的L3緩存,8路組相聯(lián)),128 GB DDR4內(nèi)存(頻率3 000 MHz),1 TB Samsung EVO 980 SSD。
(2)測(cè)試程序與編譯選項(xiàng)
測(cè)試的目標(biāo)程序?yàn)镺penSSL,版本號(hào)為 1.1.0f。編譯時(shí)均采用-O3等級(jí)的優(yōu)化,并使用-lto開啟鏈接時(shí)的優(yōu)化選項(xiàng)。
(3)漏洞檢測(cè)
使用基于差分的漏洞檢測(cè)工具DATA[34]檢測(cè)OpenSSL中包含的DES、AES和SHA-1簽名算法進(jìn)行側(cè)信道漏洞,然后通過人工審核篩選出共29個(gè)側(cè)信道漏洞。
(4)性能測(cè)試
SC-Patcher編譯測(cè)試程序的源碼,并根據(jù)被提交的漏洞信息對(duì)生成的應(yīng)用自動(dòng)完成漏洞修補(bǔ)。輸入隨機(jī)生成的密鑰,分別對(duì)DES、AES和SHA-1簽名算法進(jìn)行性能測(cè)試,重復(fù)執(zhí)行每種加密算法10 000次,記錄每次執(zhí)行的平均時(shí)間。
表3展示了漏洞修補(bǔ)對(duì)加密算法執(zhí)行效率的影響。從上述結(jié)果可得,漏洞修補(bǔ)給OpenSSL的3種算法帶來了約3.11%(幾何平均)的性能損耗。Shinde等[8]的工作在人工優(yōu)化后,仍然給程序執(zhí)行帶來幾十倍性能開銷,T-SGX[24]將全部代碼封裝在事務(wù)區(qū)中,也帶來了大約50%的性能開銷,而SC-Patcher的自動(dòng)修補(bǔ)方法帶給程序的性能損耗小于5%,這個(gè)結(jié)果完全可以接受。因此從性能方面而言,本文漏洞修補(bǔ)方法非常實(shí)用。此外,漏洞修補(bǔ)使得編譯后的二進(jìn)制文件大小增加了0.38%,改變很小。
表3 加密算法的性能損耗Table 3 The performance overhead of encryption
本文提出了一種自動(dòng)化的通用側(cè)信道漏洞修補(bǔ)方法,創(chuàng)新性地結(jié)合混淆執(zhí)行和硬件原子事務(wù),在使用噪聲混淆訪存操作隱藏真實(shí)訪存地址的同時(shí),采用原子事務(wù)避免攻擊者利用細(xì)粒度的側(cè)信道攻擊繞過混淆保護(hù)。安全分析與性能測(cè)試的結(jié)果表明,修補(bǔ)后的漏洞在不泄露用戶機(jī)密數(shù)據(jù)內(nèi)容的同時(shí),帶給程序的額外性能開銷可以幾乎忽略不計(jì),測(cè)試結(jié)果均優(yōu)于現(xiàn)有的工作。接下來的工作將拓展該方法的實(shí)現(xiàn)到ARM或RISC-V平臺(tái),并進(jìn)一步提高兼容性和通用性。