国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于原子混淆的通用側信道漏洞修補方法

2022-04-18 01:23鄒德清張盼劉偉陳維杰陸弈帆
網(wǎng)絡與信息安全學報 2022年2期
關鍵詞:攻擊者事務信道

鄒德清,張盼,劉偉,陳維杰,陸弈帆

(1. 大數(shù)據(jù)技術與系統(tǒng)國家地方聯(lián)合工程研究中心,湖北 武漢 430074;2. 服務計算技術與系統(tǒng)教育部重點實驗室,湖北 武漢 430074; 3. 大數(shù)據(jù)安全湖北省工程研究中心,湖北 武漢 430074;4. 華中科技大學網(wǎng)絡空間安全學院,湖北 武漢 430074; 5. 北京京航計算通訊研究所,100089 北京)

0 引言

微架構側信道在硬件架構中非常普遍,這些側信道產(chǎn)生的一個主要原因是硬件組件被系統(tǒng)內(nèi)的不同進程所共享,特別是硬件在設計中基于局部性原理引入的各種緩存組件,如緩存、頁表、頁表緩存和分支目標緩存等。在執(zhí)行程序過程中,數(shù)據(jù)或代碼是否被暫存到這些組件中會表現(xiàn)出比較明顯的響應時間差異。由于這些組件被系統(tǒng)內(nèi)的進程共享,攻擊者可利用多種方式[1-11]影響進程對緩存組件的使用,然后通過測量時間差披露受害程序的運行軌跡。

含有微架構側信道漏洞(以下簡稱漏洞)的程序在運行時會表現(xiàn)出與機密輸入有關的非功能性行為。例如,不同機密輸入的變化會影響基于控制流泄露漏洞選擇不同執(zhí)行路徑,或影響基于數(shù)據(jù)訪問泄露的漏洞訪問不同目標地址。攻擊者可在獲取程序運行軌跡后,還原程序行為,通過分析輸入與漏洞代碼行為間的關系,還原用戶機密數(shù)據(jù)內(nèi)容。

常見的側信道防御策略包括異常檢測和行為混淆,學術界提出了許多硬件層的[12-15]和系統(tǒng)層的[16-24]的解決方法。這些方法都存在性能或兼容性方面的限制,未得到廣泛使用。開發(fā)人員在實際中傾向于采用細粒度的靶向防御,即在軟件層對代碼實施側信道漏洞檢測[25-30],然后修補程序中的側信道漏洞,這類方法通常只會給程序帶來很小的性能損耗,并且因為無須修改硬件或系統(tǒng),可實現(xiàn)側信道漏洞的快速修補以及大范圍部署,被主流的加密實現(xiàn)采用。

基于軟件的漏洞修補可分為行為一致[31]和噪聲混淆[2]。基于行為一致的策略實現(xiàn)難度較大,首先需要對代碼進行準確分析,然后對路徑平衡補全[31]。這種策略在面對復雜程序時很難保障行為的完全一致,特別是循環(huán)嵌套。因此多數(shù)情況下,開發(fā)者需要手工完成修補,這就對開發(fā)者的專業(yè)素養(yǎng)要求很高,此外在程序代碼量特別大時,漏洞分析和修補非常容易出現(xiàn)偏差。噪聲混淆的策略雖然容易實現(xiàn)自動化,但簡單的噪聲混淆容易被攻擊者通過預先構建好的統(tǒng)計學模型移除[32]或者細粒度的側信道攻擊繞過[2,33],并不能達到好的防御效果。

本文提出了一種全自動的基于原子混淆的通用側信道漏洞修補方法。該方法的核心思想是結合硬件原子事務技術和噪聲混淆技術,在漏洞代碼中增加用于混淆的訪存操作,然后把漏洞代碼和混淆操作代碼封裝為原子事務,并在程序運行時監(jiān)控事務執(zhí)行狀態(tài),保障原子事務內(nèi)的代碼在結束前連續(xù)執(zhí)行未被中斷,否則立即中止執(zhí)行并回退。混淆訪存使得攻擊者在攻擊過程中獲取到的軌跡除了真實目標訪存外,還包含非常多的用于混淆的噪聲訪存;原子事務保障攻擊者無法通過細粒度的側信道攻擊去辨別真實的訪存和噪聲訪存。完成漏洞修補后的程序,攻擊者即便能夠搜集到程序運行軌跡,也只能觀察到事務內(nèi)一段連續(xù)執(zhí)行的代碼對硬件組件狀態(tài)的改變,這些包含大量噪聲的狀態(tài)信息難以被用于還原用戶的機密信息。

本文基于LLVM編譯器實現(xiàn)了自動修補方法的原型系統(tǒng)SC-Patcher,并在實現(xiàn)中采用了多種安全和性能方面的優(yōu)化策略。首先,SC-Patcher針對不同類型的漏洞設計了不同的混淆策略,在保障混淆的安全性的同時,盡可能減少額外訪存指令數(shù)量以降低對程序性能的影響。其次,在封裝原子事務時,SC-Patcher采取事務聚合的優(yōu)化操作將多個離散代碼(包括漏洞代碼、混淆操作和正常代碼)封裝到同一事務,在提高性能的同時增加事務內(nèi)噪聲的多樣性。通過真實的側信道攻擊驗證SC-Patcher修補后的密碼算法的安全性,結果表明修補后的程序能夠很好地抵御攻擊者竊取機密數(shù)據(jù)的行為。通過SC-Patcher對修補后的OpenSSL加密算法進行性能測試,結果表明SC-Patcher的漏洞補丁給程序帶來的性能損耗(3.11%)幾乎可以忽略不計。與現(xiàn)有的側信道防御方法T-SGX[24]的結果進行對比,SC-Patcher在安全性和性能方面有顯著提高。

