王 楷, 郭 濤, 季振洲
(1 哈爾濱工業大學 計算機科學與技術學院, 哈爾濱 150001; 2 哈爾濱工業大學 網絡與信息中心, 哈爾濱 150001)
緩存是當前商用處理器芯片中的核心部件之一,有效彌補了較快的處理器運算速度與較慢的內存訪問速度的差距。 然而,緩存時間側信道攻擊卻利用了不同緩存層次和內存間的訪問時間差作為信道,推斷受害者程序運行過程中的訪問模式,進而從系統中提取諸如密鑰、瀏覽記錄、用戶輸入等未授權的敏感信息[1-2]。 不僅如此,以“幽靈”為代表的瞬態攻擊也將緩存側信道攻擊視為信息泄露鏈中的重要一環[3]。 不斷增加的安全威脅表明探索有效的防御機制的迫切性。
異常檢測是防御緩存側信道攻擊的主流思想之一。 該方法認為攻擊者在竊取緩存訪問模式的過程中,需要針對目標緩存行構建特定的交互方式,而這會在硬件微架構事件中產生與普通程序存在顯著差異的特征。 識別這些可疑特征即可有效地定位攻擊行為,進而采取低成本的針對性保護操作。 目前,學術界已對指令數、緩存缺失和命中率、CPU 周期數等許多硬件事件進行分析,并陸續提出了基于閾值、概率分布、機器學習的探測手段。 盡管這些方法在一定程度上緩解了側信道攻擊風險,但普遍未考慮攻擊者調整攻擊細節,偽造信息流的情況下的檢測準確度。 在第二節,本文將詳細討論當前典型檢測方法的優缺點。
本文指出當前可行的緩存側信道攻擊在每輪探測中需要驅逐和重訪操作,并且僅針對被攻擊的緩存組,這導致了目標緩存組的訪問量增加。 另一方面,攻擊者還受到了嚴格的頻率約束(500~20 000周期),這進一步加劇了訪問流量。 在時鐘精準的全系統模擬器gem5 上,實驗結果表明,側信道攻擊至少會導致相當于SPEC 基準程序2.61 倍的訪問量。
緩存側信道攻擊能夠利用不同緩存層級和內存間的訪問延遲感知受害者程序的訪問行為,進而竊取敏感信息。 最初,側信道攻擊的觀測目標是一級私有緩存,但這種攻擊場景由于需要攻擊者和受害者同駐在相同物理核,具有很大的局限性。 直到2014 年,Yarom 等人提出了針對末級緩存的跨核緩存攻擊。 由于跨核攻擊具備噪聲低、易于發起、帶寬高的優勢,自此之后,有關緩存側信道的攻防研究重心轉移到了跨核攻擊。
依據攻擊過程中驅逐手段的差異,跨核緩存攻擊廣義上可劃分為基于競爭的攻擊和基于沖刷的攻擊。 目前,學術界已證明不同緩存架構(包含型和非包含型)都會受到上述兩類攻擊的威脅,只是攻擊細節存在差異。 本文以包含緩存架構作為基準系統,分析和驗證側信道攻擊下存在的顯著特征。 在未來工作中,將進一步分析非包含緩存架構中的硬件事件特征。
圖1 描述了Flush + Reload,這一典型的基于沖刷的攻擊實例。 這類攻擊能夠確定特定時間窗口內攻擊者和受害者共享的緩存行的訪問模式。 由圖1可知,其攻擊過程包含3 個步驟:

圖1 Flush + Reload 攻擊Fig.1 Flush + Reload attacks
(1)驅逐:在驅逐階段,攻擊者使用clflush(x86指令集下)或其他等效指令將目標緩存行從緩存清除。 該指令能夠在任何特權級使用,并且能保證被操作的緩存行在各級緩存中都被清除。
(2)等待:在攻擊者等待階段,如果受害者訪問了目標地址,該緩存行會遷移進入緩存。 否則,緩存不會記錄該數據。
(3)重訪:攻擊者最后重訪目標緩存行并計算延遲,若出現緩存命中(延遲較短)則表明受害者曾經訪問過目標緩存行。 否則,攻擊者能夠確定受害者未訪問對應數據。
圖2 給出了Prime+Probe,這一典型的基于競爭的攻擊實例。 這類攻擊可以觀測特定時間窗口內目標緩存組的訪問模式。 相比于基于沖刷的攻擊,該攻擊克服了共享內存的約束,因而更為可行,也更具威脅。 擬對此展開研究分述如下。

