王春露,田瑞冬,趙旭,呂勇強(qiáng),汪東升
(1.北京郵電大學(xué)可信分布式計(jì)算與服務(wù)教育部重點(diǎn)實(shí)驗(yàn)室,100876,北京;2.北京信息科技大學(xué)計(jì)算機(jī)學(xué)院,100192,北京;3.清華大學(xué)北京信息科學(xué)與技術(shù)國家研究中心,100084,北京;4.清華大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)系,100084,北京)
傳統(tǒng)高性能處理器通過指令流水線技術(shù)來提高指令執(zhí)行并行度,從而提高處理器性能。但是,程序指令之間會(huì)存在數(shù)據(jù)、控制和資源相關(guān)性,這些相關(guān)性會(huì)造成流水線阻塞[1]。為此,現(xiàn)代高性能處理器采用了多種微架構(gòu)優(yōu)化技術(shù)來降低相關(guān)性對(duì)指令流水線的影響。然而,最新的研究表明,由于當(dāng)前的處理器架構(gòu)始終以性能優(yōu)先作為導(dǎo)向,未對(duì)性能優(yōu)化機(jī)制進(jìn)行周密的安全性分析,導(dǎo)致當(dāng)前處理器系統(tǒng)存在嚴(yán)重的安全漏洞,可能造成計(jì)算機(jī)機(jī)密信息的泄露,危害性極大[2-4]。
分支預(yù)測技術(shù)作為最基本的優(yōu)化技術(shù),廣泛應(yīng)用于Intel、AMD和ARM等主流的商業(yè)處理器中。在分支預(yù)測機(jī)制中,存在一些指令被提前執(zhí)行,但最終被廢棄,無法提交。雖然這些指令的執(zhí)行不會(huì)改變體系結(jié)構(gòu)的狀態(tài),不影響程序的正確執(zhí)行,但這些被廢棄的指令可能會(huì)在微體系結(jié)構(gòu)中留下痕跡,從而產(chǎn)生被攻擊的風(fēng)險(xiǎn),此類漏洞被稱為分支預(yù)測漏洞[5]。Kocher等在2018年發(fā)表的Spectre是利用分支預(yù)測漏洞攻擊的典型代表[2]。自從此后,學(xué)術(shù)界對(duì)Spectre及其變種進(jìn)行了大量研究,先后提出了SpectreRSB[3-4]、BranchScope[6]、NetSpectre[7]和SGXpectre[8-9]等攻擊變種,對(duì)其威脅程度和相關(guān)防御手段也進(jìn)行了充分討論,但目前的研究主要集中在x86架構(gòu)上。與x86架構(gòu)芯片主要服務(wù)于桌面和服務(wù)器市場不同,ARM架構(gòu)芯片主要集中在移動(dòng)端和嵌入式領(lǐng)域,更追求低功耗,分支預(yù)測器的設(shè)計(jì)更為保守。因此,專門針對(duì)ARM架構(gòu)處理器的分支預(yù)測漏洞研究具有重要意義。
本文首先總結(jié)了目前已發(fā)現(xiàn)的分支預(yù)測漏洞,在此基礎(chǔ)上提出了一種適用于所有分支預(yù)測漏洞的攻擊模型。其次,根據(jù)分支預(yù)測漏洞攻擊過程中利用的微體系結(jié)構(gòu)和針對(duì)的地址空間,將分支預(yù)測漏洞分為了9類。通過實(shí)驗(yàn)探究了9種漏洞對(duì)ARM處理器的影響。實(shí)驗(yàn)結(jié)果表明,部分低功耗的ARM處理器完全不受分支預(yù)測漏洞影響。性能較高的ARM處理器只受部分漏洞影響。在防御方面,現(xiàn)有的防御手段只能單獨(dú)防御某一類分支預(yù)測漏洞,想要達(dá)到良好的防御效果需要多種防御方法的組合。除此之外,本文還發(fā)現(xiàn)了一種新的ARM預(yù)測執(zhí)行漏洞——順序預(yù)測漏洞。
當(dāng)指令流在執(zhí)行過程中遇到分支指令時(shí),可能需要等待目的地址被解析之后才能確定下一步需要執(zhí)行的指令。此時(shí)若使流水線停頓,等待目的地址解析完成再恢復(fù)流水線,會(huì)嚴(yán)重影響性能。為了提升性能,處理器會(huì)預(yù)測下一步需要執(zhí)行的指令并提前執(zhí)行[1]。預(yù)測執(zhí)行的結(jié)果不會(huì)被提交而是暫時(shí)保存,當(dāng)目的地址解析完成后,若預(yù)測正確,就提交執(zhí)行結(jié)果。但是,如果預(yù)測不正確,處理器會(huì)丟棄預(yù)測指令的結(jié)果并使流水線恢復(fù)到預(yù)測執(zhí)行前的狀態(tài)。
現(xiàn)代處理器中設(shè)置了專門負(fù)責(zé)分支預(yù)測的微體系結(jié)構(gòu)——分支預(yù)測器[10],分支預(yù)測器通過記錄分支指令的歷史執(zhí)行信息,對(duì)分支指令的跳轉(zhuǎn)方向和跳轉(zhuǎn)地址進(jìn)行預(yù)測。分支預(yù)測器如圖1所示?,F(xiàn)代分支預(yù)測器通常由一個(gè)二級(jí)自適應(yīng)分支預(yù)測組件[11]和一個(gè)目標(biāo)分支地址緩存區(qū)[12](BTB)組成。全局歷史記錄寄存器(GHR)記錄了分支指令的歷史跳轉(zhuǎn)信息。每個(gè)GHR的數(shù)據(jù)可以和歷史模式表(PHT)的一個(gè)條目相關(guān)聯(lián),PHT根據(jù)GHR的數(shù)據(jù)做出是否跳轉(zhuǎn)的判斷。BTB記錄了分支指令的地址和跳轉(zhuǎn)地址的映射。如果PHT預(yù)測將跳轉(zhuǎn),則從BTB中根據(jù)分支指令的地址查找跳轉(zhuǎn)地址。
圖1 分支預(yù)測器
現(xiàn)代處理器中通常使用返回堆棧緩沖區(qū)(RSB)來預(yù)測函數(shù)返回地址[4]。RSB是一種特殊微體系結(jié)構(gòu),如圖2所示。在函數(shù)調(diào)用時(shí)(ARM中是BL指令),將跳轉(zhuǎn)指令的下一條指令的地址作為預(yù)測地址儲(chǔ)存在RSB。函數(shù)返回時(shí)(ARM中是RET指令),如果出現(xiàn)流水線阻塞,則將棧頂元素作為預(yù)測地址放入程序計(jì)數(shù)器。
圖2 返回堆棧緩沖區(qū)
現(xiàn)代分支預(yù)測器的正確率很高,但仍無法保證100%的正確預(yù)測。當(dāng)分支預(yù)測器預(yù)測失敗時(shí),為了保證最終結(jié)果的正確性,處理器會(huì)放棄分支預(yù)測指令的執(zhí)行結(jié)果,使用者在體系結(jié)構(gòu)層面無法感知到分支預(yù)測指令的執(zhí)行。但是,分支預(yù)測指令可能仍會(huì)在微體系結(jié)構(gòu)狀態(tài)中留下痕跡,從而使得攻擊者可以利用這些痕跡恢復(fù)分支預(yù)測指令的執(zhí)行結(jié)果。這種設(shè)計(jì)上的漏洞導(dǎo)致了被攻擊的可能。
分支預(yù)測漏洞攻擊模型如圖3所示,總結(jié)為6個(gè)步驟。
虛線表示此步驟是在預(yù)測執(zhí)行時(shí)完成;實(shí)線表示此步驟是在正常的流水線執(zhí)行時(shí)完成。
步驟1 毒化分支預(yù)測器。根據(jù)分支預(yù)測器的運(yùn)行原理可知,分支預(yù)測器各部件儲(chǔ)存的歷史信息會(huì)隨著程序的執(zhí)行而變化。攻擊者可以設(shè)計(jì)特殊的程序以修改分支預(yù)測器中的內(nèi)容,從而控制分支預(yù)測的預(yù)測結(jié)果。這一惡意訓(xùn)練的過程被稱為毒化。
步驟2 主動(dòng)觸發(fā)分支預(yù)測。在處理器需要讀取數(shù)據(jù)時(shí),首先會(huì)從高速緩存中讀取,如果高速緩存中沒有處理器需要的數(shù)據(jù),處理器再從內(nèi)存中尋找數(shù)據(jù)[13]。但是,從內(nèi)存中讀取數(shù)據(jù)要花費(fèi)很多時(shí)鐘周期,處理器不會(huì)停頓流水線等待數(shù)據(jù)讀取完成,而是使用預(yù)測機(jī)制來繼續(xù)執(zhí)行。因此,可以通過將程序所需數(shù)據(jù)從高速緩存中驅(qū)逐來主動(dòng)觸發(fā)預(yù)測執(zhí)行。
步驟3 執(zhí)行攻擊代碼。觸發(fā)分支預(yù)測后,處理器將分支預(yù)測器的預(yù)測結(jié)果放入程序計(jì)數(shù)器,但被毒化的分支預(yù)測器的預(yù)測結(jié)果是由攻擊者控制,攻擊者將預(yù)測結(jié)果指向特定的攻擊代碼。
步驟4 訪問機(jī)密數(shù)據(jù)。分支預(yù)測的指令執(zhí)行過程中不會(huì)進(jìn)行權(quán)限檢查,攻擊代碼可以直接訪問那些受權(quán)限保護(hù)的地址。
步驟5 提取機(jī)密數(shù)據(jù)到高速緩存。通過執(zhí)行攻擊代碼將機(jī)密數(shù)據(jù)提取到高速緩存。當(dāng)分支預(yù)測失敗時(shí),雖然處理器會(huì)丟棄分支預(yù)測指令執(zhí)行的結(jié)果,但是攻擊代碼的執(zhí)行結(jié)果仍然在高速緩存中。
步驟6 復(fù)原機(jī)密數(shù)據(jù)。攻擊者通常采用緩存?zhèn)刃诺赖姆绞絹慝@取分支預(yù)測在高速緩存中留存的信息[14-15]。緩存?zhèn)刃诺览酶咚倬彺娴亩嗉?jí)存儲(chǔ)結(jié)構(gòu)造成的數(shù)據(jù)訪問延遲來推測高速緩存中的數(shù)據(jù)。常見的緩存?zhèn)刃诺拦粲蠪lush+Reload[16]、Evict+Reload[17]和Prime+Probe[18]等。
目前,曝光的分支預(yù)測漏洞攻擊主要通過利用PHT、BTB和RSB這3個(gè)不同的分支預(yù)測組件[2,4,6]實(shí)現(xiàn)。
2.1.1 利用PHT實(shí)現(xiàn)分支預(yù)測攻擊 圖4是利用PHT的分支預(yù)測漏洞攻擊代碼。用合法的x(x 圖4 利用PHT的分支預(yù)測漏洞攻擊代碼 2.1.2 利用BTB實(shí)現(xiàn)分支預(yù)測攻擊 圖5是利用BTB的分支預(yù)測漏洞攻擊代碼。執(zhí)行func函數(shù)會(huì)跳轉(zhuǎn)到funcA函數(shù)執(zhí)行。重復(fù)執(zhí)行一定次數(shù)后,BTB會(huì)建立func函數(shù)的虛擬地址A到funcA函數(shù)的虛擬地址B的映射。在受害者進(jìn)程中,gadget函數(shù)和funcA函數(shù)的虛擬地址相同,兩個(gè)進(jìn)程中的func函數(shù)地址也相同。受害者進(jìn)程執(zhí)行func函數(shù)時(shí)本應(yīng)跳轉(zhuǎn)到funcB函數(shù)。但是,如果發(fā)生了流水線阻塞,分支預(yù)測器則會(huì)用func函數(shù)的虛擬地址A在BTB中索引到虛擬地址B,并將B作為分支預(yù)測的結(jié)果放入程序計(jì)數(shù)器,B地址指向gadget函數(shù)而不是funcB函數(shù)。 圖5 利用BTB的分支預(yù)測漏洞攻擊代碼 2.1.3 利用RSB實(shí)現(xiàn)分支預(yù)測攻擊 圖6是利用RSB的分支預(yù)測漏洞攻擊代碼。攻擊者進(jìn)程中第6行代碼的虛擬地址和受害者進(jìn)程中g(shù)adget函數(shù)的虛擬地址相同,都為A。在攻擊者進(jìn)程中執(zhí)行funcA函數(shù)時(shí),RSB會(huì)將跳轉(zhuǎn)指令的下一條指令的地址A入棧。在執(zhí)行funcA函數(shù)時(shí),sched函數(shù)觸發(fā)進(jìn)程切換,指令流跳轉(zhuǎn)到受害者進(jìn)程的sched函數(shù)開始執(zhí)行。在受害者進(jìn)程中,如果在return執(zhí)行時(shí)發(fā)生了流水線阻塞,RSB會(huì)將之前攻擊者進(jìn)程填充的A作為分支預(yù)測的結(jié)果放入程序計(jì)數(shù)器,此時(shí)虛擬地址A指向gadget函數(shù)。 圖6 利用RSB的分支預(yù)測漏洞攻擊代碼 以上3種分支預(yù)測漏洞攻擊方法都可以針對(duì)同進(jìn)程地址空間和內(nèi)核地址空間開展攻擊,除此之外,還可以針對(duì)跨進(jìn)程地址空間。這是因?yàn)椴煌倪M(jìn)程可以擁有相同的虛擬地址,并且由于分支預(yù)測器是根據(jù)指令的虛擬地址來進(jìn)行預(yù)測的,所以當(dāng)攻擊者進(jìn)程惡意訓(xùn)練分支預(yù)測器時(shí),也可以對(duì)其他進(jìn)程的分支預(yù)測結(jié)果造成影響[10]。根據(jù)分支預(yù)測漏洞攻擊利用的微體系結(jié)構(gòu)和針對(duì)的目的地址的不同,將分支預(yù)測漏洞攻擊分成了9類,如圖7所示。 圖7 分支預(yù)測漏洞攻擊分類 依據(jù)圖7所示的分類,本文分別為9種分支預(yù)測漏洞攻擊方法編寫了可運(yùn)行在ARMv8架構(gòu)上的攻擊代碼。選擇了3種主流的ARMv8架構(gòu)處理器作為實(shí)驗(yàn)平臺(tái):處理器A是一款常用的ARM低功耗處理器,其性能也較低;處理器B是一款高性能ARM處理器;處理器C是最新的高性能ARM處理器。代碼運(yùn)行環(huán)境為linux-4.15。評(píng)判攻擊是否成功的標(biāo)準(zhǔn)是攻擊者能否獲得受害者存儲(chǔ)在不同地址空間中的數(shù)據(jù)。 文獻(xiàn)[19]的研究已經(jīng)表明,9種攻擊方法在主流的x86架構(gòu)都可以攻擊成功。但是,本文研究發(fā)現(xiàn),這9種攻擊方法在ARM處理器上有不同的表現(xiàn)。處理器A不受任何分支預(yù)測漏洞攻擊的影響,因?yàn)檫@款處理器屬于低功耗處理器,會(huì)適當(dāng)減少復(fù)雜寄存器的使用,所以分支預(yù)測的功能有限。處理器B的測試結(jié)果如表1所示。可以看出,由于處理器B性能較高,其分支預(yù)測功能更加完善,更容易受到分支預(yù)測漏洞的影響,但仍有3種攻擊無法在處理器B上起作用,原因可能是ARM處理器在進(jìn)程切換和用戶-內(nèi)核態(tài)切換時(shí)會(huì)對(duì)分支預(yù)測器的內(nèi)容做出調(diào)整。處理器C的測試結(jié)果如表2所示。可以看出,除了在處理器B無法攻擊成功的3種方法外,利用BTB針對(duì)跨進(jìn)程空間的攻擊也無法成功,原因是這款處理器已經(jīng)兼顧了安全性設(shè)計(jì),集成了硬件防御措施。 表1 處理器B分支預(yù)測漏洞測評(píng)結(jié)果 表2 處理器C分支預(yù)測漏洞測評(píng)結(jié)果 目前,ARM處理器上的防御手段主要有指令屏障、無效緩沖區(qū)和內(nèi)核頁表隔離KPTI,本小節(jié)對(duì)這3種防御手段進(jìn)行分析和測評(píng)。 3.1.1 指令屏障 分支預(yù)測漏洞最簡單的防御方法就是在處理器讀取機(jī)密信息時(shí)禁止分支預(yù)測??梢酝ㄟ^指令屏障來實(shí)現(xiàn)這一功能。指令屏障強(qiáng)制指令屏障之后的指令等待其之前的指令執(zhí)行完畢再執(zhí)行。在ARMv8架構(gòu)中,可以使用DSB SY+ISB的指令組合和CSDB[20]來實(shí)現(xiàn)指令屏障。用戶可以在重要的數(shù)據(jù)操作前插入指令屏障來防止分支預(yù)測指令對(duì)這些數(shù)據(jù)的訪問。 3.1.2 無效微體系結(jié)構(gòu)緩沖區(qū) 除指令屏障外,另一種可行的防御方法是破壞分支預(yù)測漏洞攻擊中的毒化過程。通過消除攻擊者對(duì)分支預(yù)測相關(guān)微體系結(jié)構(gòu)的影響,避免分支預(yù)測器引導(dǎo)處理器執(zhí)行攻擊者準(zhǔn)備的攻擊代碼,從而起到防御的作用。這種無效微體系結(jié)構(gòu)的方法通常都插入在進(jìn)程切換和內(nèi)核-用戶態(tài)切換的過程中。用戶可以通過linux cmdline中的nospectre_v2參數(shù)使操作系統(tǒng)在進(jìn)程切換時(shí)刷新微體系結(jié)構(gòu)緩沖區(qū)。 3.1.3 內(nèi)核頁表隔離 內(nèi)核頁表隔離[21]是一種Linux內(nèi)核功能,將用戶空間頁表和內(nèi)核空間頁表完全分開,在用戶模式下使用的頁表包含用戶空間的副本和部分的內(nèi)核空間,用戶程序在執(zhí)行時(shí)無法直接訪問內(nèi)核數(shù)據(jù),但對(duì)于目標(biāo)為竊取另一個(gè)進(jìn)程用戶空間數(shù)據(jù)的分支預(yù)測攻擊,KPTI沒有效果。用戶可以通過linux cmdline中的kpti參數(shù)來開啟/關(guān)閉KPTI。 針對(duì)本文中幾種成功的攻擊方式,在處理器B和處理器C上進(jìn)行了防御措施的有效性測評(píng)。判斷防御措施是否有效的依據(jù)是開啟防御措施后攻擊者能否獲得受害者存儲(chǔ)在不同地址空間中的數(shù)據(jù),若無法得到預(yù)期的數(shù)據(jù),則判斷防御措施生效。本文實(shí)施防御措施的方法是:在受害者進(jìn)程訪問機(jī)密數(shù)據(jù)的代碼段前插入指令屏障,并通過nospectre_v2和kpti兩個(gè)cmdline參數(shù)開啟無效緩沖區(qū)功能和KPTI,結(jié)果如表3和表4所示。 從表3和表4可以看出,指令屏障可以防御所有的分支預(yù)測攻擊,但這需要事先對(duì)運(yùn)行程序進(jìn)行代碼分析,實(shí)現(xiàn)難度較大。在實(shí)際的應(yīng)用中,往往只在內(nèi)核代碼插入指令屏障。無效緩沖區(qū)一般在用戶-內(nèi)核態(tài)切換和進(jìn)程切換時(shí)執(zhí)行,因此只能防御針對(duì)內(nèi)核空間和跨進(jìn)程空間的攻擊。KPTI只隔離了內(nèi)核空間,因此只對(duì)針對(duì)內(nèi)核空間的攻擊有效。 表3 處理器B防御措施有效性測評(píng) 表4 處理器C防御措施有效性測評(píng) 從本小節(jié)可知,3種防御方法都無法獨(dú)自防御所有的分支預(yù)測漏洞攻擊。因此,為了實(shí)現(xiàn)有效防御,通常結(jié)合多種防御措施來搭建有效的防御體系。當(dāng)3種防御方法全部打開時(shí),3種ARM處理器都能夠有效防御針對(duì)分支預(yù)測漏洞的攻擊。 ARM處理器在執(zhí)行RET指令時(shí),會(huì)觸發(fā)一種ARM處理器獨(dú)有的預(yù)測執(zhí)行——順序預(yù)測。順序預(yù)測同樣有可能造成處理器數(shù)據(jù)泄露。 在ARM體系結(jié)構(gòu)中,當(dāng)指令流水線執(zhí)行到RET指令時(shí),如果函數(shù)返回地址不在高速緩存中,處理器就需要花費(fèi)較長的時(shí)間從內(nèi)存中提取數(shù)據(jù),這會(huì)造成處理器流水線阻塞。此時(shí),ARM處理器的順序預(yù)測就會(huì)被觸發(fā),處理器會(huì)使用RET指令緊鄰的下一條指令來預(yù)測執(zhí)行。當(dāng)處理器發(fā)現(xiàn)預(yù)測錯(cuò)誤時(shí),會(huì)回滾處理器中各個(gè)寄存器的狀態(tài),保證計(jì)算機(jī)結(jié)果的正確性,與分支預(yù)測相同,順序預(yù)測同樣會(huì)在處理器高速緩存中留下可觀察的痕跡。 順序預(yù)測原理如圖8所示。函數(shù)F1在RET指令返回時(shí),按照順序預(yù)測的執(zhí)行路徑,會(huì)直接執(zhí)行函數(shù)F2的指令,而不是跳轉(zhuǎn)到函數(shù)main繼續(xù)執(zhí)行。 圖8 順序預(yù)測原理 順序預(yù)測和RSB都依靠RET指令來作為觸發(fā)指令,不同的是RSB依靠微體系結(jié)構(gòu)緩沖區(qū)來決定預(yù)測執(zhí)行的下一條指令,但目前還未發(fā)現(xiàn)順序預(yù)測需要借助任何寄存器或緩沖區(qū)。 本文尚未在x86架構(gòu)中發(fā)現(xiàn)順序預(yù)測。這是由于x86注重于高性能,而ARM更追求低功耗。兩者在預(yù)測執(zhí)行上的設(shè)計(jì)會(huì)有不同。實(shí)際應(yīng)用中,順序預(yù)測大部分情況下都是失敗的,本文猜測順序預(yù)測是32位ARM架構(gòu)遺留下來的機(jī)制,但由于ARM沒有公開這方面的具體信息,很難考證。之后會(huì)進(jìn)行進(jìn)一步研究。 依據(jù)順序預(yù)測的原理,本文實(shí)現(xiàn)了利用順序預(yù)測的攻擊方法。由于順序預(yù)測的預(yù)測方向是固定的,攻擊者無需毒化特定的微體系結(jié)構(gòu)組件,其攻擊方法比分支預(yù)測漏洞更加簡單。總體而言,順序預(yù)測攻擊仍然符合本文提出的攻擊模型。 本文編寫的攻擊代碼如圖9所示。順序預(yù)測會(huì)執(zhí)行RET指令緊鄰的下一條指令,因此順序預(yù)測的預(yù)測方向是固定的,只需設(shè)計(jì)特殊的代碼布局,在RET指令之后插入本文的攻擊代碼。當(dāng)speculation函數(shù)返回時(shí),可以利用flush函數(shù)將函數(shù)返回地址從高速緩存中驅(qū)逐,觸發(fā)預(yù)測執(zhí)行,處理器會(huì)在接下來的預(yù)測執(zhí)行中執(zhí)行g(shù)adget函數(shù)。當(dāng)程序執(zhí)行完成后,處理器發(fā)現(xiàn)預(yù)測錯(cuò)誤并回滾,但還是在高速緩存中留下了執(zhí)行g(shù)adget函數(shù)的相關(guān)信息,本文就可以通過Flush+Reload將高速緩存中的信息取出,成功獲取機(jī)密信息。 圖9 順序預(yù)測漏洞攻擊代碼示例 本文在處理器C上運(yùn)行了漏洞利用代碼,結(jié)果表明利用順序預(yù)測的攻擊可以成功泄露同一進(jìn)程的用戶空間的任意數(shù)據(jù),但是由于順序預(yù)測不借助任何中間微體系結(jié)構(gòu),因此順序預(yù)測無法對(duì)跨進(jìn)程空間產(chǎn)生影響。另一方面,由于順序預(yù)測的預(yù)測執(zhí)行窗口不夠大,順序預(yù)測攻擊無法泄露內(nèi)核空間的數(shù)據(jù)。多數(shù)情況下RET指令仍然是按照RSB提供的函數(shù)返回地址來預(yù)測執(zhí)行。 由于順序預(yù)測不借助任何中間緩沖區(qū),因此常用的無效緩沖區(qū)的方法無法防止利用順序預(yù)測的攻擊。KPTI只能防止針對(duì)內(nèi)核地址空間的攻擊,但目前本文尚未成功利用順序預(yù)測漏洞攻擊內(nèi)核地址。利用指令屏障可以有效防止這類攻擊,可以在每次RET指令之后插入指令屏障來防止利用順序預(yù)測漏洞的攻擊,并可以將此功能集成到編譯器當(dāng)中,但對(duì)性能有較大影響。 本文對(duì)分支預(yù)測漏洞進(jìn)行了深入研究,總結(jié)了分支預(yù)測漏洞的攻擊模型,并提出了一種新的分類方法。系統(tǒng)性地研究了目前已經(jīng)曝光的分支預(yù)測漏洞攻擊在ARM上的危害程度,并評(píng)估了目前ARM處理器上的防御措施的有效性。在ARM處理器上,發(fā)現(xiàn)了一種新的預(yù)測執(zhí)行漏洞——順序預(yù)測漏洞。本文得出的結(jié)論如下。 (1)現(xiàn)有的分支預(yù)測漏洞攻擊方法在ARM處理器上的表現(xiàn)與x86不同,一些攻擊方法無法對(duì)ARM處理器造成影響。 (2)在ARM處理器上,沒有一種防御方法可以防御所有的分支預(yù)測漏洞,需要多種方法的組合才能完全防御分支預(yù)測漏洞攻擊。 (3)由于架構(gòu)的不同,ARM處理器上存在其特有的預(yù)測執(zhí)行漏洞,有必要專門針對(duì)ARM處理器進(jìn)行研究。2.2 ARM處理器分支預(yù)測漏洞測評(píng)結(jié)果
3 防御方法分析和測評(píng)
3.1 主要防御方法
3.2 測評(píng)結(jié)果
4 新型ARM處理器預(yù)測執(zhí)行漏洞
4.1 順序預(yù)測漏洞原理
4.2 順序預(yù)測漏洞攻擊方法
4.3 順序預(yù)測漏洞防御方法分析
5 結(jié) 論