本文貢獻包括:

1) 提出了一種基于原子混淆的通用方案能夠?qū)崿F(xiàn)側信道漏洞的自動修補;

2) 實現(xiàn)了原型系統(tǒng)SC-Patcher,并給出了許多安全和性能方面的優(yōu)化設計方案;

3) 使用SC-Patcher對真實的程序進行漏洞修補,對修補后的程序進行安全和性能測試,證明了修補方法的安全性和實用性。

1 背景知識

1.1 側信道攻擊

微架構的側信道攻擊指的是攻擊者通過觀察硬件組件的狀態(tài)信息竊取目標程序的私密內(nèi)容的行為。在側信道攻擊中,只有目標程序的機密輸入S、程序運行時表現(xiàn)的行為P(如分支選擇或者數(shù)據(jù)訪問)和可被觀察到的組件狀態(tài)信息I之間存在關聯(lián)關系: I~P~S,攻擊者才能通過使用觀察到的狀態(tài)信息I還原出機密輸入S。其中I~P表示狀態(tài)信息I與程序行為P之間存在關聯(lián)關系。系統(tǒng)會泄露程序行為的狀態(tài)信息,如基于處理器的緩存[3-6]、頁表[8-9]、頁表緩存[7]和分支目標緩存[2]。可以通過產(chǎn)生各類中斷來減少攻擊時的噪聲,提高還原信息的準確度[8-9]。 P ~S表示程序行為P和機密輸入S之間存在關聯(lián)關系,即機密輸入的變化會導致程序的行為發(fā)生改變,而攻擊者可以通過獲取程序的行為推測出機密輸入的內(nèi)容。常見的關聯(lián)關系有:分支選擇依賴,即程序控制流選擇的目標分支依賴機密輸入;數(shù)據(jù)訪問依賴,程序內(nèi)數(shù)據(jù)訪問的目的地址依賴機密輸入。通常程序中存在分支選擇依賴和數(shù)據(jù)訪問依賴關系的代碼被分別視為程序的基于控制依賴的側信道漏洞和基于數(shù)據(jù)訪問依賴的側信道漏洞[31,34]。

1.2 側信道防御策略與檢測技術

從部署層上對側信道的防御策略進行分類,可分為硬件架構層、系統(tǒng)層和軟件層的防御策略。

硬件架構層的防御策略,最直接的方法是分隔共享的資源,如處理器的緩存分隔[11,13]和頁表緩存分隔[15]。另外一種方法是隨機化資源的使用,混淆側信道的觀察[12]。

系統(tǒng)層的側信道防御策略包括:① 硬件組件分割,把組件的不同部分分配給不同的進程,如頁染色[16]或者頁鎖定[17];② 刷新系統(tǒng)狀態(tài)以降低信息的泄露風險[18];③ 降低系統(tǒng)測量的準確值,如修改虛擬機的rdtsc指令,添加隨機值[19-21];④ 檢測程序的異常行為,如通過計數(shù)器判斷程序的運行是否過慢[22],或者檢測程序運行過程中產(chǎn)生的中斷是否過多[23-24]。

軟件層的側信道防御策略主要有3類:一致化、隨機混淆和漏洞檢測。一致化指的是,開發(fā)者通過修改程序或者算法,使得攻擊者在機密輸入變化的情況下搜集到的程序軌跡是一樣的。隨機混淆是在程序中添加噪聲來隱藏真實的程序軌跡,一般是在與程序機密數(shù)據(jù)相關的訪問中添加額外的混淆訪存,或者對代碼或者數(shù)據(jù)進行隨機重排。漏洞檢測主要分為靜態(tài)和動態(tài)方法。靜態(tài)檢測方法常用抽象表征去分析源碼并測量泄露的上確界。CacheAudit[25]通過馬爾可夫鏈量化程序泄露信息的上限。還有很多工具用于驗證程序是否有依賴機密數(shù)據(jù)的條件跳轉(zhuǎn)和內(nèi)存訪問[26-28]。動態(tài)檢測方法是根據(jù)程序運行時的真實軌跡去判斷側信道漏洞。CacheD[29]檢查每條指令在不同的機密輸入下是否會訪問不同的緩存地址。Shin等[30]運用K-means聚合算法去檢查緩存行為和機密輸入的關聯(lián)關系。MicroWalk[30]采用相互信息測量相同的關系。側信道漏洞檢測只負責發(fā)現(xiàn)和定位漏洞,而側信道漏洞自動修補方面的工作相對較少,通常需要專家的人工介入,對漏洞進行分析與重新設計算法,專業(yè)性很強,門檻很高。文獻[31]通過分析程序,平衡分支路徑實現(xiàn)側信道漏洞修補,該方法一方面并不支持復雜邏輯程序,另一方面攻擊者仍可以通過細粒度的側信道攻擊分辨真實的軌跡和混淆的軌跡[33]。

硬件層和系統(tǒng)層的防御策略很少被應用于真實的平臺或者場景中,主要原因是這些方案存在性能或兼容性方面的問題,難以被部署到實際的生產(chǎn)環(huán)境中。相對而言,軟件層的防御策略則更加實用,具體為:這類策略能夠快速修復漏洞并完成大范圍的部署;另外,軟件層的漏洞修復大多不會給程序帶來額外的性能開銷。

