王 楷, 郭 濤, 季振洲
(1 哈爾濱工業(yè)大學(xué) 計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院, 哈爾濱 150001; 2 哈爾濱工業(yè)大學(xué) 網(wǎng)絡(luò)與信息中心, 哈爾濱 150001)
緩存是當(dāng)前商用處理器芯片中的核心部件之一,有效彌補(bǔ)了較快的處理器運(yùn)算速度與較慢的內(nèi)存訪問速度的差距。 然而,緩存時(shí)間側(cè)信道攻擊卻利用了不同緩存層次和內(nèi)存間的訪問時(shí)間差作為信道,推斷受害者程序運(yùn)行過程中的訪問模式,進(jìn)而從系統(tǒng)中提取諸如密鑰、瀏覽記錄、用戶輸入等未授權(quán)的敏感信息[1-2]。 不僅如此,以“幽靈”為代表的瞬態(tài)攻擊也將緩存?zhèn)刃诺拦粢暈樾畔⑿孤舵溨械闹匾画h(huán)[3]。 不斷增加的安全威脅表明探索有效的防御機(jī)制的迫切性。
異常檢測是防御緩存?zhèn)刃诺拦舻闹髁魉枷胫弧?該方法認(rèn)為攻擊者在竊取緩存訪問模式的過程中,需要針對目標(biāo)緩存行構(gòu)建特定的交互方式,而這會(huì)在硬件微架構(gòu)事件中產(chǎn)生與普通程序存在顯著差異的特征。 識別這些可疑特征即可有效地定位攻擊行為,進(jìn)而采取低成本的針對性保護(hù)操作。 目前,學(xué)術(shù)界已對指令數(shù)、緩存缺失和命中率、CPU 周期數(shù)等許多硬件事件進(jìn)行分析,并陸續(xù)提出了基于閾值、概率分布、機(jī)器學(xué)習(xí)的探測手段。 盡管這些方法在一定程度上緩解了側(cè)信道攻擊風(fēng)險(xiǎn),但普遍未考慮攻擊者調(diào)整攻擊細(xì)節(jié),偽造信息流的情況下的檢測準(zhǔn)確度。 在第二節(jié),本文將詳細(xì)討論當(dāng)前典型檢測方法的優(yōu)缺點(diǎn)。
本文指出當(dāng)前可行的緩存?zhèn)刃诺拦粼诿枯喬綔y中需要驅(qū)逐和重訪操作,并且僅針對被攻擊的緩存組,這導(dǎo)致了目標(biāo)緩存組的訪問量增加。 另一方面,攻擊者還受到了嚴(yán)格的頻率約束(500~20 000周期),這進(jìn)一步加劇了訪問流量。 在時(shí)鐘精準(zhǔn)的全系統(tǒng)模擬器gem5 上,實(shí)驗(yàn)結(jié)果表明,側(cè)信道攻擊至少會(huì)導(dǎo)致相當(dāng)于SPEC 基準(zhǔn)程序2.61 倍的訪問量。
緩存?zhèn)刃诺拦裟軌蚶貌煌彺鎸蛹壓蛢?nèi)存間的訪問延遲感知受害者程序的訪問行為,進(jìn)而竊取敏感信息。 最初,側(cè)信道攻擊的觀測目標(biāo)是一級私有緩存,但這種攻擊場景由于需要攻擊者和受害者同駐在相同物理核,具有很大的局限性。 直到2014 年,Yarom 等人提出了針對末級緩存的跨核緩存攻擊。 由于跨核攻擊具備噪聲低、易于發(fā)起、帶寬高的優(yōu)勢,自此之后,有關(guān)緩存?zhèn)刃诺赖墓シ姥芯恐匦霓D(zhuǎn)移到了跨核攻擊。
依據(jù)攻擊過程中驅(qū)逐手段的差異,跨核緩存攻擊廣義上可劃分為基于競爭的攻擊和基于沖刷的攻擊。 目前,學(xué)術(shù)界已證明不同緩存架構(gòu)(包含型和非包含型)都會(huì)受到上述兩類攻擊的威脅,只是攻擊細(xì)節(jié)存在差異。 本文以包含緩存架構(gòu)作為基準(zhǔn)系統(tǒng),分析和驗(yàn)證側(cè)信道攻擊下存在的顯著特征。 在未來工作中,將進(jìn)一步分析非包含緩存架構(gòu)中的硬件事件特征。
圖1 描述了Flush + Reload,這一典型的基于沖刷的攻擊實(shí)例。 這類攻擊能夠確定特定時(shí)間窗口內(nèi)攻擊者和受害者共享的緩存行的訪問模式。 由圖1可知,其攻擊過程包含3 個(gè)步驟:
圖1 Flush + Reload 攻擊Fig.1 Flush + Reload attacks
(1)驅(qū)逐:在驅(qū)逐階段,攻擊者使用clflush(x86指令集下)或其他等效指令將目標(biāo)緩存行從緩存清除。 該指令能夠在任何特權(quán)級使用,并且能保證被操作的緩存行在各級緩存中都被清除。
(2)等待:在攻擊者等待階段,如果受害者訪問了目標(biāo)地址,該緩存行會(huì)遷移進(jìn)入緩存。 否則,緩存不會(huì)記錄該數(shù)據(jù)。
(3)重訪:攻擊者最后重訪目標(biāo)緩存行并計(jì)算延遲,若出現(xiàn)緩存命中(延遲較短)則表明受害者曾經(jīng)訪問過目標(biāo)緩存行。 否則,攻擊者能夠確定受害者未訪問對應(yīng)數(shù)據(jù)。
圖2 給出了Prime+Probe,這一典型的基于競爭的攻擊實(shí)例。 這類攻擊可以觀測特定時(shí)間窗口內(nèi)目標(biāo)緩存組的訪問模式。 相比于基于沖刷的攻擊,該攻擊克服了共享內(nèi)存的約束,因而更為可行,也更具威脅。 擬對此展開研究分述如下。
圖2 Prime+Probe 攻擊Fig.2 Prime+Probe attacks
(1)驅(qū)逐:在驅(qū)逐階段,攻擊者使用預(yù)先準(zhǔn)備好的驅(qū)逐集合占據(jù)目標(biāo)地址所在的緩存組,利用組沖突將目標(biāo)緩存行清除。 為實(shí)現(xiàn)該目標(biāo),驅(qū)逐集合應(yīng)包含與末級緩存路數(shù)相等的元素,并且每個(gè)元素都應(yīng)與目標(biāo)地址映射到相同緩存組。
(2)等待:在等待階段,如果受害者訪問了目標(biāo)地址。 無論緩存采用何種替換策略,該操作必然會(huì)移除驅(qū)逐集中的一個(gè)元素。 否則,對應(yīng)緩存組依舊存儲(chǔ)完整的驅(qū)逐集。
(3)探測:攻擊者測量重訪驅(qū)逐集的延遲。 如果延遲較長表明重訪行為中出現(xiàn)了緩存缺失事件,進(jìn)而可以推斷受害者訪問了目標(biāo)緩存組。
異常檢測最初采用閾值比對的方法識別緩存攻擊。 CacheShield 認(rèn)為程序在未被攻擊時(shí)緩存缺失數(shù)不會(huì)出現(xiàn)顯著變化,并提出基于變點(diǎn)檢測理論的檢測算法分析該指標(biāo)是否達(dá)到閾值[4]。 Biscuit 指出被攻擊程序在運(yùn)行時(shí)會(huì)比未受到攻擊時(shí)增加5 倍的緩存缺失數(shù)。 基于這一觀測,Biscuit 使用編譯器分析程序中每個(gè)循環(huán)產(chǎn)生的緩存缺失數(shù)量,并將該值插入到程序中。 在程序后續(xù)運(yùn)行時(shí),若實(shí)際產(chǎn)生的缺失數(shù)量超過期望值,則認(rèn)為可能遭受攻擊[5]。然而,基于閾值比對的方法對運(yùn)行環(huán)境敏感,可能會(huì)產(chǎn)生較多誤報(bào),并且容易被繞過。
Chiappetta 等人[6]擴(kuò)大了采樣范圍,使用總指令數(shù)、CPU 周期數(shù)、二級緩存命中、末級緩存命中和缺失數(shù)五個(gè)評價(jià)指標(biāo)。 同時(shí),該方法使用均值和方差而不是簡單的數(shù)值對比識別攻擊。
Fortuneteller 認(rèn)為程序運(yùn)行過程中微架構(gòu)事件具有時(shí)間先后特性,因此使用門控循環(huán)單元和長短期記憶網(wǎng)絡(luò)這兩個(gè)循環(huán)神經(jīng)網(wǎng)絡(luò)預(yù)測選定的微架構(gòu)事件(一級指令緩存命中數(shù)、一級指令緩存缺失數(shù)和末級緩存缺失數(shù))在下一時(shí)刻的數(shù)值。 如果在設(shè)定的滑動(dòng)窗口內(nèi)超過閾值次數(shù)過多,則認(rèn)為存在惡意程序[7]。 此外,F(xiàn)ortuneteller 從37 個(gè)硬件事件中自動(dòng)化地篩選出了上述三個(gè)最具關(guān)聯(lián)性指標(biāo)。 該方案在檢測緩存?zhèn)刃诺拦舻耐瑫r(shí),還能夠覆蓋幽靈[3]、rowhammer[8]等典型的硬件漏洞。
對于常規(guī)的緩存?zhèn)刃诺拦?,上述機(jī)制在準(zhǔn)確度和降低性能開銷維度方面已取得了不錯(cuò)的進(jìn)展。例如,F(xiàn)ortuneteller 的F - score已達(dá)到0.997 并且僅對Phoronix 測試程序造成平均0.12%的性能損失。然而,這些檢測方法并未考慮如何應(yīng)對自適應(yīng)攻擊,即攻擊者在感知系統(tǒng)中部署了防御機(jī)制后,偽裝信息流,避免觸發(fā)指標(biāo)異常的攻擊場景。 本文的目標(biāo)是分析并驗(yàn)證側(cè)信道攻擊中無法隱藏的硬件事件及其特征,啟發(fā)研究人員探索更有效的防御方案。
通過分析攻擊流程,本文發(fā)現(xiàn)無論是基于沖刷的攻擊還是基于競爭的攻擊在進(jìn)行探測時(shí)都需要滿足如下2 個(gè)先決條件:
(1)不可避免的驅(qū)逐操作。 攻擊者在每輪發(fā)起攻擊前需要確保被探測的緩存行已從緩存清除。 否則,受害者隨后的訪問行為會(huì)出現(xiàn)緩存命中事件。由于緩存狀態(tài)未發(fā)生改變,攻擊者將無法感知到受害者的行為。
(2)嚴(yán)格的攻擊頻率。 在每輪迭代中,攻擊者僅能確定目標(biāo)緩存行或緩存組是否被受害者訪問,這一有限的信息量并不足以引起敏感信息泄露。 為獲得完整信息,攻擊者需要重復(fù)完成多次攻擊。 例如,在Liu 等人[2]提出的Prime + Probe 攻擊中,攻擊者實(shí)施了上萬次探測才能復(fù)原出3 072 位密鑰信息。 當(dāng)需要發(fā)動(dòng)多輪攻擊時(shí),攻擊者就需要考慮攻擊頻率的問題。 一方面,攻擊間隔過長可能導(dǎo)致受害者在此期間發(fā)生了多次與敏感信息相關(guān)的操作,導(dǎo)致錯(cuò)失信息。 另一方面,攻擊間隔過短會(huì)增加攻擊者的驅(qū)逐和重訪等操作與受害者的訪問行為發(fā)生沖突的可能,引入新的噪聲。 通常,現(xiàn)有攻擊的間隔為500~20 000 周期。
異常檢測需要選擇對攻擊程序和正常程序有良好區(qū)分度的硬件事件作為識別器。 如前所述,已有許多研究使用系統(tǒng)運(yùn)行中的統(tǒng)計(jì)事件,尤其是緩存相關(guān)事件(緩存命中、缺失數(shù)量[9]等)識別側(cè)信道攻擊。然而,攻擊者可能會(huì)優(yōu)化攻擊,避免上述指標(biāo)出現(xiàn)異常。 在側(cè)信道攻擊的3 步流程中,攻擊者會(huì)參與其中的第一和第三步。 本節(jié)將從中挖掘基于沖刷和基于競爭的攻擊存在的共性特征。 具體論述如下。
(1)基于沖刷的攻擊。 基于沖刷的攻擊的緩存事件集中在重訪操作。 由于受害者行為的差異,攻擊者的重訪操作必然會(huì)導(dǎo)致一次緩存命中或缺失。
(2)基于競爭的攻擊。 基于競爭的攻擊的緩存事件集中在驅(qū)逐操作。 本節(jié)將在LRU (Least Recently Used)替換策略下進(jìn)行分析。 對于其他類型的緩存替換策略,已有研究證明相應(yīng)策略將會(huì)在特殊的攻擊手段下退化為LRU[8]。
假定e1e2e3...ew是目標(biāo)緩存組的驅(qū)逐集而v是目標(biāo)緩存行。 在開啟下一輪探測前,假定緩存組存儲(chǔ)的元素分別是e1e2e3...ew-1v,該存儲(chǔ)順序同時(shí)也代表了LRU 狀態(tài),即發(fā)生緩存替換時(shí),下一個(gè)被移除的元素是e1。 在驅(qū)逐階段,攻擊者迭代訪問整個(gè)驅(qū)逐集以確保目標(biāo)地址v被移除。 盡管訪問驅(qū)逐集的順序不會(huì)改變驅(qū)逐的效果但會(huì)影響微架構(gòu)的統(tǒng)計(jì)信息。 如果訪問序列是e1e2e3...ew,這會(huì)導(dǎo)致w -1 次緩存命中和一次緩存缺失。 翻轉(zhuǎn)訪問順序則會(huì)帶來w次訪問缺失。
從上述分析可以發(fā)現(xiàn),攻擊行為必然會(huì)導(dǎo)致緩存命中或缺失事件,并由于嚴(yán)格的攻擊頻率使得出現(xiàn)次數(shù)急劇增加。 但是,單獨(dú)的緩存命中或缺失事件無法完全覆蓋攻擊者的行為。 此外,攻擊者還可以引入無關(guān)的訪存操作動(dòng)態(tài)改變?nèi)笔屎兔新省?/p>
盡管攻擊者有可能影響緩存命中和缺失的數(shù)量,但緩存訪問量(緩存命中和缺失事件總和)是其無法隱藏的特征。 由于物理地址到緩存的映射關(guān)系固定,目標(biāo)地址每次都會(huì)落入到同一個(gè)緩存組,這也使得這些訪問量必然集中在對應(yīng)的緩存組。 因此,本文建議使用末級緩存組訪問量作為異常檢測的關(guān)鍵指標(biāo)。
本節(jié)在時(shí)鐘精準(zhǔn)的全系統(tǒng)模擬器gem5 中統(tǒng)計(jì)了SPEC CPU2006 基準(zhǔn)程序和2 類跨核緩存攻擊在末級緩存組的訪問量。 該模擬器配置了一個(gè)使用3層包含緩存和x86 指令集的系統(tǒng)。 其中,一級緩存和二級緩存為每個(gè)核私有,邏輯共享的末級緩存在物理上劃分為與核數(shù)相等的分片。 表1 列出了詳細(xì)的參數(shù)配置。
表1 參數(shù)配置Tab.1 Parameter configurations
本節(jié)使用reference 輸入運(yùn)行SPEC 測試集。 對于每個(gè)程序,gem5 采樣其有代表性的十億條指令,并統(tǒng)計(jì)末級緩存組的訪問量。
本節(jié)還構(gòu)建了Flush+Reload 和Prime+Probe,并統(tǒng)計(jì)攻擊行為下各緩存組訪問量。 上述攻擊會(huì)以20 000周期為間隔從square-and-multiply 算法中竊取密鑰。 其中,F(xiàn)lush+Reload 攻擊依據(jù)圖1 所述流程監(jiān)控目標(biāo)緩存行;Prime+Probe 攻擊依據(jù)圖2 所述流程監(jiān)控目標(biāo)緩存組。
圖3 統(tǒng)計(jì)了測試集和攻擊程序每百萬周期中末級緩存組平均出現(xiàn)的訪問量。 目標(biāo)緩存組在Prime+Probe 和Flush+Reload 攻擊中分別會(huì)出現(xiàn)約403.1和73.2 次訪問操作。 在相同攻擊頻率下,以Prime +Probe 為代表的基于競爭的攻擊會(huì)帶來更顯著的訪問量。 這一現(xiàn)象主要由于基于競爭的攻擊在驅(qū)逐階段需要利用緩存組沖突和替換策略清除目標(biāo)緩存行。 此外,由于攻擊行為僅聚焦目標(biāo)緩存組,因此其他組的訪問量趨向0。
圖3 每百萬周期末級緩存組(300~350)訪問量Fig.3 Access count per one million cycles for last level cache sets(300~350)
測試集程序則不存在這種異?,F(xiàn)象,且在每個(gè)緩存組的平均訪問量都小于30。 其中,zeusmp 在所有測試集中緩存組訪問量最多,約為28.06。 Prime+ Probe 和Flush + Reload 的訪問量分別是該值的14.37 倍和2.61 倍。 因此,末級緩存組訪問量是一種對惡意程序和常規(guī)程序具有良好區(qū)分度的評價(jià)指標(biāo),可以用于識別側(cè)信道攻擊。
本文指出當(dāng)前基于硬件事件的緩存?zhèn)刃诺拦魴z測機(jī)制并未考慮攻擊者隱藏特征時(shí)的準(zhǔn)確度。 本文發(fā)現(xiàn)側(cè)信道攻擊需要保證每輪的驅(qū)逐操作和嚴(yán)格的攻擊頻率,而這兩個(gè)約束條件會(huì)導(dǎo)致目標(biāo)緩存組的訪問量不可避免地增加。 實(shí)驗(yàn)結(jié)果表明側(cè)信道攻擊至少會(huì)產(chǎn)生相當(dāng)于SPEC 基準(zhǔn)程序2.61 倍的緩存組訪問量。 這說明緩存組訪問量是一種對惡意程序和常規(guī)程序具有良好區(qū)分度的評價(jià)指標(biāo)。 在后續(xù)工作中,本研究將探索利用該指標(biāo)檢測和防御側(cè)信道攻擊的方案。