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

?

瞬態(tài)執(zhí)行漏洞攻擊及防御綜述①

2020-09-18 07:42:58李沛南趙路坦張立新
高技術(shù)通訊 2020年8期
關(guān)鍵詞:敏感數(shù)據(jù)變種體系結(jié)構(gòu)

李 曄 李沛南 趙路坦 侯 銳 張立新 孟 丹

(*中國科學(xué)院計算技術(shù)研究所 北京 100190) (**中國科學(xué)院信息工程研究所 北京 100093) (***中國科學(xué)院大學(xué) 北京 100049)

0 引 言

2018年初,谷歌公布了幽靈漏洞[1]與熔斷漏洞[2],揭示了當(dāng)前主流的高性能處理器架構(gòu)中存在著泄露敏感數(shù)據(jù)的安全風(fēng)險。這2種漏洞的揭露像是打開了潘多拉魔盒,一系列變種接踵而至,層出不窮[3-5]。這些變種利用的根本原理是處理器中的亂序執(zhí)行及推測執(zhí)行。這2種技術(shù)可顯著地提升性能,被作為最基本的優(yōu)化技術(shù),廣泛應(yīng)用于主流的商業(yè)處理器中。個人終端以及云端處理器的內(nèi)核[2]或其他進(jìn)程[2]的數(shù)據(jù)、狀態(tài)寄存器[6],運行在SGX中的私密數(shù)據(jù)[3],系統(tǒng)管理模式SMM以及虛擬機(jī)管理器VMM[7]中的敏感信息都暴露給攻擊者。幽靈和熔斷漏洞在學(xué)術(shù)界與工業(yè)界引起了巨大的震動,微體系架構(gòu)設(shè)計廠商Intel、AMD以及ARM陷入恐慌,云端至終端的運營商和使用者也都惶恐不安。各大公司研究者們積極并迅速地提出各種防御機(jī)制,避免由于此類漏洞引起重大信息泄露,以求平穩(wěn)地度過安全危機(jī)。

在推測執(zhí)行與亂序執(zhí)行機(jī)制中,存在一些指令被提前推測執(zhí)行,但最終卻被廢棄、無法提交,這些指令被統(tǒng)稱為瞬態(tài)指令。雖然瞬態(tài)指令的執(zhí)行指令不會影響體系結(jié)構(gòu)的狀態(tài),不改變程序的運行結(jié)果,但其在微體系結(jié)構(gòu)上遺留的信息可能隱含敏感信息,繼而被攻擊者挖掘。故此類漏洞被稱為瞬態(tài)執(zhí)行漏洞或推測執(zhí)行側(cè)信道[8]。深究瞬態(tài)執(zhí)行漏洞產(chǎn)生的根源,是傳統(tǒng)的體系結(jié)構(gòu)均以性能優(yōu)先作為設(shè)計導(dǎo)向,對于各種性能優(yōu)化技術(shù)的安全性并沒有做深入、詳實的分析。

本文從幽靈漏洞與熔斷漏洞及相關(guān)變種入手,研究已知的瞬態(tài)執(zhí)行漏洞的軟硬件防御方案,剖析現(xiàn)有高性能處理器中面臨的安全隱患,討論引入安全性因素后,處理器體系結(jié)構(gòu)的發(fā)展方向,并提出相應(yīng)的策略與建議。

1 瞬態(tài)執(zhí)行漏洞

Spectre變種1(bounds check bypass,BCB)[1]屬于攻擊者利用條件分支是否跳轉(zhuǎn)會被錯誤推測的特性。通過執(zhí)行特定的程序流,惡意訓(xùn)練分支預(yù)測器的執(zhí)行,從而確保在受害者程序執(zhí)行時,依據(jù)跳轉(zhuǎn)歷史信息,分支預(yù)測器將推斷此次分支跳至本不該執(zhí)行的分支。如表1所示,x為訪問數(shù)組的索引,第1行為常見的邊界檢查操作,第2行為x合法時,對數(shù)組的訪問。

表1 變種1攻擊示例

若此段代碼中,數(shù)組array1后的空間存儲敏感信息,攻擊者便可以通過訓(xùn)練分支預(yù)測器,使得在x越界時,仍然推測執(zhí)行第2行代碼,從而訪問到array1索引后的敏感數(shù)據(jù)。由于此信息屬于敏感區(qū)域,對攻擊者不可見,為此,通過將此信息作為間接索引,訪問攻擊者可見區(qū)域array2。推測執(zhí)行的指令不會改變體系結(jié)構(gòu)的狀態(tài),但考慮到實現(xiàn)復(fù)雜度,微體系結(jié)構(gòu)中發(fā)生的改變并不會被抹去。如果推測執(zhí)行讀取了新的緩存行(cache line),在發(fā)現(xiàn)推測錯誤后,該狀態(tài)不會被消除,再次訪問時將會因為命中而僅有較短的訪問時間。因此,攻擊者可以通過檢測對共享區(qū)域訪問時間的變化推出由array1訪問到的敏感數(shù)據(jù)。