1.3 事務內(nèi)存

事務內(nèi)存的設計目的是簡化并行編程模型,降低多核處理器上獲取互斥鎖的開銷,提高并行的線程對共享內(nèi)存操作的效率。事務內(nèi)存的特性包含原子性、一致性和隔離性。原子性指的是事務內(nèi)的操作作為一個整體是不可被分割的,要么事務內(nèi)的所有讀寫提交全部被系統(tǒng)接受,要么全部被系統(tǒng)拋棄;一致性指的是事務執(zhí)行的前后,系統(tǒng)都必須處于一致性狀態(tài);隔離性指的是事務在提交之前,內(nèi)部操作對象的狀態(tài)對外界不可見,不會影響系統(tǒng)的狀態(tài)。如果一個事務在沒有沖突的情況下執(zhí)行結束,其所有的讀寫會被提交到內(nèi)存中,否則所有因為讀寫而保存的中間狀態(tài)將被拋棄(不會被提交到真實的內(nèi)存中),同時系統(tǒng)會將程序的控制權交給進入事務區(qū)前注冊的一個異常處理句柄去決定是否重新執(zhí)行事務區(qū)。在運行事務時,硬件需要把事務內(nèi)所有讀數(shù)據(jù)和寫數(shù)據(jù)的內(nèi)容暫存到一個緩沖區(qū)中,然后在事務運行結束前,再把緩存的內(nèi)容提交到內(nèi)存中。Intel TSX(transactional synchronization extensions)將L1緩存作為緩沖區(qū)。這種設計無須在硬件上增加新的事務緩存硬件,可直接復用現(xiàn)有的緩存一致性協(xié)議檢測事務間的訪問沖突,能夠極大地簡化硬件的設計。但是這種設計導致TSX需要對事務內(nèi)的讀寫集施加嚴格的限制,即L1數(shù)據(jù)緩存必須能夠容納事務的所有內(nèi)存的寫操作,否則會導致事務的退出。

RTM(restricted transactional memory)是Intel TSX的硬件事務內(nèi)存解決方案提供的接口。CPU的指令集中一共有4條與RTM相關的指令,其中XBEGIN用于初始化事務;XEND用于結束事務的執(zhí)行;XABORT用于中斷事務的執(zhí)行;XTEST用于測試代碼是否在事務中執(zhí)行。前SC-Patcher的實現(xiàn)采用RTM指令對代碼進行原子事務封裝,它同樣適應于其他廠商的硬件事務內(nèi)存解決方案,如ARM的TME(transactional memory extension),AMD的ASF(advanced synchronization facility)。

2 威脅假設模型

假設開發(fā)人員已通過各種手段,發(fā)現(xiàn)并標識出應用程序代碼中的側信道漏洞。本文方法的目標是修補程序中的這些側信道漏洞,阻止攻擊者利用這些側信道漏洞竊取用戶的私密信息。在普通場景中,攻擊來自系統(tǒng)內(nèi)非root權限的普通用戶,不能直接訪問被攻擊程序的內(nèi)容。在可信執(zhí)行環(huán)境(如IntelSGX)的場景中,攻擊可以來自于惡意的操作系統(tǒng),攻擊者可以調(diào)度所有的進程,利用各種頁級、緩存級、指令級的側信道攻擊,探測系統(tǒng)狀態(tài),但不能直接觀察目標程序的內(nèi)存。

不考慮類似能量分析[32]、電磁輻射[35]等物理級的側信道攻擊,這些攻擊通常需要攻擊者近距離地去搜集物理機的各類信號。瞬態(tài)執(zhí)行攻擊,如Meltdown[36]和Spectre[37]攻擊及其變種[38]不在防御范圍內(nèi),這些攻擊與程序中是否存在微架構側信道漏洞并無關系,并且屬于硬件漏洞。

3 漏洞修補方法

本節(jié)首先簡單介紹修補方法的工作流程,然后詳細介紹工作流程中涉及的各個模塊。

側信道漏洞修補的工作流程如圖1所示,含有編譯和運行兩個階段,整個過程涉及多個模塊的參與。編譯階段包含代碼標識模塊、混淆插樁模塊和原子事務封裝模塊;運行階段包含動態(tài)混淆模塊和異常檢測模塊。在編譯階段,開發(fā)者提供程序源碼和側信道漏洞位置信息給一個修改后的編譯器。代碼標識模塊處于編譯器前端,基于漏洞位置信息標識應用代碼,并將這些標識信息作為元數(shù)據(jù)傳遞給編譯器后端?;煜鍢赌K和原子事務封裝模塊根據(jù)代碼標識信息,以基本塊為最小單元對漏洞代碼做進一步處理:混淆插樁模塊在編譯時向漏洞代碼插入額外的混淆訪存指令,以達到隱藏程序真實運行軌跡的目的;原子事務封裝模塊封裝漏洞代碼和混淆代碼為原子事務,保障代碼在執(zhí)行中不可被中斷。在運行階段,動態(tài)混淆模塊與異常檢測模塊被加載到程序進程空間中,動態(tài)混淆模塊在程序執(zhí)行時不斷變換混淆訪存目標地址,增加混淆噪聲的不確定性,異常檢測模塊則監(jiān)控原子事務在執(zhí)行過程中未被惡意中斷,確保代碼是以原子性運行的。

圖1 側信道漏洞修補的工作流程 Figure 1 The workflow of patching side-channel vulnerabilities