圖2 Prime+Probe 攻擊Fig.2 Prime+Probe attacks
(1)驅逐:在驅逐階段,攻擊者使用預先準備好的驅逐集合占據目標地址所在的緩存組,利用組沖突將目標緩存行清除。 為實現該目標,驅逐集合應包含與末級緩存路數相等的元素,并且每個元素都應與目標地址映射到相同緩存組。
(2)等待:在等待階段,如果受害者訪問了目標地址。 無論緩存采用何種替換策略,該操作必然會移除驅逐集中的一個元素。 否則,對應緩存組依舊存儲完整的驅逐集。
(3)探測:攻擊者測量重訪驅逐集的延遲。 如果延遲較長表明重訪行為中出現了緩存缺失事件,進而可以推斷受害者訪問了目標緩存組。
異常檢測最初采用閾值比對的方法識別緩存攻擊。 CacheShield 認為程序在未被攻擊時緩存缺失數不會出現顯著變化,并提出基于變點檢測理論的檢測算法分析該指標是否達到閾值[4]。 Biscuit 指出被攻擊程序在運行時會比未受到攻擊時增加5 倍的緩存缺失數。 基于這一觀測,Biscuit 使用編譯器分析程序中每個循環產生的緩存缺失數量,并將該值插入到程序中。 在程序后續運行時,若實際產生的缺失數量超過期望值,則認為可能遭受攻擊[5]。然而,基于閾值比對的方法對運行環境敏感,可能會產生較多誤報,并且容易被繞過。
Chiappetta 等人[6]擴大了采樣范圍,使用總指令數、CPU 周期數、二級緩存命中、末級緩存命中和缺失數五個評價指標。 同時,該方法使用均值和方差而不是簡單的數值對比識別攻擊。
Fortuneteller 認為程序運行過程中微架構事件具有時間先后特性,因此使用門控循環單元和長短期記憶網絡這兩個循環神經網絡預測選定的微架構事件(一級指令緩存命中數、一級指令緩存缺失數和末級緩存缺失數)在下一時刻的數值。 如果在設定的滑動窗口內超過閾值次數過多,則認為存在惡意程序[7]。 此外,Fortuneteller 從37 個硬件事件中自動化地篩選出了上述三個最具關聯性指標。 該方案在檢測緩存側信道攻擊的同時,還能夠覆蓋幽靈[3]、rowhammer[8]等典型的硬件漏洞。
對于常規的緩存側信道攻擊,上述機制在準確度和降低性能開銷維度方面已取得了不錯的進展。例如,Fortuneteller 的F - score已達到0.997 并且僅對Phoronix 測試程序造成平均0.12%的性能損失。然而,這些檢測方法并未考慮如何應對自適應攻擊,即攻擊者在感知系統中部署了防御機制后,偽裝信息流,避免觸發指標異常的攻擊場景。 本文的目標是分析并驗證側信道攻擊中無法隱藏的硬件事件及其特征,啟發研究人員探索更有效的防御方案。
通過分析攻擊流程,本文發現無論是基于沖刷的攻擊還是基于競爭的攻擊在進行探測時都需要滿足如下2 個先決條件:
(1)不可避免的驅逐操作。 攻擊者在每輪發起攻擊前需要確保被探測的緩存行已從緩存清除。 否則,受害者隨后的訪問行為會出現緩存命中事件。由于緩存狀態未發生改變,攻擊者將無法感知到受害者的行為。
(2)嚴格的攻擊頻率。 在每輪迭代中,攻擊者僅能確定目標緩存行或緩存組是否被受害者訪問,這一有限的信息量并不足以引起敏感信息泄露。 為獲得完整信息,攻擊者需要重復完成多次攻擊。 例如,在Liu 等人[2]提出的Prime + Probe 攻擊中,攻擊者實施了上萬次探測才能復原出3 072 位密鑰信息。 當需要發動多輪攻擊時,攻擊者就需要考慮攻擊頻率的問題。 一方面,攻擊間隔過長可能導致受害者在此期間發生了多次與敏感信息相關的操作,導致錯失信息。 另一方面,攻擊間隔過短會增加攻擊者的驅逐和重訪等操作與受害者的訪問行為發生沖突的可能,引入新的噪聲。 通常,現有攻擊的間隔為500~20 000 周期。
異常檢測需要選擇對攻擊程序和正常程序有良好區分度的硬件事件作為識別器。 如前所述,已有許多研究使用系統運行中的統計事件,尤其是緩存相關事件(緩存命中、缺失數量[9]等)識別側信道攻擊。然而,攻擊者可能會優化攻擊,避免上述指標出現異常。 在側信道攻擊的3 步流程中,攻擊者會參與其中的第一和第三步。 本節將從中挖掘基于沖刷和基于競爭的攻擊存在的共性特征。 具體論述如下。
(1)基于沖刷的攻擊。 基于沖刷的攻擊的緩存事件集中在重訪操作。 由于受害者行為的差異,攻擊者的重訪操作必然會導致一次緩存命中或缺失。
(2)基于競爭的攻擊。 基于競爭的攻擊的緩存事件集中在驅逐操作。 本節將在LRU (Least Recently Used)替換策略下進行分析。 對于其他類型的緩存替換策略,已有研究證明相應策略將會在特殊的攻擊手段下退化為LRU[8]。
假定e1e2e3...ew是目標緩存組的驅逐集而v是目標緩存行。 在開啟下一輪探測前,假定緩存組存儲的元素分別是e1e2e3...ew-1v,該存儲順序同時也代表了LRU 狀態,即發生緩存替換時,下一個被移除的元素是e1。 在驅逐階段,攻擊者迭代訪問整個驅逐集以確保目標地址v被移除。 盡管訪問驅逐集的順序不會改變驅逐的效果但會影響微架構的統計信息。 如果訪問序列是e1e2e3...ew,這會導致w -1 次緩存命中和一次緩存缺失。 翻轉訪問順序則會帶來w次訪問缺失。
從上述分析可以發現,攻擊行為必然會導致緩存命中或缺失事件,并由于嚴格的攻擊頻率使得出現次數急劇增加。 但是,單獨的緩存命中或缺失事件無法完全覆蓋攻擊者的行為。 此外,攻擊者還可以引入無關的訪存操作動態改變缺失率和命中率。
盡管攻擊者有可能影響緩存命中和缺失的數量,但緩存訪問量(緩存命中和缺失事件總和)是其無法隱藏的特征。 由于物理地址到緩存的映射關系固定,目標地址每次都會落入到同一個緩存組,這也使得這些訪問量必然集中在對應的緩存組。 因此,本文建議使用末級緩存組訪問量作為異常檢測的關鍵指標。
本節在時鐘精準的全系統模擬器gem5 中統計了SPEC CPU2006 基準程序和2 類跨核緩存攻擊在末級緩存組的訪問量。 該模擬器配置了一個使用3層包含緩存和x86 指令集的系統。 其中,一級緩存和二級緩存為每個核私有,邏輯共享的末級緩存在物理上劃分為與核數相等的分片。 表1 列出了詳細的參數配置。

