張經宇
?
CPU漏洞熔斷、幽靈原理、風險與應對措施
張經宇1,2
1.中國移動通信集團有限公司,北京 100033 2.天津大學微電子學院,天津 300072
分析了Intel、AMD和ARM等CPU芯片存在熔斷、幽靈系列等安全漏洞的技術背景、漏洞原理、風險及影響,提出了應對措施和修復方法。
CPU;安全漏洞;熔斷;幽靈
旁路攻擊是一種從電子系統(tǒng)物理實現(xiàn)過程中獲得信息的攻擊方式。電子設備在計算過程中除了輸出正常結果外,通常會有其他可觀察的特征。其中運行時間、功率消耗、電磁泄漏甚至聲音都可以作為信息源,用來進一步進行系統(tǒng)破解。對于個人電腦、手機等,由于可執(zhí)行未知來源的程序,它的旁路攻擊手段可以不需要外部測量設備,主要針對緩存時間、分支預測歷史、分支目標緩沖器等,還有裝載錯誤攻擊來改變物理內存和CPU的值。
現(xiàn)代CPU的線程之間共享緩存,意味著內核數(shù)據和不同程序的數(shù)據混合放在一起,只有在計算結果提交時才會檢查權限。這就會為不同線程間竊取數(shù)據留下隱患,常見的高速緩存隱蔽通道竊取數(shù)據方式有Flush+Reload和Evict+Reload[1]。
為了提高CPU執(zhí)行效率,亂序執(zhí)行被引入。在傳統(tǒng)的順序執(zhí)行架構中,指令嚴格按照順序執(zhí)行。由于存儲讀取速度低于CPU執(zhí)行速度,因此經常會出現(xiàn)CPU停下來等待數(shù)據讀取的情況,從而降低整體運行速度。如從內存中提取數(shù)據需要超過100個時鐘周期,而處理一條指令一般僅需4~5個時鐘周期,就會出現(xiàn)CPU等待的現(xiàn)象。亂序執(zhí)行可以交替執(zhí)行不同的流水線,從而節(jié)省等待時間,保證整體運行速度。預測執(zhí)行是CPU根據現(xiàn)有信息,利用空閑時間提前執(zhí)行一些將來可能會使用的指令,如果將來使用,就能大幅提高執(zhí)行速度。如果將來未用,計算結果便會廢棄,并回退到未執(zhí)行前的狀態(tài)[2]。分支預測是CPU嘗試提前猜測分支(如if-then-else結構)結果來提前執(zhí)行,可以通過多種算法提高預測準確率。
在微指令被重排序緩沖器(Reorder Buffer)排序后就會轉發(fā)到統(tǒng)一保留站。沒有統(tǒng)一保留站之前CPU每次執(zhí)行需要從寄存器中讀取數(shù)據,而現(xiàn)在可以從保留站中提前讀取操作數(shù)并保存操作結果,這樣亂序執(zhí)行的后續(xù)指令可以在第一時間獲得需要的數(shù)值。
為了實現(xiàn)進程之間的隔離,目前進程均被操作系統(tǒng)分配使用虛擬地址空間,而虛擬地址通過轉化表轉化到物理地址,轉化表中定義了映射和權限[3]。操作系統(tǒng)內核也同樣使用虛擬地址空間,但所需的讀寫權限較高,所以用戶進程無法直接訪問內核數(shù)據,只有CPU在特權模式下可以訪問內核地址空間。在將虛擬地址轉換為物理地址的同時,CPU會檢查虛擬地址的權限位,確認其訪問權限。這種安全隔離方式被認為是安全的。所以現(xiàn)在的操作系統(tǒng)都會將整個內核映射到每個用戶進程的虛擬地址空間。
2018年1月3日,國外安全研究機構Google Project?Zero公布了兩組CPU漏洞,即Meltdown(熔斷),對應漏洞CVE-2017-5754(亂序執(zhí)行緩存污染)[1]和Spectre(幽靈),對應漏洞CVE-2017-5753(邊界檢查繞過)、CVE-2017-5715(分支目標注入)[2]。
熔斷攻擊是利用亂序執(zhí)行漏洞和高速緩存旁路通道攻擊結合,繞過正常權限檢查,讓未授權進程讀取到其他正在運行進程地址空間的任何數(shù)據。幽靈攻擊是利用推測執(zhí)行和微體系結構隱蔽通道的數(shù)據泄漏結合,穿透內存隔離邊界獲取機密信息。這兩種攻擊竊取數(shù)據后傳輸方式均通過高速緩存Flush+Reload、Evict+Reload,但兩種攻擊的竊取方式不同[3]。
熔斷利用了亂序執(zhí)行,使用了非法內存訪問和引發(fā)異常之間的時間窗口執(zhí)行指令。攻擊包括三個步驟:攻擊者選擇的內存地址(但無法訪問到)被加載到寄存器里;瞬態(tài)指令根據寄存器內容將探測陣列內容加載至高速緩存中;攻擊者使用Flush+Reload來確定被訪問的探測陣列行數(shù),從而確定所選內存地址的內容,如圖1所示。
圖1 熔斷的核心代碼
圖1中,rcx內存儲的是要訪問的核心內存地址,rbx是一個256*4? 096(28*212)的探測陣列,2的8次方源于1? byte=8? bit,4? 096源于一個內存塊是4? kB,從而避免CPU預讀取附近內存內容,混淆被讀取地址的真實內容。
當執(zhí)行第四條指令時,CPU對其做權限檢查,并發(fā)現(xiàn)用戶級權限無法訪問核心地址從而觸發(fā)異常。但由于亂序執(zhí)行的緣故,第五、六、七條指令已經在第四條指令從內存讀取數(shù)據期間執(zhí)行了。第五條指令是指將讀取的數(shù)據乘以4? 096,而第七條指令是指根據讀取的數(shù)據內容,將探測陣列該行數(shù)的內容加載到寄存器里(期間也會加載到高速緩存里)。由于使用了前文所述的統(tǒng)一保留站,在CPU讀取數(shù)據的第一時間(還沒有進行權限確認時),數(shù)據就已經被后續(xù)指令讀取。雖然在權限確認后這些指令帶來的所有操作狀態(tài)改變已全部恢復,管線清空,但由于高速緩存沒有被清空,其中的部分探測陣列還在,就為下一步的Flush+Reload提供了便利。
Flush+Reload的原理為:逐行讀取探測陣列(256行,4? 096列)并對讀取用時計時。由于攻擊代碼之前已經讀取過一行內容,可以發(fā)現(xiàn)相比其他行,該行的內容讀取用時特別短。該行的行數(shù),就是想要的內容字節(jié)。這樣的過程重復多次,即可將全部需要的內容逐個字節(jié)地讀取出來。
假設需要讀取的內容是“123456789”,需要通過熔斷攻擊方式探測出來。第一個字節(jié)內容是“1”,根據ASCII碼表對應49,那么核心攻擊代碼的第七條指令就會把探測矩陣的第49行內容讀取到高速緩存中,在后期Flush+Reload過程中,第49行也會讀取得特別快,從而識別到該字節(jié)內容是“1”,然后將要訪問的內存地址加一后讀取下一個字節(jié),從而逐個字節(jié)讀取出該內容。
幽靈5753攻擊分為三步:首先攻擊者訓練CPU的分支預測器,確保分支預測在下一次循環(huán)時順利執(zhí)行;然后把分支條件清出高速緩存,誘使CPU推測并錯誤執(zhí)行惡意代碼,從而泄露機密信息;最后通過隱蔽通道將機密信息傳輸出來。最后一步是與熔斷相同的Flush+Reload過程,不再復述[2]。
當具有分支預測的CPU遇到類似IF語句的分支條件語句時,由于判斷條件可能并不在CPU的寄存器或高速緩存中,因此為了避免等待,CPU會根據以往判斷的結果預測本次的結果。
在現(xiàn)在Intel、AMD的CPU中,分支預測機制為全局分支預測,包含兩個層次:內部是飽和計數(shù)器。只有連續(xù)選擇“真”兩次,才可以將預測方向從原有強“假”改變至“真”,反之亦然。外部是全局預測歷史寄存器,包含了分支結果歷史、不同分支之間的關聯(lián)關系(當分支0、1是真時,分支2是假)等。這意味著訓練分支預測器需要比2次更多的次數(shù),才可以確保分支預測選擇“真”,保證攻擊程序持續(xù)讀取機密信息。在幽靈的原理驗證代碼中,訓練次數(shù)為5次。
圖2 幽靈的核心代碼
在幽靈的核心代碼(見圖2)中,array1是某一長度較短的數(shù)組,array1_size是array1的長度,array2是探測數(shù)組,數(shù)組長度256*512,用途和熔斷基本相同。幽靈為了讀取機密,需要將array1[x]指向機密字節(jié)的地址,即x=機密字節(jié)地址-array1的開始地址。但這超出了array1的邊界,在正常的代碼執(zhí)行會觸發(fā)異常,機密讀取不到,所以需要繞過邊界檢查。核心代碼就是為了這個目的編寫,繞過邊界檢查需要:
(2)array1_size和array2不在CPU的高速緩存中,而秘密字節(jié)內容被緩存。
高速緩存的要求可以通過大量讀取不相干的內存數(shù)據來沖洗,或者在X86中使用CLFLUSH指令,清除包含指定信息的緩存線。
核心代碼執(zhí)行時,CPU會先將x與array1_size進行對比,由于array1_size不在高速緩存中,需要從內存中提取,用時較長。CPU會根據訓練結果假定該判斷條件為真,讀取秘密字節(jié)內容并計算array1[x]*256,將array2[array1[x]*256]的內容讀取到高速緩存中。此時array1_size被讀取到,發(fā)現(xiàn)判斷預測錯誤,CPU就將CPU狀態(tài)回置,寄存器相應內容清空,但是高速緩存中仍然保留了array2[array1[x]*256]的內容,再通過第三步的Flush-Reload即可讀出機密字節(jié)。
經過各方的測試,熔斷、幽靈攻擊影響到1995年以后Intel生產的CPU、除Cortex-M型號之外的ARM及部分AMDCPU芯片。使用上述處理器的各類操作系統(tǒng)和云計算平臺均受影響,廣泛涉及目前大部分的PC、手機、平板電腦等。其中公有云平臺由于存在多個租戶共用一臺宿主機的情況,虛機到虛機、虛機到主機是漏洞攻擊的薄弱點,需要盡快完成升級補丁。
由于熔斷、幽靈漏洞的攻擊目的均為竊取機密數(shù)據,所以未對任何系統(tǒng)的正常運行造成較大影響(實施攻擊時會導致短時CPU利用率飆高,但并沒有長期影響)。
主要通過內核頁表隔離(KPTI)來防護熔斷漏洞,KPTI可以不再映射內核內存至用戶進程空間,從而杜絕了竊取內核數(shù)據的可能性。目前可以通過操作系統(tǒng)內核補丁程序修復。
幽靈變體1(CVE-2017-5753):主要通過靜態(tài)分析來防護,一旦系統(tǒng)發(fā)現(xiàn)有攻擊代碼時會暫停CPU分支預測功能,從而防止竊取數(shù)據。目前也可以通過操作系統(tǒng)內核補丁程序修復,由于漏洞可以通過網頁瀏覽器的JavaScript執(zhí)行,系統(tǒng)內核補丁會加強瀏覽器防護。
幽靈變體2(CVE-2017-5715):由于該漏洞允許虛擬機非法讀取宿主機數(shù)據,修補最為復雜。Google提供了用Retpoline分支代替間接分支的軟件防護方法,但需要將全部涉及代碼重新編碼編譯,工作量巨大故不常被使用。而Intel在新的微碼中提供了間接分支限制預測(IBRS)、單線程間接分支預測器(STIBP)、間接分支預測器屏障(IBPB)三個硬件防護方式??梢酝ㄟ^強制刷新分支預測緩存、禁用單CPU中多個同級線程互相影響分支預測的情況。這些硬件防護手段雖然帶來約20%性能損失,但由于簡單易行,被各大廠商廣泛使用[4]。
對于云環(huán)境中需要升級物理CPU的微碼、安裝虛擬機操作系統(tǒng)、虛擬化層的操作系統(tǒng)的安全補丁,物理機里也需要升級CPU微碼及安裝操作系統(tǒng)補丁。目前Intel、AMD已經向主流PC廠家提供了微碼修補程序,用戶通過下載升級最新的BIOS就可以完成升級微碼工作。即使硬件廠家暫時沒有推出的BIOS升級包,根據微軟的官方說明,通過將虛擬機與宿主機操作系統(tǒng)使用的CPU物理核之間進行強行隔離以及虛擬機之間的物理核獨占分配,也可以對5715漏洞做到有效防護[5]。
目前的熔斷、幽靈的安全補丁都不同程度地造成系統(tǒng)性能下降及其他穩(wěn)定性問題。根據Intel的官方說明,在舊CPU上的變體2相關BIOS升級可能導致意外重啟及系統(tǒng)穩(wěn)定性問題,建議在充分測試確認影響可接受后再全面升級[6]。
近幾年來,雖然各種安全漏洞層出不窮,但像熔斷、幽靈漏洞這樣從根本上挑戰(zhàn)現(xiàn)有芯片結構和運行方式的還是非常罕見的。因此,需要從根本上改變芯片及軟件的設計思想,在進一步挖掘芯片制式、結構、算法潛力的同時,安全問題不容忽視。同時,由于目前的安全補丁均導致性能下降,短期內對云平臺及用戶不可避免地會造成影響。安全與性能之間的平衡與取舍,值得每個IT、通信從業(yè)者思考。
[1] Moritz Lipp,Michael Schwarz,Daniel Gruss,Thomas Prescher,Werner Haas,Stefan Mangard,Paul Kocher,Daniel Genkin,Yuval Yarom,Mike Hamburg. Meltdown[J]. Unpublished,2018.
[2] Paul Kocher,Daniel Genkin,Daniel Gruss,Werner Haas,Mike Hamburg,Moritz Lipp,Stefan Mangard,Thomas Prescher,Michael Schwarz,Yuval Yarom. Spectre Attacks:Exploiting Speculative Execution[J]. Unpublished,2018.
[3]Jann Horn. Project Zero. Reading privileged memory with a side-channel[J/OL]. https://googleprojectzero. blogspot.com/2018/01/reading-privileged-memory-with-side. html.
[4]Leslie Culbertson.Addressing New Research for Side-Channel Analysis[J/OL].https://newsroom.intel. com/editorials/addressing-new-research-for-side-channel-analysis/.
[5] Justin Hall. Alternative protection for Windows Server 2016 Hyper-V Hosts against the speculative execution side-channel vulnerabilities[J/OL].https://docs.microsoft. com/en-us/virtualization/hyper-v-on-windows/cve-2017-5715-and-hyper-v-hosts.
[6] Microsoft. Windows Server guidance to protect against speculative execution side-channel vulnerabilities[J/OL]. https://support.microsoft.com/en- us/help/4072698/windows-server-guidance-to-protect-against-the-speculative-execution.
The Principle Risks and Mitigation of CPU Vulnerabilities Meltdown and Spectre
Zhang Jingyu1、2
1.China Mobile Communication Group Co., Ltd., Beijing 100033 2.School of Microelectronics,Tianjin University, Tianjin 300072
The technical background, principle of vulnerabilities, risks and the impact of the security vulnerability Meltdown and Spectre, which could attack Intel, AMD and ARM CPU, is analyzed. The countermeasures and mitigation options are proposed.
CPU; security vulnerability; Meltdown; Spectre
TP309
A
張經宇(1988—),山西忻州人,工程師,在讀博士,主要從事信息與通信工程領域的研究與維護維修工作。