圖1展示了代碼經(jīng)各個模塊處理后的變化。其中基本塊bb_0使用機密數(shù)據(jù)secret作為數(shù)組內(nèi)數(shù)據(jù)訪問的索引,存在基于數(shù)據(jù)訪問的側信道漏洞;基本塊bb_p使用機密數(shù)據(jù)secret_1作為分支判斷條件,執(zhí)行基本塊bb_1或基本塊bb_2會導致機密數(shù)據(jù)secret_1值的泄露,存在基于控制依賴的側信道漏洞。

3.1 代碼標識模塊

代碼標識模塊根據(jù)用戶提供的側信道漏洞信息標識應用的源碼。漏洞信息包括:文件名、漏洞行和側信道漏洞類型。表1展示了模塊用于標識代碼的4種類型,為了簡化稱呼,分別稱這些代碼為D(data)類代碼、B(branch)類代碼、U(unsafe)類代碼和S(safe)類代碼。需要特別注意的是U類代碼,這類代碼為B類或U類代碼中被調(diào)用的函數(shù)。暴露這類代碼的執(zhí)行信息會導致調(diào)用函數(shù)執(zhí)行信息的泄露。假如一段代碼中同時包含數(shù)據(jù)訪問依賴和控制選擇依賴的漏洞,則被同時標記為D類和B類。

表1 SC-Patcher中的代碼類型標識Table 1 Code Type Identification in SC-Patcher

圖1采用不同顏色對D、B、U和S類代碼進行區(qū)分,如基本塊bb_0使用機密數(shù)據(jù)作為訪問數(shù)組的索引值,存在數(shù)據(jù)訪問依賴的側信道漏洞,被標記為D類代碼(藍色基本塊);分支在選擇基本塊bb_1和bb_2時依賴機密數(shù)據(jù)的值,因此包含控制選擇依賴的側信道漏洞,被標記為B類代碼(黃色基本塊);函數(shù)bar在基本塊bb_2內(nèi)被調(diào)用,bar的泄露會導致基本塊bb_2的執(zhí)行信息泄露,被標記為U類代碼(棕黃色基本塊)。

3.2 混淆插樁模塊

混淆插樁模塊負責向漏洞代碼中插入混淆訪存指令,達到在運行時隱藏漏洞代碼的真實運行軌跡的目的。模塊根據(jù)漏洞代碼的類型的不同,采取了不同混淆策略。

針對D類包含數(shù)據(jù)訪問依賴漏洞的代碼,混淆插樁模塊在原始訪存操作的前后增加多個用于混淆的內(nèi)存讀寫操作。數(shù)量過多的混淆訪存指令會給程序帶來比較明顯的性能損耗,而過少的數(shù)據(jù)混淆訪存又無法提供充足的安全保障,為解決這一矛盾,該模塊引入動態(tài)隨機訪存機制以增強混淆噪聲,在提高安全性的同時降低了混淆訪存的數(shù)量。圖1中基本塊bb_0的變化展示了混淆插樁模塊增加數(shù)據(jù)訪問混淆的效果:模塊在array[secret]附近插入額外訪存操作,訪存目標地址基于混淆偏移表o_table對應表項的偏移值動態(tài)計算得到。

針對B類代碼,即代碼中包含控制選擇依賴的側信道漏洞,混淆插樁模塊采取串聯(lián)預訪問的混淆策略:使用直接跳轉(zhuǎn)指令,在執(zhí)行真實代碼前,穿插預先訪問區(qū)域內(nèi)的基本塊,達到隱藏真實代碼訪問的目的。不同分支執(zhí)行的指令數(shù)量存在不同,從而導致分支執(zhí)行所耗費的時間存在差異。為降低因時間產(chǎn)生的信息泄露,混淆模塊也在B類代碼的不同分支中添加額外的訪存指令,平衡不同分支的指令數(shù)量,分支執(zhí)行時間盡可能相似。如圖1中混淆插樁模塊對基本塊bb_p、基本塊bb_1、基本塊bb_2的處理,展示了插樁代碼如何實現(xiàn)混淆執(zhí)行:控制流在進入基本塊bb_p分支選擇前,先跳轉(zhuǎn)到基本bb_1,然后到基本塊bb_2,最后執(zhí)行條件選擇進入真正的基本塊執(zhí)行,這樣會強制加載其他基本塊的內(nèi)容到緩存中,從而達到混淆的目的。

3.3 原子事務封裝模塊

原子事務封裝模塊將漏洞代碼和混淆代碼封裝為原子事務。針對不同分類標識代碼,該模塊所采用的封裝策略存在差異。

對于只包含D類標識的代碼,即存在數(shù)據(jù)訪問依賴的側信道漏洞的代碼,原子事務封裝模塊將漏洞所在基本塊封裝為原子事務。圖1中transaction_begin函數(shù)表示原子事務的開始,transaction_end函數(shù)表示原子事務的結束。

模塊對于B類代碼的處理,是期望避免代碼的執(zhí)行信息被泄露,但代碼的前驅(qū)節(jié)點和代碼對后繼節(jié)點的分支選擇都會暴露執(zhí)行信息。因此原子事務封裝模塊會將基本塊的前驅(qū)結點以及前驅(qū)結點的所有子基本塊添加到原子區(qū)內(nèi),同時通過一個跳板代碼完成狀態(tài)切換并跳轉(zhuǎn)到后繼節(jié)點。圖1的原子事務封裝模塊在基本塊bb_p首指令處插入transaction_begin開始原子事務,并在基本塊bb_s的入口處的transaction_end結束原子事務。這樣基本塊bb_p和bb_s間的基本塊(包括函數(shù)bar的所有基本塊)執(zhí)行都處于同一原子事務區(qū)中。