Spectre變種2(branch target injection,BTI)[1]在體系結(jié)構(gòu)中,分支預(yù)測器不僅推測是否跳轉(zhuǎn),對于間接跳轉(zhuǎn)及函數(shù)調(diào)用指令,還會預(yù)測跳轉(zhuǎn)方向。變種2中,攻擊者通過惡意訓(xùn)練分支預(yù)測器,使得受害者程序在執(zhí)行時,依據(jù)分支目標(biāo)緩沖器(branch target buffer,BTB),跳轉(zhuǎn)至特定的程序段,例如代碼1中的第2行。與變種1相同,在推測執(zhí)行中遺留的對于微體系結(jié)構(gòu)的影響會被攻擊者觀測到,從而推出敏感信息。

Meltdown變種3(rogue data cache load,RDCL)[2]在頁表項中有特定的標(biāo)識位來區(qū)分頁面的訪問權(quán)限,包括用戶權(quán)限或內(nèi)核權(quán)限。操作系統(tǒng)默認(rèn)硬件可以保證用戶與內(nèi)核的訪問是隔離的,為降低系統(tǒng)調(diào)用的開銷,內(nèi)核的空間都被映射到每個用戶進(jìn)程的虛擬地址空間。在程序執(zhí)行時,由頁表緩存(translation lookaside buffer,TLB)進(jìn)行虛擬地址到物理地址的轉(zhuǎn)換。若硬件監(jiān)測到運行狀態(tài)不滿足頁面訪問權(quán)限,將產(chǎn)生例外,并告知操作系統(tǒng)。在Intel處理器中,頁表訪問權(quán)限標(biāo)識的檢查是在指令提交階段完成。因此,攻擊者在程序中惡意訪問內(nèi)核數(shù)據(jù),在指令提交之前,后續(xù)的指令可以使用獲取的數(shù)據(jù)影響攻擊程序空間的狀態(tài),繼而被攻擊者感知并獲取到內(nèi)核數(shù)據(jù)。

Spectre-NG變種1.1(bounds check bypass store,BCBS)[4]變種1中攻擊者通過分析推測執(zhí)行中讀操作對于微體系結(jié)構(gòu)的改變獲取敏感數(shù)據(jù)。而變種1.1主要利用推測執(zhí)行時寫操作的影響。例如示例代碼2表2所示,若c[y]指向存儲函數(shù)返回地址的區(qū)域,z為惡意代碼片段的入口,第2行代碼運行過程中若執(zhí)行返回指令,推測時寫操作的值將被前遞,從而將正常的執(zhí)行流轉(zhuǎn)向惡意代碼,從而將敏感信息泄露。

表2 變種1.1攻擊示例

Spectre-NG變種1.2(read-only protection bypass,RPB)[4]在執(zhí)行訪存操作時,TLB會檢查頁表項的讀寫權(quán)限標(biāo)識位,從而確定對當(dāng)前頁面的操作是否合法。在Intel處理器中,對權(quán)限檢查是在指令提交階段判斷。因此,攻擊者在對某段只讀空間進(jìn)行寫操作后,如與控制流相關(guān)的代碼指針等,在等待提交的時間窗口內(nèi),被修改的數(shù)據(jù)會被后續(xù)指令使用,跳轉(zhuǎn)至惡意代碼片段,從而泄露信息。

Spectre-NG變種3a(rogue system register read,RSRR)[6]用戶態(tài)的程序在讀取僅內(nèi)核態(tài)可訪問的寄存器時,會產(chǎn)生異常。但與變種3類似,該異常在ARM及Intel的處理器中是在指令提交階段處理,在等待異常被處理前的窗口內(nèi),攻擊者有機(jī)會將敏感數(shù)據(jù)竊取。

Spectre-NG變種4(speculative store bypass,SSB)[9]處理器采用讀寫隊列(load store queue)統(tǒng)一處理向存儲結(jié)構(gòu)發(fā)起的訪存請求,既要保證訪存一致性,同時為了達(dá)到足夠高的性能,還支持訪存推測機(jī)制。在某訪存指令地址未被解析時,訪存推測機(jī)制推測后續(xù)的訪存指令與該指令間是否存在一致性要求。若推測后續(xù)訪存不依賴于之前的指令,則可以先執(zhí)行。在后續(xù)若發(fā)現(xiàn)存在一致性要求,則會置推測執(zhí)行的訪存數(shù)據(jù)無效。與分支推測相同,這種推測機(jī)制對體系結(jié)構(gòu)無影響,但在微體系結(jié)構(gòu)殘留的敏感信息可能被攻擊者獲取。在表3中,array1[x]原本存儲敏感數(shù)據(jù),a[x-5]也指向array1[x],第2行將敏感數(shù)據(jù)覆蓋為非敏感數(shù)據(jù)。但這段代碼的執(zhí)行存在這種執(zhí)行場景:a[x-5]的地址計算較長,但第3行的計算速度較快,第3行超前于第2行執(zhí)行。即第3行本應(yīng)該訪問非敏感數(shù)據(jù),但此時由于超前執(zhí)行,將敏感數(shù)據(jù)暴露給攻擊者。

