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