當代碼同時包含B類和D類標識時,原子事務封裝模塊采用B類代碼的封裝策略。U類代碼的處理邏輯同B類代碼,但在封裝的實現(xiàn)細節(jié)上存在稍許差異。

3.4 動態(tài)混淆模塊

動態(tài)混淆模塊在程序運行時,通過隨機改變混淆偏移表內(nèi)的偏移值,實現(xiàn)混淆指令的動態(tài)地址訪存,達到增強混淆噪聲強度、提高安全性的目的?;煜L存目標地址是通過原目標地址值加上對應偏移表表項的偏移值計算所得。通常偏移表的表項值為?4 096~4 096的任意數(shù),這個范圍覆蓋了緩存級到頁級的地址。一方面能夠適應多種粒度的側信道攻擊;另一方面計算得到的混淆訪存內(nèi)容的地址都比較靠近目標訪存,使得混淆地址和實際地址的相關性比較強,從邏輯上講更具有迷惑性。動態(tài)混淆模塊在記錄原子事務執(zhí)行次數(shù)的同時會隨機生成一個閾值與所記錄次數(shù)進行比較,當原子事務的執(zhí)行次數(shù)大于閾值時,模塊重置混淆偏移表,并使用隨機值再次填充,最后清零事務執(zhí)行次數(shù)并重新生成閾值后,繼續(xù)程序執(zhí)行。

3.5 異常檢測模塊

異常檢測模塊負責監(jiān)控原子事務內(nèi)代碼的運行狀態(tài),判斷事務在執(zhí)行過程中是否存在被攻擊的異常行為。若被封裝的代碼的原子性在執(zhí)行過程中被破壞,硬件會立即中斷事務的執(zhí)行并回滾到事務初始狀態(tài),然后跳轉(zhuǎn)到異常檢測模塊進行攻擊判定。異常檢測模塊根據(jù)硬件交易事務退出時返回的狀態(tài)碼,決定是否停止代碼的執(zhí)行。運行過程中事務退出的原因有多種,其中包含許多正常的系統(tǒng)行為。例如,現(xiàn)代操作系統(tǒng)以固定時間間隔發(fā)送時鐘中斷,達到多任務分時輪轉(zhuǎn)的目的,被封裝為原子事務的代碼在執(zhí)行過程中很有可能因當前進程輪詢的時間片結束,收到時鐘中斷信號,最終導致事務的中斷。另外一種情況是,在代碼執(zhí)行過程中,目標執(zhí)行代碼、訪存的代碼頁不在內(nèi)存中,而產(chǎn)生缺頁異常情況,導致交易事務區(qū)中的代碼執(zhí)行中斷。事務內(nèi)的代碼在異常退出時,檢測模塊可讀取硬件返回的退出狀態(tài)。異常檢測模塊為每個異常設定可接受數(shù)量的閾值,然后統(tǒng)計導致事務退出的各個異常發(fā)生的次數(shù),當次數(shù)超出閾值時,異常檢測模塊會判定程序存在被攻擊的可能而立即停止代碼的執(zhí)行。

4 SC-Patcher實現(xiàn)與優(yōu)化細節(jié)

基于上述的側信道漏洞修補方法,本文在LLVM 11.0的基礎上實現(xiàn)了原型系統(tǒng)SC-Patcher,其支持對大部分C和C++的程序進行漏洞修補的處理。

原型系統(tǒng)的主要部分包括事務混淆插樁模塊和原子事務封裝模塊,被整合在LLVM編譯器的后端;代碼標識模塊作為LLVM編譯器的一個前端插件,將每個導出函數(shù)的函數(shù)包裝器注入LLVM 中間表示中;動態(tài)混淆模塊和異常檢測模塊作為靜態(tài)鏈接庫,在編譯時被自動鏈接到程序中,整個原型系統(tǒng)的核心實現(xiàn)部分約4 200行代碼。

本節(jié)將介紹SC-Patcher中原子事務分割、原子事務聚合、安全跳板、敏感函數(shù)的封裝、寄存器優(yōu)化的實現(xiàn)細節(jié)。

4.1 原子事務分割

SC-Patcher需要分割存在緩存使用沖突的原子事務,這是因為在運行Intel TSX的事務時,原子事務內(nèi)的所有寫操作內(nèi)容必須保留在 L1數(shù)據(jù)緩存中,直到事務結束后才會真正地提交到內(nèi)存中。任何導致暫存數(shù)據(jù)被驅(qū)逐出緩存的行為,都會導致事務執(zhí)行的中止。因此若一個事務內(nèi)的所有寫操作不能暫存到L1數(shù)據(jù)緩存,這個事務將永遠不會被成功執(zhí)行。而L1數(shù)據(jù)緩存受硬件實現(xiàn)的影響,其大小有限,以Skylake處理器為例,L1數(shù)據(jù)緩存為8路組相聯(lián),單個緩存行為64 byte,緩存大小為32 kB。對于單個緩存行大小的任意數(shù)據(jù)訪問,處理器都會將該緩存行的所有內(nèi)容加載到8路L1緩存組的任意一個槽。假如存在8 個以上的不同緩存行的寫操作內(nèi)容映射到同一緩存組,會導致L1數(shù)據(jù)緩存驅(qū)逐事務的寫內(nèi)容,事務將立即執(zhí)行失敗。SC-Patcher將緩存沖突作為事務切割的依據(jù),盡可能降低緩存行的沖突,提高事務執(zhí)行的成功率。