表3 變種4攻擊示例

Foreshadow變種5(L1 terminal fault,L1TF)[7,10]頁表項中的Present標(biāo)識位被置位0或保留位被標(biāo)識為1時,經(jīng)TLB頁表轉(zhuǎn)換后的物理地址無效,會產(chǎn)生例外。但同樣由于例外處理的時機(jī)較晚,仍然存在推測執(zhí)行的時間窗口。當(dāng)該地址所指向的敏感數(shù)據(jù)仍然在一級緩存時,便可能被讀取并被后續(xù)指令使用,從而導(dǎo)致信息泄露。采用這種方法,攻擊者成功地從SGX、操作系統(tǒng)、SMM以及VMM中竊取私密數(shù)據(jù)。

Spectre-NG SpectreRSB[11,12]返回指令的跳轉(zhuǎn)目標(biāo)由RSB(return stack buffer)來預(yù)測。在RSB中存儲的地址與實際軟件棧中的地址不同時就會引起錯誤推測。有多種方法可以導(dǎo)致返回地址錯誤推測,包括直接或推測地對返回地址進(jìn)行重寫、上下文切換時共享上一敏感進(jìn)程的返回地址信息、在RSB為空時返回指令采用BTB的信息來推測跳轉(zhuǎn)目標(biāo)(Intel)。通過改變返回指令的預(yù)測方向,可以執(zhí)行惡意代碼片段,如表1的第2行,將敏感數(shù)據(jù)泄漏給攻擊者。

Spectre-NG LazyFP[13]在上下文切換時,由于FPU及SIMD寄存器保存起來較為耗時,因此,處理器將保存操作延后處理,在此之前會將FPU及SIMD單元設(shè)置為不可用,當(dāng)后續(xù)指令訪問相關(guān)寄存器時將產(chǎn)生例外。但后續(xù)推測執(zhí)行的指令依然有可能泄露敏感數(shù)據(jù)。

SgxPectre[3]為增強(qiáng)原處理器架構(gòu)的安全性,Intel提出SGX(Intel software guard extentions)。通過增加一組指令,將程序劃分為可信部分與非可信部分,并為程序的可信部分創(chuàng)建獨立的執(zhí)行環(huán)境,稱為enclave,防止不可信部分對于可信區(qū)域敏感信息的竊取。而SgxPectre[3]通過利用Intel處理器中,enclave與不可信區(qū)域仍然共享RSB與BTB;而且,采用SpectreRSB[11]的攻擊方法,在進(jìn)入enclave前,惡意訓(xùn)練BTB并強(qiáng)制排空RSB內(nèi)容,使得進(jìn)入enclave后,第1條返回指令跳轉(zhuǎn)至惡意代碼片段,將enclave內(nèi)部的數(shù)據(jù)暴露給攻擊者。

SpectrePrime/MeltdownPrime[14]多核處理器中也需要維護(hù)緩存一致性,因此一個核中對于緩存的操作可能會影響到其他核中緩存的狀態(tài)。SpectrePrime/MeltdownPrime即利用了在推測執(zhí)行寫操作時,會將其他核中同地址的緩存行置位無效。此時,攻擊者再訪問該核中對應(yīng)的數(shù)據(jù),則會由于緩存失效而有較長的訪問延遲。與變種1中分析敏感數(shù)據(jù)的原理相同,攻擊者也可以從此類變化中獲取敏感數(shù)據(jù)。

NetSpectre[5]采用推測執(zhí)行漏洞,除了可以竊取本地計算機(jī)數(shù)據(jù),NetSpectre通過監(jiān)測遠(yuǎn)端計算機(jī)的緩存狀態(tài)或者計算單元,均成功地獲取到敏感數(shù)據(jù)。

SPOILER[15]在訪存推測錯誤情況下會引起較大的性能代價,實驗發(fā)現(xiàn)Intel處理器中低20位地址相同時便推測執(zhí)行。利用此機(jī)制,可以反推虛擬地址與物理地址的映射關(guān)系,發(fā)起Rowhammer類型的攻擊。

