李沛南
(中國科學院信息工程研究所信息安全國家重點實驗室,北京 100093;中國科學院大學網(wǎng)絡空間安全學院,北京 100049)
隨著大數(shù)據(jù)時代的到來,5G、云平臺等技術日趨成熟,人們生活中記錄的文件、音頻、視頻可以在網(wǎng)絡上高速傳播,并能使用云平臺技術存儲、分享。但隨著計算機系統(tǒng)日趨復雜,軟硬件技術日益繁多,近些年,越來越多的安全漏洞被披露。2011—2020 年新披露CVE 漏洞的數(shù)量統(tǒng)計如圖1 所示,2020 年新披露的漏洞已接近10 年前的6 倍。更重要的是,除了軟件上發(fā)現(xiàn)的漏洞外,硬件本身也被披露存在著大量的安全隱患。軟件漏洞可以通過加補丁等方法進行修復,但硬件上的缺陷卻無法在短時間內有效地根除。這些問題都來源于在傳統(tǒng)的系統(tǒng)設計中,不論是硬件還是軟件,都是一味地追求性能而忽略了安全性。因此,分析現(xiàn)有漏洞,歸納漏洞本質,并在下一代系統(tǒng)設計伊始便將安全性作為重要的考慮因素。
圖1 2011—2020 年新披露CVE 漏洞的數(shù)量
在實際的攻擊中,攻擊者通常需要首先確定攻擊的目標,再針對性地構造攻擊。典型的攻擊場景包括以下幾個。
攻擊者可以通過腳本注入等方法與受害者程序在同一核內運行。這樣一來,攻擊者可以通過改變受害者的執(zhí)行流,將信息傳遞給攻擊者,或者直接惡意讀取受害者的數(shù)據(jù),進行攻擊。當處理器核支持同時多線程(Simultaneous multithreading,SMT)機制時,攻擊者甚至可以觀察另一個硬件線程中正在運行的受害者程序,并獲得敏感信息。
多核間也存在各種各樣共享的軟件或者硬件資源,攻擊者通過分析這些共享資源的變化,則可以獲得其他核上受害者程序當前的運行狀態(tài)或敏感數(shù)據(jù)。
通常情況下,處理器需要與網(wǎng)絡上的其他設備進行通信,例如瀏覽網(wǎng)頁時需要向網(wǎng)頁服務器發(fā)起請求并響應。在此過程中,攻擊者有機會通過執(zhí)行惡意代碼劫持服務程序,或者通過分析服務器的響應速度進而推出敏感信息。
盡管最新的處理器中提出了安全執(zhí)行環(huán)境,例如Intel的 SGX(Software Guard Extension)機制、ARM 的 TrustZone機制。處理器會將機密程序部署在安全執(zhí)行環(huán)境中執(zhí)行,而其他非安全的程序在非安全模式下運行。但SGX 與TrustZone 機制都是基于現(xiàn)有的共享硬件資源進行設計,攻擊者依然有機會通過觀察資源的變化進而獲得敏感信息。
在這些場景下,多種多樣的信息都有可能成為攻擊者的竊取目標,例如處理器中的AES 加密秘鑰、SGX 機制中驗證秘鑰、其他用戶程序的數(shù)據(jù)、操作系統(tǒng)中虛擬地址到物理地址的映射關系、虛擬機管理程序中存放的其他虛擬機信息、瀏覽器中其他頁面信息等。
由于大量的程序在最初設計時并未考慮安全性,這使得攻擊者在分析源碼后,可以利用潛在的漏洞來竊取信息。依據(jù)攻擊過程中采用的方法,典型的軟件漏洞攻擊可以分為兩大類,分別如下。
2.1.1 控制流劫持
在程序中,依據(jù)執(zhí)行狀態(tài)變換控制流的操作十分普遍。然而由于缺乏程序執(zhí)行過程中指令地址存儲與程序數(shù)據(jù)空間,因此,不論是前向的跳轉、調用指令,還是后向的返回指令[1],攻擊者有機會通過改變其目標地址從而劫持受害者程序的執(zhí)行流。具體的方法靈活多樣,攻擊者可以通過輸入?yún)?shù),強行覆蓋軟件棧空間的數(shù)據(jù),進而保證在程序跳轉時,執(zhí)行到特定的代碼片段,進而導致信息泄露。
2.1.2 釋放后使用(Use After Free,UAF)
除了與受害者程序交互,惡意劫持控制流外,攻擊者還可以在其他進程內獲取敏感數(shù)據(jù)。這是因為程序在分配或者釋放空間時,對應的內容并不會被初始化,而殘留著之前程序的數(shù)據(jù)。因此,當受害者程序執(zhí)行后,殘留的敏感信息可能被后續(xù)程序執(zhí)行時訪問到。這種攻擊被廣泛使用于實際的攻擊場景中。
自2018 年推測執(zhí)行漏洞的披露,揭示了現(xiàn)有商用處理器中最核心的性能優(yōu)化技術——推測執(zhí)行存在著嚴重的安全隱患,也說明了傳統(tǒng)的以性能優(yōu)先的設計方案缺乏嚴謹?shù)陌踩苑治?。處理器中存在的安全問題也被廣泛關注。除了在設計過程中隱含的可疑“后門”外,芯片本身的特性也可能成為攻擊者的目標。通過探針監(jiān)聽、電磁或功耗分析等物理方法,攻擊者可以觀測到處理器中的當前運行信息,進而獲得敏感信息。這些攻擊需要額外的硬件支持,攻擊者還可以利用其他漏洞,采用軟件方法即可觀測到敏感信息。本節(jié)主要討論這一類攻擊。
2.2.1 緩存?zhèn)刃诺拦?/p>
高速緩存(Cache)減小了CPU 處理數(shù)據(jù)與內存之間數(shù)據(jù)供給不足的剪刀差??紤]到實現(xiàn)的復雜性和硬件開銷,緩存設計為多級結構。小尺寸的高級別高速緩存放置在靠近CPU 的位置,大尺寸的低級高速緩存放置在遠離CPU 的位置。替換策略利用了空間和時間上的局部性,并幫助經(jīng)常訪問的高速緩存行始終命中高級高速緩存,從而確保加載這些數(shù)據(jù)僅花費最少的周期。盡管不經(jīng)常訪問的低級緩存數(shù)據(jù)加載需要相對更多的周期。通過測量訪問時間,對手可以推斷出相應數(shù)據(jù)來自哪個級別的緩存。通過進一步分析,攻擊者可以推出敏感信息。現(xiàn)有的緩存?zhèn)刃诺拦粢呀?jīng)有多種方法,包括 Flush+Reload[2]、Prime+Probe 等。
2.2.2 分支預測器側信道攻擊
通常,程序并不是線性地按指令序列執(zhí)行,而是通過許多分支、跳轉、返回指令來控制程序的方向。處理器引入分支預測單元(Branch Predictor Unit,BPU),包括分支目標緩沖區(qū)(Branch Target Buffer,BTB)、模式歷史表(Pattern History Table,PHT)和返回地址堆棧(Return Address Stack,RAS),以記錄分支指令的執(zhí)行歷史,并預測執(zhí)行目標。然而,這些預測歷史表由所有程序共享,因此程序執(zhí)行時可以感知到之前的運行歷史。依據(jù)表中的歷史信息,攻擊者可以分析出敏感信息。目前,BranchScope[3]、Branch Shadowing證明了PHT 以及BTB 都存在信息泄露的風險。
2.2.3 端口競爭側信道攻擊
處理器流水線中通常采用大量的執(zhí)行單元以增大指令并行執(zhí)行能力,所有程序對執(zhí)行單元共享。但資源數(shù)有限,攻擊者通過頻繁占用特定的資源可以觀測到其他程序是否有使用對應的資源,進而分析出其他程序的執(zhí)行狀態(tài)與敏感信息。
2.2.4 推測執(zhí)行攻擊
基于前面的三種側信道攻擊可以發(fā)現(xiàn),攻擊者可以通過觀察微體系結構狀態(tài)的差別,進而分析出敏感信息。對于現(xiàn)有的推測執(zhí)行技術,包括分支預測、亂序執(zhí)行、前遞技術,在發(fā)現(xiàn)錯誤預測后,僅僅會將對體系結構狀態(tài)有影響的功能單元進行恢復,但考慮到硬件實現(xiàn)的復雜度和性能問題,對不影響程序正確性的微體系結構狀態(tài)并不會被恢復。因此,攻擊者通過控制受害者程序的推測執(zhí)行指令,訪問敏感信息,并依據(jù)敏感信息改變微體系結構的狀態(tài)。之后,通過側信道的方法,可以獲得敏感信息。目前,采用該方法,攻擊者通過 Spectre[4]、SMoTherSpectre、SpectrePrime、SgxPectre、NetSpectre 等攻擊均證明了單核內、核間、安全執(zhí)行環(huán)境、網(wǎng)絡上都存在信息泄露的可能。
除以上幾種方式之外,還有諸多其他微體系結構狀態(tài)的改變也可以被攻擊者,例如預取器、電壓控制模塊、電容模塊的變化都有可能被攻擊者用來構造攻擊。
軟件漏洞的本質是由于缺乏安全保障來防止攻擊者惡意攻擊但并未觸發(fā)錯誤的讀寫操作。針對這一問題,可以通過為編譯器和操作系統(tǒng)中添加補丁,在程序編譯階段,動態(tài)地識別潛在的安全風險,并在程序內添加嚴格的判斷屏蔽非法讀寫操作或保證在分配空間過程中無法獲取之前的數(shù)據(jù)。
僅采用軟件方法或許無法準確地屏蔽所有安全隱患,引入硬件支持也是一種有效的方法。通過添加額外的硬件機制,在程序執(zhí)行過程中動態(tài)地識別控制流地址,防止攻擊者惡意讀寫該區(qū)域;對于釋放后使用的攻擊,可通過硬件識別內存分配、釋放的過程,通過添加標簽,進而避免后續(xù)程序獲得之前程序的敏感數(shù)據(jù)。
針對芯片架構中的安全隱患,需通過隔離攻擊者與受害者程序,或者干擾攻擊者觀察微體系結構狀態(tài)的改變。主要有以下幾種方法。
禁用特定模塊:針對安全隱患,禁用有風險的模塊是最直接的方法,但是已有的硬件模塊大都是對處理器性能有顯著提升的功能。例如禁用緩存后,處理器性能與內存吞吐量之間的“剪刀差”又凸顯,處理器性能將大打折扣。
隔離:通過軟件或硬件的方法將攻擊者與受害者隔離,防止他們共享硬件或者軟件資源。這樣一來,攻擊者將無法直接讀取受害者的數(shù)據(jù),無法影響受害者的執(zhí)行流程,也無法觀察共享資源的變化而推出敏感信息。例如,針對熔斷漏洞,通過隔離用戶態(tài)與內核態(tài)的程序,可以防止惡意用戶直接竊取內核信息。
隨機:現(xiàn)有的硬件漏洞中,攻擊者之所以能從微體系結構狀態(tài)的變化分析出敏感信息內容,是因為其微體系結構狀態(tài)的變化方式固定,且每一個狀態(tài)本身對應特定的敏感信息。對此,一方面可以通過隨機緩存結構狀態(tài)的變化方式,另一方面可以使微體系結構狀態(tài)與敏感信息本身之間的對應關系隨機變化,以解決此問題。隨機從本質上講是一種輕量的隔離方法。例如,通過隨機化緩存地址與緩存行之間的映射關系,攻擊者便無法通過分析敏感數(shù)據(jù)是否在緩存中,繼而分析出對應的地址信息。
降低攻擊者分析能力:在攻擊過程中,需要借助特定的方法進行觀察。比如在絕大部分的緩存?zhèn)刃诺琅c推測執(zhí)行攻擊中,攻擊者往往通過微體系結構狀態(tài)改變導致的時間差進而分析出隱含的敏感信息。因此,可以直接削減用戶程序獲得時間的精度,使得攻擊者無法從時間差中獲得有效的信息。
針對攻擊特征制定特定方案:除以上幾種方法外,攻擊者還可以通過依據(jù)不同的攻擊特征,指定不同的防御方法。例如針對推測執(zhí)行側信道攻擊,可以防止推測執(zhí)行過程中對于微體系結構狀態(tài)的改變,從而避免信息泄露。針對分支預測器目標地址被惡意訓練的攻擊,可以通過將跳轉分支轉化為其他指令,從而直接避免受害者程序被惡意誘導。針對預取器固定預取規(guī)則分析出敏感信息的特征,可以引入隨機預取方案,避免攻擊者從中分析出受害者的訪問規(guī)律。
本小節(jié)以后向控制流劫持以及推測執(zhí)行攻擊為例,分別講述防御策略在真實防御機制中的應用。
為防止攻擊者通過數(shù)組越界直接更改后向返回的目標地址,可以通過編譯器在數(shù)組訪問過程中進行邊界檢查,這一 功 能 已 實 現(xiàn) 在 Intel 的 MPX ( Memory Protection Extensions)機制中。這種方法會在程序執(zhí)行時引入較多的地址比較,從而導致性能的下降。因此,可以通過引入單獨的硬件模塊,對真正的跳轉地址進行存儲,防止該地址被惡意篡改,保證程序控制流的完整性[5]。
推測執(zhí)行攻擊的步驟為:①攻擊者誘使受害者推測執(zhí)行特定的代碼片段;②在推測執(zhí)行過程中首先訪問敏感數(shù)據(jù);③依據(jù)敏感數(shù)據(jù),改變微體系結構的狀態(tài);④通過側信道的方法從微體系結構狀態(tài)的變化中分析出敏感信息。
針對推測執(zhí)行攻擊的步驟,分別列出以下防御目標:①防止惡意訓練并堵塞可疑的推測執(zhí)行;②隔離敏感數(shù)據(jù);③防止推測執(zhí)行改變微體系結構狀態(tài);④防止攻擊者從微體系結構改變中分析出敏感信息。針對這四種防御目標,可以提出不同的防御方案。
防止惡意訓練并堵塞可疑的推測執(zhí)行:針對幽靈漏洞中攻擊者惡意訓練分支預測器現(xiàn)象,可以設計為不同的程序分配不同的分支預測器資源,進而進行隔離。但這種方法會導致較大的硬件開銷,因此通過引入隨機的方式更新分支預測器,也可以達到輕量隔離的效果。堵塞可疑的推測執(zhí)行可以通過在推測執(zhí)行前插入FENCE 指令,這種方法本質上為禁用推測執(zhí)行,這會帶來較大的性能開銷,使用性不強。
隔離敏感數(shù)據(jù):通過隔離用戶空間與內核空間、隔離瀏覽器中不同的頁面,可以避免攻擊者在推測執(zhí)行過程中訪問到本不該訪問的敏感數(shù)據(jù)。除此之外,還可以通過軟件方法,標注對應的敏感信息,并在程序執(zhí)行過程中,動態(tài)地隨機化敏感信息的內存分布。這會干擾攻擊者直接訪問敏感信息。
防止推測執(zhí)行改變微體系結構狀態(tài):可以通過引入單獨的硬件或在發(fā)現(xiàn)錯誤推測執(zhí)行后回滾微體系結構狀態(tài),從而提供一種隔離機制,保證在非推測機制下無法感知推測執(zhí)行過程中改變。
防止攻擊者從微體系結構改變中分析出敏感信息:通過降低用戶獲得時間的精準度,可以降低攻擊者感知微體系結構狀態(tài)變化的能力。
除此之外,針對推測執(zhí)行攻擊,以制定的防御方案,比如禁止推測執(zhí)行過程中改變緩存狀態(tài),但不影響不改變緩存狀態(tài)指令的執(zhí)行。可以通過將分支跳轉指令轉變?yōu)槠渌噶?,進而防止攻擊者的惡意訓練。
在大數(shù)據(jù)時代的背景下,日益增多的漏洞揭示了現(xiàn)有的計算機系統(tǒng)中存在著嚴重的安全隱患,也為傳統(tǒng)的以性能優(yōu)先的處理器設計策略敲響了警鐘。人們迫切需要在下一代處理器設計伊始,便引入安全因素。本文著重分析了已知的軟硬件漏洞,并歸納總結了有效的防御策略。在此基礎上,以后向控制流劫持與推測執(zhí)行攻擊為例,分別講述了防御策略在軟硬件漏洞中的應用,并分析各方法的缺陷及優(yōu)勢。通過結合多種防御方法,未來的處理器可以在保證安全性的前提下,提升性能并降低硬件開銷。