SC-Patcher移植T-SGX[24]內(nèi)一個用于分析代碼中的緩存使用量的靜態(tài)分析組件,在編譯時對漏洞和混淆代碼進行緩存沖突分析。由于編譯器在編譯時不能獲取程序在運行時的確切訪存地址,因此該組件實現(xiàn)采取了保守的過近似分析算法以估算代碼中最糟糕的緩存沖突情況:對于可獲取準確地址的對象,分析組件,直接將其分配給對應的緩存組,并且相應路數(shù)加1;對于訪問對象的地址是未知寄存器以及固定偏移的組合(如rbp+16),分析組件根據(jù)基指針分組計算,分別估計新增的緩存使用路數(shù),并把這些路數(shù)累加到所有的緩存組;對于地址完全未知的對象,分析組件,將該對象分配給所有緩存組。事務區(qū)內(nèi)緩存的使用是上述3種情況累加的上確值。組件會在分析結束后根據(jù)結果分割代碼。

4.2 原子事務聚合

SC-Patcher嘗試在不產(chǎn)生緩存沖突的前提下,將多個離散的原子事務聚合到同一原子事務中。該聚合處理提升了程序的安全性和執(zhí)行效率:從安全方面講,原子事務內(nèi)執(zhí)行的指令越多,累積的硬件狀態(tài)的改變越多,攻擊者攻擊時的噪聲越大,攻擊越困難;從性能方面講,執(zhí)行一個空的Intel TSX事務(只執(zhí)行XBEGIN和XEND指令),會耗費大約200時鐘周期,因此減少頻繁的事務創(chuàng)建和結束,可提升程序性能。SC-Patcher首先分析各原子事務內(nèi)的緩存使用,然后通過動態(tài)規(guī)劃,在不產(chǎn)生緩存沖突的情況下,盡可能地合并事務。此外,事務間通過安全代碼完成控制流的轉(zhuǎn)移,因此SC-Patcher在進行緩存分析和事務封裝時,需要考慮這些安全代碼。

4.3 安全跳板

SC-Patcher使用安全跳板實現(xiàn)原子事務間的安全切換。事務的開始指令(XBEGIN)在執(zhí)行前和結束指令(XEND)在執(zhí)行結束并不在事務的保護中,假如把原子事務封裝的開始指令(XBEGIN)和結束指令(XEND)直接嵌在基本塊中,攻擊者可以在程序運行時探測到兩個相鄰事務間非保護指令的執(zhí)行,而導致受保護的基本塊的執(zhí)行信息泄露。如圖2所示,控制流在基本塊 bb_leaky_1執(zhí)行結束后跳到基本塊bb_leaky_2,兩個基本塊被分割到不同事務,如果將XBEGIN指令直接嵌在基本塊bb_leaky_2的入口處,攻擊者通過不斷地探測這條指令的地址,可推測出基本塊bb_leaky_2的執(zhí)行狀態(tài)。為避免信息泄露,SC-Patcher在安全跳板中完成原子事務的狀態(tài)切換:基本塊首先跳轉(zhuǎn)到安全跳板中,完成原子事務切換,然后跳轉(zhuǎn)到目標地址(如圖2中黑色箭頭指向的程序控制流)。通過安全跳板的防護策略,攻擊者僅可以獲取安全跳板內(nèi)的公共指令地址的訪問信息,而原子事務內(nèi)的代碼的執(zhí)行信息仍受到保護。

圖2 安全跳板 Figure 2 Secure springboard

4.4 敏感函數(shù)的封裝