ZombieLoad[16]Intel處理器中存在多種縮短訪存延遲的前遞機(jī)制(forwarding mechanism),例如,將寫緩沖區(qū)(store buffer)、填寫緩沖區(qū)(fill buffer)和讀端口(load ports)中的有效數(shù)據(jù)及時地賦值給讀操作。但在具體的實現(xiàn)中,Intel認(rèn)為已經(jīng)提交卻仍然存在于緩沖區(qū)或端口中的數(shù)據(jù)依舊有效。在后續(xù)執(zhí)行過程中若發(fā)現(xiàn)數(shù)據(jù)失效,則刷新流水線重新執(zhí)行,從而保證程序的正確性。但這種機(jī)制可能會將本不該前遞的敏感數(shù)據(jù)傳給攻擊者,并改變微體系結(jié)構(gòu),導(dǎo)致信息泄露。

2 處理器漏洞

在傳統(tǒng)的高性能體系結(jié)構(gòu)中,首要的設(shè)計目標(biāo)是提升性能,即每個時鐘周期內(nèi)所執(zhí)行的指令數(shù)。然而,由于程序本身存在控制依賴及數(shù)據(jù)依賴,在執(zhí)行過程中還存在資源依賴,這些依賴關(guān)系將使得流水線堵塞,降低指令及數(shù)據(jù)并行處理的能力。為此,微體系結(jié)構(gòu)設(shè)計者采用多種技術(shù)來消除這些依賴帶來的性能損失,以提升指令級并行處理能力、數(shù)據(jù)級處理能力以及線程級處理能力[17]。而幽靈漏洞、熔斷漏洞及相關(guān)變種的產(chǎn)生,恰恰是利用了2種基本的性能優(yōu)化方式,即亂序執(zhí)行和推測執(zhí)行。

2.1 亂序執(zhí)行

現(xiàn)有體系結(jié)構(gòu)有3種成熟的性能優(yōu)化方法用來提升單時鐘周期內(nèi)指令的并行處理能力。采用多級流水線技術(shù)在同一時鐘周期執(zhí)行多條指令,即并行處理不同階段的指令,在時間上實現(xiàn)指令集并行;通過多發(fā)射技術(shù),減少資源依賴造成的流水線堵塞,在空間上提升指令并行處理能力;通過采用動態(tài)流水線技術(shù),采用重命名技術(shù)消除數(shù)據(jù)依賴,允許源操作數(shù)準(zhǔn)備好的、不存在依賴關(guān)系的指令先于當(dāng)前被堵塞的指令執(zhí)行,從而進(jìn)一步提升指令的并行處理能力[18]。

當(dāng)一條指令被堵塞或者處理需要較長時間時,指令的并行處理能力越高,就會有越多的后續(xù)源操作數(shù)已準(zhǔn)備好的指令被提前執(zhí)行。在處理器發(fā)現(xiàn)一條指令發(fā)生例外時,需要撤銷提前執(zhí)行的指令對體系結(jié)構(gòu)造成的影響,比如寄存器映射關(guān)系、各個指令隊列中的狀態(tài)位等。但對于微體系結(jié)構(gòu)的影響,比如將后續(xù)的訪存數(shù)據(jù)加載到緩存中,將后續(xù)的頁表項加載到TLB中等。這些微體系結(jié)構(gòu)狀態(tài)的改變并不影響程序的正確性。因此,考慮到硬件實現(xiàn)的復(fù)雜度,超前執(zhí)行的指令已改變的微體系結(jié)構(gòu)并不會撤銷并恢復(fù)成該指令未執(zhí)行前的狀態(tài)。

2.2 推測執(zhí)行

通常,程序并不是線性地按指令序列執(zhí)行,而是通過許多分支、跳轉(zhuǎn)、返回指令,來控制程序的方向,執(zhí)行所需的操作。然而,在這些指令的地址未被解析時,并不能確定程序真正的跳轉(zhuǎn)方向。此時,若堵塞后續(xù)指令,待分支解決后再執(zhí)行會嚴(yán)重影響程序的執(zhí)行效率。因此,處理器常采用多種機(jī)制存儲程序執(zhí)行的跳轉(zhuǎn)歷史,包括跳轉(zhuǎn)方向及是否跳轉(zhuǎn)。處理器依據(jù)歷史信息預(yù)測可能的執(zhí)行方向,提前跳轉(zhuǎn)至相應(yīng)的指令段,與正常的指令執(zhí)行一樣,完成重命名、記錄于ROB中。與此同時,處理器會保留觀察點,記錄分支跳轉(zhuǎn)前流水線的狀態(tài)。待分支解決后,若預(yù)測正確,則可以將執(zhí)行結(jié)果提交,消除了由分支指令引入的控制依賴;若預(yù)測錯誤,則將流水線恢復(fù)至跳轉(zhuǎn)前的狀態(tài)。

