當前位置:
首頁 > 最新 > 原理解析:「熔斷」和「幽靈」兩兄弟為什麼讓Intel這麼煩惱

原理解析:「熔斷」和「幽靈」兩兄弟為什麼讓Intel這麼煩惱

最近爆出的CPU漏洞引起業內外人士一片嘩然,其影響之廣,危害之大相信各位都已了解。那麼下面就談一談對這兩個漏洞的理解吧。

概念:

0x00 亂序執行

在計算機工程領域,亂序執行(錯序執行,英語:out-of-order execution,簡稱OoOE或OOE)是一種應用在高性能微處理器中來利用指令周期以避免特定類型的延遲消耗的範式。在這種範式中,處理器在一個由輸入數據可用性所決定的順序中執行指令,而不是由程序的原始數據所決定。在這種方式下,可以避免因為獲取下一條程序指令所引起的處理器等待,取而代之的處理下一條可以立即執行的指令。

0x01 分支預測

分支預測器(英語:Branch predictor)是一種數字電路,在分支指令執行結束之前猜測哪一路分支將會被運行,以提高處理器的指令流水線的性能。使用分支預測器的目的,在於改善指令管線化的流程。現代使用指令管線化處理器的性能能夠提高,分支預測器對於現今的指令流水線微處理器獲得高性能是非常關鍵的技術。

0x02 數據緩存

CPU高速緩存(英語:CPU Cache,在本文中簡稱緩存)是用於減少處理器訪問內存所需平均時間的部件。在金字塔式存儲體系中它位於自頂向下的第二層,僅次於CPU寄存器。其容量遠小於內存,但速度卻可以接近處理器的頻率。當處理器發出內存訪問請求時,會先查看緩存內是否有請求數據。如果存在(命中),則不經訪問內存直接返回該數據;如果不存在(失效),則要先把內存中的相應數據載入緩存,再將其返回處理器。

幽靈(spectre)

上邊提到cpu在執行指令的時候會進行分支預測,簡單來說,就是cpu在執行一個邏輯判斷的時候會進行提前預測改走哪個邏輯,然後選擇其中它正確的邏輯,並將其所需要的數據加入緩存中。

這樣,我們看一個例子。

一般來說,如果data[untrusted_opffset_from_caller]越界,程序就會失敗。但是cpu有一個預測執行的特性,如果arr1->length不在緩存之中,並且之前這個邏輯多次進入的情況下,cpu就判斷if語句是真的,然後先將下一步指令所需要的內存存儲到緩存之中(此時不對訪問數據是否允許進行判斷)。假如發現預測錯誤,然後回滾指令就可以了。但是這時,cpu緩存並沒有清空,而spectre正是利用了這一點來獲取非法內存的內容的。

1)spectre構造一個訓練集,使cpu不斷地進入以下的邏輯。此時這是一個很正常的邏輯,x為一個小於array1_size的值。多次訓練之後,cpu自作聰明的認為,哦,這就是一個正常的邏輯,那我為了加快執行速度就在判斷的時候我將下條指令的所需的內存填入緩存吧。但是,此時CPU不對這個內存的地址是否合法進行判斷!只有在執行到它的時候才判斷對錯,並且,上層預測執行如果預測失敗,cpu會回滾指令,但是不去清除這裡的緩存。

2)突然,攻擊者傳入了一個非法的x值,x值是目標地址相當於array1的偏移(注意,在這之前攻擊者已經清除掉array1_size的緩存,cpu並不知道array1_size的大小)。但是cpu還是傻傻的認為我可以進入if邏輯,那我就先將大菜準備好,等待客人到來吧。

此時,cpu不知道自己已經陷入了攻擊者的陷阱了(這時看來,spectre是精心構造了一個結構,其中,array1是一個普通的數組,而array2就比較神奇了,array2[256 * 512]是一個256 * 512的二維數組。

為什麼是256 * 512呢?

這是因為單個位元組最大為255。我們來看spectre構造的這個結構,x為目標地址到array1的偏移,這樣當這條指令被cpu解析裝入緩存之後,array1[x]處便是我們要訪問的地址內容,因為是一個位元組,肯定小於256。這樣array2[array1[x]*512]就是一個正常的數組)。欸,cpu忽然發現這個時候x不再小於array1_size了,那我就不用等客人了,先跑去其他地方玩了,但是,它卻忘了將準備好的菜倒掉(嘻嘻,這個cpu和大部分人一樣懶呢,都不知道馬上洗盤子洗碗)。

3)重頭戲來了,我這時就要偷偷的從盤子中取菜了。這時,array2[目標內容*512]已經在緩存之中。因為讀取緩存和讀取內存所需的時間是不相同的,我們只需要去循環讀取array2的內容,判斷讀取的時間就可以推測出目標內存的內容。

熔斷(meltdown)

Meltdown利用的原理和spectre相似,只不過實現方式不同。

來看一個簡化版的meltdown。

本身,cpu看到第一條指令非法之後,會將rax的值清零。一般cpu為了更好的性能,會將2,3條指令部分執行,直到rax,rbx被清零。但是關鍵在於第三條指令,如果rbx+rax不在緩存中,則會首先將目標內存載入到緩存之中。這時就和spectre的處理方式相似了,不斷地訪問用戶空間的數組,通過訪問時間來推出目標內容。

——END——


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 移安全 的精彩文章:

四本黑客入門書籍推薦

TAG:移安全 |