SC-Patcher設計了專門的指令片段用于進入和退出U類敏感函數(shù)。原因是無泄漏的S類代碼需要在普通狀態(tài)下調(diào)用U類敏感函數(shù),而受保護的B類代碼需要在原子事務狀態(tài)下進入U類敏感函數(shù)。圖3包含上述兩種不同類型的函數(shù)調(dià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的開始和結尾處運行了兩次原子事務的狀態(tài)切換,是因為靜態(tài)分析函數(shù)間的緩存沖突幾乎不太現(xiàn)實,因此SC-Patcher通過事務切換消除潛在的緩存沖突。為避免攻擊者通過探測原子事務封裝指令的地址泄露被調(diào)用的函數(shù)執(zhí)行信息,SC-Patcher在處理受保護目標函數(shù)調(diào)用時(如基本塊bb_leaky調(diào)用函數(shù)bar),首先通過安全跳板內(nèi)的一個中間片段sp.call完成原子事務狀態(tài)切換,然后跳轉(zhuǎn)到目標函數(shù)bar內(nèi)繼續(xù)執(zhí)行代碼。此外,函數(shù)bar在執(zhí)行結束后,首先通過一個直接跳轉(zhuǎn)指令轉(zhuǎn)到安全跳板中的指令片段sp.ret完成原子事務切換后,然后回到基本塊bb_leaky中。

基本塊bb_safe在普通狀態(tài)下調(diào)用函數(shù)bar,由于函數(shù)bar被封裝為原子事務,因此CPU在進入bar函數(shù)前,需要先開啟事務,否則函數(shù)會在執(zhí)行中,由于不處于事務狀態(tài)下執(zhí)行XEND指令而產(chǎn)生異常。函數(shù)bar返回時(基本塊bb_safe),需要退出原子事務狀態(tài)恢復到普通模式后,才可繼續(xù)執(zhí)行bb_safe。因此,SC-Patcher在每個U類敏感函數(shù)的入口函數(shù)前插入事務判斷片段,若發(fā)現(xiàn)U類函數(shù)不處于事務狀態(tài),便立即開啟一個事務。

4.5 寄存器優(yōu)化

SC-Patcher修改了編譯器后端對寄存器的分配策略,簡化了安全跳板代碼的實現(xiàn)。Intel TSX會在事務異常中止時將中止狀態(tài)碼(abort status code)保存到rax寄存器中,該操作會覆蓋rax寄存器的原始值。一種解決方法是在彈簧跳板中插入相關指令,在事務執(zhí)行前保存rax的值,在事務執(zhí)行時再還原rax的值,而這種設計需要分析哪些代碼使用了rax寄存器,并在跳轉(zhuǎn)代碼中插入額外的指令,處理比較煩瑣。SC-Patcher通過修改編譯器的寄存器分配策略,在泄露的函數(shù)中設置rax為保留寄存器,限制rax寄存器只被用于基本塊內(nèi)的傳值,而基本塊間的數(shù)據(jù)流則不會使用rax寄存器。該優(yōu)化操作省去了復雜的寄存器分析步驟,簡化了設計。

5 安全性分析與測試

本節(jié)對SC-Patcher實現(xiàn)的安全性進行分析,并通過真實的側信道攻擊進行安全測試驗證。

5.1 安全性分析

本文提出的側信道漏洞修補方法的核心策略為混淆代碼和原子事務?;煜a是在編譯時在側信道漏洞的相關代碼中插入額外的混淆訪存指令,用于隱藏漏洞代碼的執(zhí)行軌跡。本文方法針對控制流選擇依賴的漏洞和數(shù)據(jù)訪問依賴的漏洞分別采用了串聯(lián)預訪問和動態(tài)隨機混淆訪存的策略。對于攻擊者而言,在程序運行時,硬件狀態(tài)由漏洞的真實訪存和混淆噪聲訪存共同作用,收集到的狀態(tài)信息包含大量噪聲,難以被攻擊者用于還原程序的準確運行軌跡,進而無法被用于恢復用戶的私密數(shù)據(jù)。攻擊者可以利用細粒度的側信道攻擊識別運行過程中的真實操作和混淆操作從而達到繞過混淆策略的目的,但這類方法通常需要利用中斷操作,暫停程序的執(zhí)行以降低噪聲。而本文方法基于硬件特性的原子事務把漏洞代碼和混淆指令封裝到原子事務中,在運行時,通過異常檢測模塊監(jiān)控事務狀態(tài),保障原子事務內(nèi)的代碼在執(zhí)行未結束前不被中斷,從而阻斷攻擊者實施細粒度的側信道攻擊途徑。通過雙重安全保障,本文實現(xiàn)了漏洞代碼的修補,保護程序敏感信息不被泄露。

原子事務的臨界代碼,如事務的進入和退出,會導致部分原子事務內(nèi)執(zhí)行的狀態(tài)信息泄露,因此SC-Patcher內(nèi)所有與原子事務狀態(tài)相關的切換操作均在安全跳板中完成后,再跳轉(zhuǎn)回目標地址。這種設計保障了臨界代碼的安全邊際,使得攻擊者即便能夠獲取跳轉(zhuǎn)代碼的地址,也不能通過這類公共地址推測出有用的執(zhí)行信息。

SC-Patcher對基于時間的側信道攻擊防御存在不足。盡管SC-Patcher在插入混淆指令時,會根據(jù)不同分支所包含的指令數(shù)量,盡可能地實現(xiàn)分支平衡。但對于復雜程序(如循環(huán)和函數(shù)調(diào)用)而言,其很難使不同分支的執(zhí)行時間完全一致。不過由于基于時間的攻擊精度并不高,特別在SC-Patcher保護的程序中,攻擊者只能測量各個原子事務內(nèi)所包含的多段代碼執(zhí)行耗費的粗粒度的時間信息,因此可推測到的內(nèi)容極其有限。在后續(xù)工作中,SC-Patcher可通過在安全跳板中增加包含隨機訪存次數(shù)的混淆函數(shù),并在執(zhí)行過程中動態(tài)調(diào)用這些函數(shù),達到動態(tài)變換原子事務執(zhí)行時間的目的。

5.2 安全性測試

本次測試的目標是評估攻擊者能否通過Prime + Probe攻擊竊取使用SC-Patcher修補后的AES程序中的加密密鑰。

(1)攻擊工具

Mastik[39]是一個實現(xiàn)側信道攻擊和分析的工具集,已提供包括Prime + Probe和Flush + Reload在內(nèi)的多種側信道攻擊。

(2)安全性測試

使用SC-Patcher對AES加密算法中關于S-box和T-box的訪問操作進行修補。使用 修補后的程序加密明文,并在運行時,利用Mastik進行Prime + Probe的攻擊,重復10 000次,并分析預測密鑰。實驗中增加了同樣使用事務交易特性進行側信道保護的T-SGX[24]作為對比測試對象。測試中修改了T-SGX的代碼,從而支持在非SGX環(huán)境中執(zhí)行。

(3)測試原子事務的有效性

攻擊測試中觀察到的現(xiàn)象同5.1節(jié)的分析一致,當Prime + Probe攻擊采樣發(fā)生在原子事務內(nèi)時,SC-Patcher立即檢測到攻擊并中止程序執(zhí)行,攻擊將無法繼續(xù),因此恢復密鑰失敗。T-SGX的交易事務同樣能準確識別攻擊。

(4)測試動態(tài)混淆的有效性

實驗假設攻擊者改良了攻擊的采樣步驟,使得攻擊可以成功繞過SC-Patcher和T-SGX事務區(qū)代碼的檢查(測試時通過在原子事務開始前和結束后添加鉤子代碼以達到繞過的目的)。實驗中增加靜態(tài)混淆的測試作為參照組,即在程序運行過程中保持動態(tài)混淆的偏移表表項內(nèi)容不變。

表2展示了針對不同防御方法保護下的AES程序,利用Prime + Probe攻擊所恢復的密鑰比特位的準確率結果。攻擊者在精準避開事務區(qū)邊界的情況下,可以準確恢復T-SGX保護的程序的密鑰內(nèi)容。該結果直接說明單純基于原子事務的防御策略并不能為程序提供完善的安全防護。在SC-Patcher的測試結果中,攻擊者仍可以從靜態(tài)混淆策略的防護中恢復78.6%密鑰內(nèi)容,防護效果并不是非常理想;而在動態(tài)混淆的防護加持下,由于攻擊者獲取的狀態(tài)信息中包含大量動態(tài)混淆訪問操作,密鑰還原的準確率僅達到7.1%。因此從實驗測試的分析結果可得,SC-Patcher的動態(tài)混淆的修補策略是安全有效的。

表2 還原AES密鑰的準確率Table 2 The accuracy of restoring AES keys

6 性能測試

本節(jié)測試原型系統(tǒng)SC-Patcher的側信道漏洞修補給應用帶來的額外性能開銷。

(1)實驗環(huán)境

所有測試運行在1臺x86架構的工作站上。硬件配置包括:Intel(R) Core(TM) i9-9900K CPU(代號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)測試程序與編譯選項

測試的目標程序為OpenSSL,版本號為 1.1.0f。編譯時均采用-O3等級的優(yōu)化,并使用-lto開啟鏈接時的優(yōu)化選項。

(3)漏洞檢測

使用基于差分的漏洞檢測工具DATA[34]檢測OpenSSL中包含的DES、AES和SHA-1簽名算法進行側信道漏洞,然后通過人工審核篩選出共29個側信道漏洞。

(4)性能測試

SC-Patcher編譯測試程序的源碼,并根據(jù)被提交的漏洞信息對生成的應用自動完成漏洞修補。輸入隨機生成的密鑰,分別對DES、AES和SHA-1簽名算法進行性能測試,重復執(zhí)行每種加密算法10 000次,記錄每次執(zhí)行的平均時間。

表3展示了漏洞修補對加密算法執(zhí)行效率的影響。從上述結果可得,漏洞修補給OpenSSL的3種算法帶來了約3.11%(幾何平均)的性能損耗。Shinde等[8]的工作在人工優(yōu)化后,仍然給程序執(zhí)行帶來幾十倍性能開銷,T-SGX[24]將全部代碼封裝在事務區(qū)中,也帶來了大約50%的性能開銷,而SC-Patcher的自動修補方法帶給程序的性能損耗小于5%,這個結果完全可以接受。因此從性能方面而言,本文漏洞修補方法非常實用。此外,漏洞修補使得編譯后的二進制文件大小增加了0.38%,改變很小。

表3 加密算法的性能損耗Table 3 The performance overhead of encryption

7 結束語

本文提出了一種自動化的通用側信道漏洞修補方法,創(chuàng)新性地結合混淆執(zhí)行和硬件原子事務,在使用噪聲混淆訪存操作隱藏真實訪存地址的同時,采用原子事務避免攻擊者利用細粒度的側信道攻擊繞過混淆保護。安全分析與性能測試的結果表明,修補后的漏洞在不泄露用戶機密數(shù)據(jù)內(nèi)容的同時,帶給程序的額外性能開銷可以幾乎忽略不計,測試結果均優(yōu)于現(xiàn)有的工作。接下來的工作將拓展該方法的實現(xiàn)到ARM或RISC-V平臺,并進一步提高兼容性和通用性。

猜你喜歡
攻擊者事務信道
北京市公共機構節(jié)能宣傳周活動“云”彩紛呈北京市機關事務管理局
基于自適應學習的5G通信系統(tǒng)信道估計方法
基于貝葉斯博弈的防御資源調(diào)配模型研究
信號/數(shù)據(jù)處理數(shù)字信道接收機中同時雙信道選擇與處理方法
典型辦公區(qū)域Wi-Fi性能的優(yōu)化
正面迎接批判
正面迎接批判
針對基于B/S架構軟件系統(tǒng)的性能測試研究
一種Web服務組合一致性驗證方法研究
Hibernate框架持久化應用及原理探析
蛟河市| 鸡泽县| 平谷区| 新闻| 修水县| 巴东县| 清苑县| 延庆县| 钦州市| 威海市| 大同县| 龙南县| 建始县| 云林县| 吉安市| 枞阳县| 盐亭县| 曲麻莱县| 晋州市| 十堰市| 鲁山县| 长春市| 永康市| 峡江县| 海淀区| 孟连| 揭西县| 武平县| 天镇县| 射洪县| 阜新市| 桐乡市| 理塘县| 银川市| 连江县| 延安市| 桦甸市| 桂林市| 理塘县| 平凉市| 灌云县|