依據(jù)內(nèi)存一致性模型,當(dāng)執(zhí)行流中寫操作后有讀操作,且寫操作的地址還未被解析時,后續(xù)的讀操作不能執(zhí)行,以免后續(xù)的讀操作依賴于該寫操作。但在實際的實現(xiàn)中,為了降低這種依賴關(guān)系導(dǎo)致的流水線堵塞,處理器引入內(nèi)存消歧(memory disambiguation)機(jī)制[19],記錄讀取指令的執(zhí)行歷史,并預(yù)測該指令是否可以在寫操作的地址解析出來之前提前執(zhí)行。在地址解析后,若不存在依賴關(guān)系,可以繼續(xù)使用提前讀回的數(shù)據(jù);若存在依賴關(guān)系,將回退并重新執(zhí)行讀操作及后續(xù)的指令。

與亂序執(zhí)行機(jī)制相同,推測執(zhí)行與內(nèi)存消歧方法也存在提前執(zhí)行指令卻不恢復(fù)微體系結(jié)構(gòu)狀態(tài)的情形。

2.3 漏洞分類

基于漏洞利用的機(jī)理,已知的變種可以按表4分為熔斷類漏洞與幽靈類漏洞。熔斷類漏洞利用發(fā)生例外或中斷的指令,提前亂序執(zhí)行后續(xù)的指令;而幽靈類漏洞利用了在分支預(yù)測或訪存消歧后,錯誤地推測執(zhí)行后續(xù)的指令。這2個漏洞都在利用超前執(zhí)行的窗口內(nèi)將敏感信息帶入微體系結(jié)構(gòu)。在此之后,攻擊者識別出微體系結(jié)構(gòu)狀態(tài)的變化,從而獲取敏感信息的值。

表4 熔斷和幽靈漏洞分類

3 攻擊原理

完成瞬態(tài)執(zhí)行漏洞的攻擊具體可以分為3個步驟,如圖1所示。首先,攻擊者需要構(gòu)造錯誤推測或指令例外的產(chǎn)生,創(chuàng)造超前執(zhí)行的條件;其次,在超前執(zhí)行的窗口內(nèi),惡意代碼片段需要改變微體系結(jié)構(gòu)的狀態(tài);最后,可以通過側(cè)信道方法觀測微體系結(jié)構(gòu)的變化,提取敏感信息。

3.1 構(gòu)造錯誤推測或例外

幽靈類漏洞通過惡意訓(xùn)練推測執(zhí)行的歷史信息,誘使受害者進(jìn)程錯誤地推測執(zhí)行特定的代碼。在單核處理器中,微體系結(jié)構(gòu)采用多種硬件資源記錄程序的執(zhí)行歷史。為降低硬件實現(xiàn)的復(fù)雜度,所有的進(jìn)程共享這些資源。在受害者進(jìn)程執(zhí)行時,攻擊進(jìn)程的執(zhí)行歷史會影響推測機(jī)制對于執(zhí)行流的判斷。已知的可以惡意訓(xùn)練的模塊包括:

圖1 瞬態(tài)執(zhí)行攻擊步驟

PHT(pattern history table):分支預(yù)測器采用PHT判斷分支指令是否跳轉(zhuǎn)。因此,攻擊者可以通過訓(xùn)練PHT來構(gòu)造瞬態(tài)執(zhí)行攻擊,如變種1。

BTB(branch target buffer):處理器采用BTB記錄每條分支或間接跳轉(zhuǎn)指令的PC值及跳轉(zhuǎn)方向。變種2及SgxPectre即利用BTB的錯誤推測來執(zhí)行惡意代碼片段。

RSB(return stack buffer):當(dāng)RSB存儲的信息與軟件棧不同時,會存在錯誤推測的情況。SpectreRSB采用直接、推測的方式改變RSB內(nèi)容,或利用處理器對返回指令推測機(jī)制的漏洞執(zhí)行惡意代碼,竊取敏感信息。

STL(store to load):為避免由于寫操作地址未被解析,無法判斷是否與后續(xù)讀操作存在地址沖突導(dǎo)致的流水線堵塞,微處理器引入內(nèi)存消歧。內(nèi)存消歧依據(jù)之前的執(zhí)行歷史,預(yù)測當(dāng)前的讀操作是否與地址未解析的寫操作存在地址沖突。變種4及SPOILER即利用此機(jī)制在錯誤推測時引起的微體系結(jié)構(gòu)改變從而竊取信息。

此外,為進(jìn)一步節(jié)省索引歷史信息引入的面積,僅采用指令的部分信息作為索引值。這使得攻擊者在同一進(jìn)程或不同進(jìn)程間都可以構(gòu)造錯誤推測。