表1 參數配置Tab.1 Parameter configurations
本節使用reference 輸入運行SPEC 測試集。 對于每個程序,gem5 采樣其有代表性的十億條指令,并統計末級緩存組的訪問量。
本節還構建了Flush+Reload 和Prime+Probe,并統計攻擊行為下各緩存組訪問量。 上述攻擊會以20 000周期為間隔從square-and-multiply 算法中竊取密鑰。 其中,Flush+Reload 攻擊依據圖1 所述流程監控目標緩存行;Prime+Probe 攻擊依據圖2 所述流程監控目標緩存組。
圖3 統計了測試集和攻擊程序每百萬周期中末級緩存組平均出現的訪問量。 目標緩存組在Prime+Probe 和Flush+Reload 攻擊中分別會出現約403.1和73.2 次訪問操作。 在相同攻擊頻率下,以Prime +Probe 為代表的基于競爭的攻擊會帶來更顯著的訪問量。 這一現象主要由于基于競爭的攻擊在驅逐階段需要利用緩存組沖突和替換策略清除目標緩存行。 此外,由于攻擊行為僅聚焦目標緩存組,因此其他組的訪問量趨向0。

圖3 每百萬周期末級緩存組(300~350)訪問量Fig.3 Access count per one million cycles for last level cache sets(300~350)
測試集程序則不存在這種異常現象,且在每個緩存組的平均訪問量都小于30。 其中,zeusmp 在所有測試集中緩存組訪問量最多,約為28.06。 Prime+ Probe 和Flush + Reload 的訪問量分別是該值的14.37 倍和2.61 倍。 因此,末級緩存組訪問量是一種對惡意程序和常規程序具有良好區分度的評價指標,可以用于識別側信道攻擊。
本文指出當前基于硬件事件的緩存側信道攻擊檢測機制并未考慮攻擊者隱藏特征時的準確度。 本文發現側信道攻擊需要保證每輪的驅逐操作和嚴格的攻擊頻率,而這兩個約束條件會導致目標緩存組的訪問量不可避免地增加。 實驗結果表明側信道攻擊至少會產生相當于SPEC 基準程序2.61 倍的緩存組訪問量。 這說明緩存組訪問量是一種對惡意程序和常規程序具有良好區分度的評價指標。 在后續工作中,本研究將探索利用該指標檢測和防御側信道攻擊的方案。