Towards Reinforcement Learning for Exploration of Speculative Execution Vulnerabilities
強化學習探索投機執行漏洞
https://arxiv.org/pdf/2502.16756
摘要
像Spectre這樣的推測執行攻擊可以用來繞過安全隔離機制,竊取其他程序的信息。在現有的處理器上探索推測執行攻擊需要大量的手動逆向工程工作以及對處理器內部機制的深入了解。這種基于逆向工程的方法需要大量的人工投入,速度慢且不具備可擴展性。本文中,我們介紹了SpecRL,這是一個利用強化學習來探索商用現成微處理器中推測執行泄漏問題的框架。相比傳統方法,這種基于強化學習代理的方式所需逆向工程的工作量更少,同時仍能識別推測執行漏洞。與現有的模糊測試方法[1]相比,在程序規模較大時,我們的方法耗時更短。
關鍵詞—Spectre,推測執行,強化學習,側信道攻擊,分支預測
I 引言與背景
推測執行是一項在許多現代亂序處理器的微架構中實現的強大技術,用于提升性能。通過推測性地執行指令而不是停頓,處理器流水線中可以執行更多的指令,從而提高了指令級并行性。推測執行帶來的性能優勢的一個例子體現在條件分支上。
在條件分支中,緊跟在條件分支之后的指令只有在該條件分支被解析之后才能確定。對于順序流水線處理器來說,此時處理器必須停頓,這對性能是一個很大的影響。相反,亂序處理器通過預測條件分支的結果,推測性地執行后續的指令,在等待條件分支解析的同時完成其他工作。如果預測的路徑是錯誤的,處理器會清空流水線,并開始執行正確的路徑。在錯誤預測路徑上執行的指令被稱為瞬態指令(transient instructions),它們的執行過程稱為瞬態執行(transient execution)。
雖然推測執行和分支預測提升了處理器性能,但也帶來了關鍵的安全漏洞。瞬態執行的指令可能會訪問受保護內存中的敏感信息,造成意外的數據泄露。從指令集架構(ISA)層面的抽象來看,這種行為是合法的,因為瞬態執行不會在架構狀態中留下痕跡。然而,從處理器的微架構視角來看,瞬態執行會在微架構狀態的不同部分留下痕跡,因此可以通過各種微架構側信道(microarchitectural side channels)將這些信息泄露出去。這一漏洞最著名的攻擊形式就是2018年提出的Spectre(幽靈)攻擊。
識別推測執行漏洞:推測執行泄漏漏洞的識別可以在芯片制造前(pre-silicon)或制造后(post-silicon)進行。
在芯片制造前的識別階段 [3]–[5],漏洞識別相對直接,因為檢測工具處理的是處理器的RTL(寄存器傳輸級)描述,擁有對整個微架構狀態的完整知識和控制權。
而在芯片制造后的識別階段 [1],漏洞識別則復雜得多,因為沒有直接方法可以判斷是否發生了推測性泄漏。Guarnieri 等人 [6] 提出了硬件-軟件契約(hardware-software contract)的方法,通過關系測試來檢測黑盒處理器中的推測性泄漏。下面是對使用契約定義的推測性泄漏的簡要說明。
現有方法
Spectre [2] 漏洞是在對處理器行為進行大量逆向工程之后手動發現的。這種識別漏洞的方法是一個緩慢且成本高昂的過程,因為它要求研究人員對特定處理器的指令集架構(ISA)和微架構都有深入而全面的理解。
自那以后,人們開發出了用于在芯片制造前(pre-silicon)和制造后(post-silicon)階段自動搜索推測性泄漏的工具。本文我們主要關注芯片制造后的漏洞探測階段。現有的芯片后階段檢測方法,如 Revizor [1] 或 Medusa [7],依賴于**基于模糊測試(fuzzing-based)**的方式來生成測試用例。
然而,這些方法受限于巨大的搜索空間以及許多推測性泄漏所具有的順序性特征。這是因為模糊器通常是一次性生成測試用例,導致其效率隨著程序規模的增長呈指數級下降。
本文工作
我們提出了SpecRL,這是一種利用強化學習(Reinforcement Learning, RL)探索推測執行漏洞的新方法。近年來,強化學習已被廣泛應用于計算機科學與安全領域的各類問題中。
與依賴專家知識的傳統經驗方法不同,基于學習的方法通常只需要數據和訓練。只要有足夠的數據和計算能力,它就可以基于經驗知識實現超越人類的表現,這一點在 Google DeepMind 于 2017 年的研究成果中得到了驗證 [8]。
對于那些我們可以在實際處理器上復現的推測執行漏洞來說,使用強化學習相較于監督學習的優勢在于:它可以無需大量標注數據集,因為強化學習通過直接運行處理器來自行生成訓練數據。
此外,強化學習具有天然的時序建模能力,在尋找更復雜的推測性泄漏時,相比于模糊測試方法也可能具有更好的表現。
正因如此,我們認為強化學習是一種探索推測執行漏洞的極具潛力的解決方案。
II. 強化學習建模
強化學習通常涉及智能體(agent)和環境(environment)。智能體通過執行*動作(actions)與環境進行交互,并通過觀察(observations)和獎勵(rewards)獲得反饋。
在一次“步驟”中,訓練過程遵循以下一般流程:
智能體從動作空間中選擇一個動作;
學習環境對這個動作做出響應,返回相應的觀察信息和獎勵值;
智能體利用返回的觀察信息和獎勵值在訓練過程中更新其策略(policy)。
在我們的應用場景中,每一個動作代表一條匯編指令,而智能體的目標是構建一個能夠觸發推測性契約違規(speculative contract violation)的匯編程序。
SpecRL 的環境遵循Gymnasium 標準 [9],其建模如下:
動作空間(Action Space):動作空間是一個由指令組成的向量 {i?, i?, ..., i???},長度為 n,其中 n 表示智能體可選擇的指令數量。 觀察空間(Observation Space):由于我們所處的是一個黑盒環境,處理器的微架構狀態無法直接在觀察空間中被看到。因此,我們依賴性能計數器側信道信息來幫助我們獲取關于處理器微架構狀態的有用觀察信息。
更具體地說,對于給定的指令序列,我們可以觀察到以下內容:
- HTrace :
:通過 Prime+Probe 技術實現;
- CTrace
:通過基于 QEMU 的模擬器實現;
- 分支預測錯誤次數(#ofBRMisses)
:通過性能計數器INT_MISC.RECOVERY_CYCLES實現;
- 瞬態微操作數量(#ofTranUOps)
:通過計算性能計數器UOPS.ISSUED_ANY和UOPS.RETIRED_SLOTS的差值得出。
為了找出每條新增指令所產生的影響,我們必須逐步觀察所關注的指令序列。
更正式地來說,給定一個指令序列:
為了找到每條新增指令所產生的影響,我們必須逐步觀察所關注的指令序列。
更正式地來說,給定一個指令序列:
其中m是最大指令序列長度。
獎勵函數(Reward Function):
SpecRL 的獎勵函數設計為:當智能體執行的動作能夠觸發可觀察的瞬態執行時,給予獎勵。如果發生了推測性泄漏(speculative leak),則給予非常大的獎勵;如果發生了錯誤預測(misspeculation),則給予較小但仍然可觀的獎勵;如果該錯誤預測可以通過側信道被觀察到,則給予略高于普通錯誤預測的獎勵。
如果程序沒有引發錯誤預測,或者錯誤預測不可觀察,則給予相應的負向獎勵(懲罰)。此外,在每一個步驟中還會給予一個輕微的負向獎勵,以鼓勵生成更簡潔的指令序列。
環境細節(Environment Details):
這種強化學習建模方式帶來了三個實現上的關鍵細節問題:
- 無限循環問題(Infinite Loops)
由于我們允許智能體依次添加指令,其中包括控制流指令,因此在獲取相應執行軌跡(trace)之前,我們需要檢查當前步驟是否會創建無限循環。然而,正如 Alan Turing 在其“停機問題(Halting Problem)”中指出的那樣,這個問題無法靜態判定[10]。
我們通過動態方式來規避這個問題:將帶有新增指令的程序交給一個子進程運行,測量其模擬所需時間,若子進程運行時間過長,則丟棄該指令。這種方法還確保了每個步驟的最大軌跡生成時間,避免訓練因過長的循環而停滯。
- 處理器的微架構狀態(Microarchitectural State)
obs?
(第 i 次觀察)反映了初始微架構狀態以及指令序列的影響。為了保證相同的指令序列在不同運行中能獲得相同的obs?
,我們需要確保處理器的微架構狀態一致。
微架構狀態包括分支預測器和緩存。我們在每次觀察前執行WBINVD
指令,并運行一個包含 5000 萬條條件分支的程序,從而有效地將分支預測器的模式歷史表(PHT)重置為確定性狀態,并清空緩存,使得相同程序的不同觀測之間,相關的微架構組件狀態保持一致。
- 內存訪問問題(Memory Accesses)
指令序列是在內核空間中的硬件上進行觀察的,這意味著智能體所進行的所有內存訪問都必須進行沙箱隔離(sandboxed),以防止造成內核崩潰。
訓練流程(Training Flow):
SpecRL 的訓練流程如圖 1 所示。
智能體根據其當前狀態和策略生成一個動作(即一條指令)。如果需要,該指令會首先被插樁(instrumented)或沙箱化。接著對該新指令序列進行無限循環檢測。
如果指令序列通過了無限循環檢測,那么這條新指令就會被添加到環境中的攻擊程序中。隨后,該攻擊程序會在一系列輸入下被執行,并通過以下方式進行觀察:
實際硬件(用于 HTrace、#ofBRMisses 和 #ofTranUOps)
或者通過模擬器(用于 CTrace)
這些觀察結果會被反饋給智能體,同時也會輸入到獎勵函數中,以返回一個獎勵值給智能體。智能體利用這些新的輸入來更新其策略,然后生成下一個動作,重新開始訓練流程。
III、案例研究(Case Study)
本案例研究的重點是:(1)驗證 SpecRL 是否能夠發現推測執行漏洞;(2)比較在不同程序規模下,使用 SpecRL 與現有模糊測試工具進行檢測時,檢測時間的變化趨勢。
實驗設置(Setup):
我們在 AMD Matisse 架構的 CPU(AMD Ryzen 5 3600)上實現了我們所描述的強化學習建模方式。為此,我們基于 Gymnasium 標準創建了一個名為SpecEnv的自定義環境,并使用Revizor [1]來在硬件上測試契約違規行為。隨后,我們將 SpecEnv 接入了 Ray 的 RLlib(一個用于驅動強化學習訓練的庫)中。
作為概念驗證,我們專注于利用Spectre V1 類型的漏洞,這類漏洞依賴于錯誤訓練分支預測器。我們的動作空間包括一組簡單的指令集,包含:
減法指令(SBB)
有符號乘法指令(IMUL)
條件跳轉指令(JNS)
無條件跳轉指令(JMP)
由于每條指令的操作數可以有多種選擇(寄存器、標簽等),因此智能體的動作空間總共包含40 條不同的指令。
此外,在訓練開始前,我們為測試程序隨機生成了20 組輸入數據。內存操作指令被沙箱隔離,所有讀寫操作均相對于寄存器 R14 進行。任何模擬運行時間超過1 秒的指令都會被丟棄。
我們使用 RLlib 提供的PPO(Proximal Policy Optimization)算法進行訓練,并采用其默認配置參數。
為了與當前最先進的模糊測試方法進行對比,我們也使用類似的動作空間對 Revizor 進行了測試。
對于 SpecRL 和 Revizor,程序規模從10 到 150,每次增加 10。
實驗結果(Results):
在所有程序規模下,SpecRL 平均在 7 分鐘內就能發現一個泄漏漏洞。在更大的程序規模下,SpecRL 依然能夠發現漏洞,甚至能處理長達60 條指令的序列。
如圖 2 所示,檢測時間與程序規模之間只有弱相關性,最多呈現線性增長趨勢,這與預期一致。
而相比之下,Revizor 的檢測時間隨著程序規模大致呈指數級增長,如圖 2 所示。
這是合理的,因為對于一個完全隨機的模糊器來說,發現漏洞所需的測試用例數量(與檢測時間成正比)可以用以下公式表示:
n?l+1an?1
其中:
- n 是程序規模
- a 是動作空間大小
- l是導致泄漏的指令序列長度
這些結果表明,在較大的程序規模下,SpecRL 能夠更高效地發現推測執行漏洞.
IV. 未來工作(Future Work)
未來工作中一個較為直接的方向是動作空間(action space)的擴展。當前案例研究中使用的動作空間非常有限,僅包含4 條唯一指令。然而在現實中,x86 指令集包含數百條指令。歷史上,強化學習算法在處理大規模動作空間方面一直面臨挑戰,因此將動作空間擴展到更大的指令集會帶來一系列相關難題。
此外,目前的動作空間并未賦予智能體對程序輸入的控制權。當前的輸入是隨機生成的,并在運行時通過“提升”(boosting)過程來檢測推測性泄漏。盡管這種方法有效,但“提升”過程代價高昂,因為必須先對程序進行分析以找出依賴關系。如果在動作空間中引入對輸入的控制,可能會加速訓練過程,并讓智能體更全面地感知執行環境,從而有可能完全學會如何錯誤訓練分支預測器(mistrain a branch predictor)。
然而,讓智能體控制輸入的一個潛在缺點仍然是由此帶來的巨大的動作空間膨脹問題。
未來的工作還可以探索啟用分布式訓練,這是 Ray 框架的核心優勢之一。雖然當前設置是在單臺機器上進行訓練,但利用 Ray 的分布式特性可以實現訓練過程的并行化,從而顯著加快學習速度。這將使智能體能夠更快地發現漏洞,也可能使其在合理的時間內發現更復雜的推測執行漏洞。
V.相關工作(Related Work)
Revizor [1]使用了軟硬件契約(Software-Hardware Contracts),其主要區別在于 Revizor 使用了一個帶有某些推測性過濾器的模糊測試器(fuzzer),而SpecRL 使用的是一個具有“順序決策”能力的智能體(agent)。我們認為,對于那些需要對分支預測器進行“訓練”的推測執行漏洞來說,這種方法更加直觀。正如我們所展示的那樣,Revizor 在程序規模較大時擴展性不佳,而 SpecRL 則表現良好。
AutoCAT [11]是首個探索使用強化學習進行微架構攻擊的研究,但它僅關注緩存時序攻擊(cache timing attacks),并未考慮分支預測器或微架構中的任何推測性因素。MACTA [12]則使用多智能體強化學習來實現緩存側信道的攻擊與檢測,但同樣也主要集中在緩存時序通道上,并且大多基于模擬器進行。
VI. 結論(Conclusion)
綜上所述,本文介紹了SpecRL—— 一種利用強化學習發現推測執行漏洞的新方法。我們提出了 SpecRL 的強化學習建模方式,并通過一個案例研究對其可擴展性進行了分析。
隨著推測執行漏洞的不斷演變,SpecRL 為自動化和提升微架構安全分析提供了一個極具前景的方向。
原文鏈接:https://arxiv.org/pdf/2502.16756
特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.