熔斷類漏洞通過利用指令例外產(chǎn)生到處理的時間窗口來獲取敏感數(shù)據(jù)。在微體系結(jié)構(gòu)中,存在多種方式均可以被用來構(gòu)造泄露信息的渠道,如越權(quán)訪問內(nèi)核區(qū)域、越權(quán)寫只讀區(qū)域、越界訪問數(shù)組、采用無效的地址轉(zhuǎn)換表項、訪問地址不對齊等。這些例外都有可能被攻擊者用于竊取數(shù)據(jù)。但需要注意,許多例外的發(fā)現(xiàn)及處理比較及時,難以構(gòu)造有效的攻擊。

3.2 改變微體系結(jié)構(gòu)狀態(tài)

如前文所述,由于錯誤推測或例外的延后處理,超前執(zhí)行的指令對于體系結(jié)構(gòu)上的改變在流水線發(fā)現(xiàn)錯誤后會被恢復(fù)至之前的狀態(tài)。但微體系結(jié)構(gòu)上的改變,由于并不影響程序的正確性,因而考慮到硬件實現(xiàn)的復(fù)雜度,該修改不會被撤銷。例如:某內(nèi)存數(shù)據(jù)是否在緩存、緩存的一致性狀態(tài),甚至是多核間的計算資源沖突。

為真正改變微體系結(jié)構(gòu)的狀態(tài),在具體攻擊的實施中,還需要滿足2個條件:知悉惡意代碼片段執(zhí)行前的微體系結(jié)構(gòu)狀態(tài),例如,通過CLFLUSH指令將某數(shù)據(jù)從緩存中移除,或通過用數(shù)組將緩存內(nèi)容替換;為惡意代碼片段構(gòu)造較長的執(zhí)行窗口,例如,通過將推測所依賴的分支指令或發(fā)生異常的指令源操作移出緩存,或構(gòu)造較長的數(shù)據(jù)依賴鏈。

3.3 側(cè)信道分析微體系結(jié)構(gòu)的變化

目前,已知有多種方法識別出在被攻擊指令執(zhí)行前后微體系結(jié)構(gòu)狀態(tài)的改變,這類方法被稱為側(cè)信道。通過側(cè)信道方法可以竊取在微體系結(jié)構(gòu)中所隱含的私密信息。例如,竊取加密算法的秘鑰、用戶鍵入值、內(nèi)核地址映射信息等。已知的方法包括緩存?zhèn)刃诺馈r間側(cè)信道、功耗側(cè)信道以及電磁側(cè)信道等。

由于緩存?zhèn)刃诺缹崿F(xiàn)簡單,精度較高,因此廣泛應(yīng)用于真實的攻擊中。高性能處理器中一般采用多級緩存結(jié)構(gòu),由于訪問不同層級的緩存延遲不同,所以攻擊者可以探測數(shù)據(jù)區(qū)域的訪問時間或指令的執(zhí)行時間,從而識別出受害者進(jìn)程的執(zhí)行流或者敏感數(shù)據(jù)。已知的瞬態(tài)執(zhí)行漏洞均采用緩存?zhèn)刃诺婪椒▉矸赐泼舾行畔ⅰ?/p>

已知緩存?zhèn)刃诺拦舴譃?大類。當(dāng)攻擊者沒有獲取受害者進(jìn)程的地址空間分配信息的權(quán)限時,可采用基于最小驅(qū)逐集策略(eviction set based method)的方法,如Prime+Probe、Evict+Time、Prime-Abort;或者攻擊者可以利用已知受害者進(jìn)程的地址空間,構(gòu)造基于共享數(shù)據(jù)區(qū)策略的攻擊(shared memory based method),如Flush+Reload、Flush+Flush。第2種方法較第1種方法更加靈活、危害性也更高。它不僅可以竊取單核內(nèi)的敏感信息,而且可以竊取共享末級緩存的數(shù)據(jù)。表5以Flush+Reload算法為例說明其攻擊原理。

表5 Flush+Reload攻擊算法

4 漏洞防御

對應(yīng)瞬態(tài)執(zhí)行攻擊的3個步驟,其防御方法有3類措施。對于攻擊,第1步,防御幽靈類漏洞可以通過防止惡意訓(xùn)練分支預(yù)測器或內(nèi)存消歧,防御幽靈類攻擊可以通過及時處理避免例外的產(chǎn)生。第2步,可以防止超前執(zhí)行的指令對于微體系結(jié)構(gòu)上的改變。第3步,防止攻擊者具備有效的途徑通過側(cè)信道方法將微體系結(jié)構(gòu)的變化提取出來。

4.1 防止被惡意訓(xùn)練及隔離敏感數(shù)據(jù)

對于幽靈類漏洞變種1、變種2、SgxPectre以及SpectrePrime,Intel提出更新微碼的方法,在程序中插入特定的指令,針對性地防止不同等級的安全域之間分支預(yù)測信息的共享。如通過SMEP防止用戶態(tài)和內(nèi)核態(tài)的共享;通過IBPB防止不同邏輯核之間的共享;通過IBRS防止邏輯核內(nèi)不同進(jìn)程間的共享[20]。Google提出的Retpoline[21],將間接跳轉(zhuǎn)和函數(shù)調(diào)用指令替換為安全的返回指令實現(xiàn),預(yù)測信息不再通過分支目標(biāo)緩沖區(qū)(BTB),而是由返回地址來實現(xiàn),從而防止被惡意訓(xùn)練。BRB[22]通過在上下文切換時,將分支預(yù)測器歷史清空,從而阻斷攻擊程序與受害者之間的分支訓(xùn)練。同時,為BRB引入硬件緩存模塊,負(fù)責(zé)保存較為重要的分支預(yù)測信息,從而降低由清空引入的代價。

對于熔斷類漏洞變種3及Meltdown,操作系統(tǒng)不再依賴硬件對權(quán)限進(jìn)行檢查產(chǎn)生例外,而是引入內(nèi)核頁表隔離(kernel page table isolation,KPTI)機(jī)制[23],將內(nèi)核空間從用戶空間中隔離,用戶程序在執(zhí)行時將無法直接訪問到內(nèi)核數(shù)據(jù)。變種5攻擊成功有2個要素:存在無效的虛擬地址到物理地址的映射,敏感數(shù)據(jù)在一級緩存中。因此防御變種5可以通過在頁表項無效時將物理地址設(shè)置為無效值,或者在頁無效時將敏感數(shù)據(jù)擦除或移出緩存。

4.2 防止微體系結(jié)構(gòu)上的變化

對于幽靈類漏洞變種1、變種2、變種3、SgxPectre以及SpectrePrime,防止推測執(zhí)行對緩存結(jié)構(gòu)的變化可以通過堵塞推測訪存的執(zhí)行,例如:可以在推測的訪存指令前添加LFENCE指令,在之前的分支指令均被解決后,即確定跳轉(zhuǎn)方向后再執(zhí)行訪存指令。針對幽靈漏洞,微軟提出共15種危險模式,oo7通過靜態(tài)分析程序的二進(jìn)制[24],提取出潛在的危險片段,并在合適的地方插入LFENCE指令,從而保證推測執(zhí)行的訪存指令不改變微體系結(jié)構(gòu)中緩存的狀態(tài)。

另外,也可以采用硬件防御機(jī)制將推測執(zhí)行引起的微體系結(jié)構(gòu)狀態(tài)的改變?nèi)慷嫁D(zhuǎn)移至獨立的硬件模塊,不改變原本需要更新的結(jié)構(gòu)。待其訪存操作轉(zhuǎn)為安全后,即推測狀態(tài)被消除后,從緩沖區(qū)中移至真正的微體系結(jié)構(gòu),否則廢棄相關(guān)改變。由伊利諾伊大學(xué)香檳分校和加州大學(xué)河濱分校分別開發(fā)的InvisiSpec[25]和SafeSpec[26]即利用了此防御原理。

InvisiSpec針對數(shù)據(jù)緩沖區(qū),采用與讀寫隊列(load store queue, LSQ)一一對應(yīng)的推測緩存模塊(speculative buffer, SB)記錄推測的訪存信息,對于體系結(jié)構(gòu)其他模塊都不可見。在訪存操作轉(zhuǎn)為非推測狀態(tài)期間,可能由于其他核對相同地址的寫操作而失效。因此,需要重新發(fā)射訪存指令,將數(shù)據(jù)從緩存或內(nèi)存中重新讀取,與緩存模塊存儲的值進(jìn)行比較。若比較結(jié)果相同,則移至真正緩存,否則,采用新取回的值,廢棄緩存中的值。保證推測緩存模塊也滿足內(nèi)存一致性模型,此過程稱為核實(validation)。在一條訪存操作在ROB第一條時,不會被由于其他指令被廢棄。此時,采用核實方法會需要較多的時鐘周期,容易導(dǎo)致流水線堵塞。經(jīng)過分析總結(jié)出一系列不會違反內(nèi)存一致性模型的訪存操作,可以通過顯露(exposure)直接將緩存內(nèi)容移至緩存中。

InvisiSpec提出了多種方法來保持性能與安全性的平衡:顯露操作可以并行執(zhí)行;推測緩存中存儲的信息也可以支持前遞操作;及早發(fā)現(xiàn)并廢棄錯誤推測執(zhí)行的指令;在末級緩存也引入推測緩存,從而降低由于核實操作多次訪問內(nèi)存而引入的延遲。

SafeSpec同樣采用單獨模塊,存儲推測執(zhí)行過程中引起的微體系結(jié)構(gòu)的變化。相比于InvisiSpec,不僅對數(shù)據(jù)緩存的推測操作進(jìn)行緩存,同時對指令以及地址轉(zhuǎn)換項的內(nèi)容進(jìn)行緩存。為保證在執(zhí)行過程中,不會由于容量不夠引起緩存結(jié)構(gòu)內(nèi)部的沖突,通過在LSU中附加指針,一一指向為推測的數(shù)據(jù)訪問添加的獨立結(jié)構(gòu);通過在ROB中添加指針,指向為推測的指令訪問和地址轉(zhuǎn)換項添加的獨立結(jié)構(gòu)。

4.3 防止側(cè)信道觀測微體系結(jié)構(gòu)變化

已知的幽靈類漏洞以及熔斷類漏洞均通過時間信息觀測微體系結(jié)構(gòu)的變化,因此,谷歌瀏覽器通過降低時鐘的精確度,從而降低對數(shù)據(jù)是否在緩存的識別精度,使得攻擊者無法從改變的微體系結(jié)構(gòu)中分辨出敏感信息。

對于依賴分支指令的幽靈類漏洞,文獻(xiàn)[27]提出動態(tài)分配路徑保護(hù)(dynamically allocated way guard,DAWG)方法,動態(tài)地將緩存依據(jù)不同的保護(hù)域進(jìn)行隔離,保護(hù)域之間不共享緩存內(nèi)容,因而不存在跨保護(hù)域的推測執(zhí)行側(cè)信道攻擊。

5 結(jié) 論

本文首先介紹瞬態(tài)執(zhí)行漏洞的相關(guān)變種,并依據(jù)不同變種所利用的基本原理分為幽靈類漏洞與熔斷類漏洞。通過分析2類漏洞基本的3大攻擊步驟,提出3種防御點,并將現(xiàn)有的防御方式進(jìn)行了分類。

幽靈類漏洞以及熔斷類漏洞爆發(fā)的根本原因是當(dāng)前的處理器架構(gòu)始終以性能優(yōu)先作為導(dǎo)向,卻未對性能優(yōu)化機(jī)制進(jìn)行周密的安全性分析,從而導(dǎo)致漏洞頻頻出現(xiàn)。在現(xiàn)有的硬件基礎(chǔ)上進(jìn)行防御,僅能通過有限的方法對不同漏洞各個突破。并且,將不同的防御方案集成到同一系統(tǒng)中,勢必會帶來嚴(yán)重的性能損失。在計算機(jī)體系結(jié)構(gòu)頂級國際會議ISCA 2018上,圖靈獎獲得者、精簡指令集的創(chuàng)始人David A. Patterson以及John L. Hennessy做了特邀報告,提出當(dāng)前體系結(jié)構(gòu)設(shè)計面臨著嚴(yán)重的安全漏洞,并提出需要推出體系結(jié)構(gòu)2.0,而其重要特征之一便是從處理器設(shè)計伊始就引入安全性分析。

猜你喜歡
敏感數(shù)據(jù)變種體系結(jié)構(gòu)
干擾條件下可檢索數(shù)字版權(quán)管理環(huán)境敏感數(shù)據(jù)的加密方法
避免污名化!世衛(wèi)組織改用希臘字母命名變異新冠病毒
實現(xiàn)虛擬機(jī)敏感數(shù)據(jù)識別
基于透明加密的水下通信網(wǎng)絡(luò)敏感數(shù)據(jù)防泄露方法
變種隊的復(fù)仇之路
基于4A平臺的數(shù)據(jù)安全管控體系的設(shè)計與實現(xiàn)
基于粒計算的武器裝備體系結(jié)構(gòu)超網(wǎng)絡(luò)模型
作戰(zhàn)體系結(jié)構(gòu)穩(wěn)定性突變分析
奇妙變種人
基于DODAF的裝備體系結(jié)構(gòu)設(shè)計
崇仁县| 民勤县| 清原| 大化| 醴陵市| 邯郸县| 开封市| 吴忠市| 乌兰察布市| 双流县| 南和县| 梅河口市| 遵义市| 临夏市| 神池县| 沙田区| 台江县| 万盛区| 炉霍县| 璧山县| 西华县| 安阳市| 上杭县| 同江市| 盈江县| 黄山市| 宾川县| 岢岚县| 钦州市| 沁水县| 光山县| 高雄县| 手游| 开原市| 昭平县| 张家川| 巴彦淖尔市| 正镶白旗| 抚宁县| 岗巴县| 崇左市|