Re: [情報] Intel嚴重漏洞 OS更新將會降低效能

作者: dustlike (灰塵)   2018-01-05 17:37:05
※ 引述《Sirctal (母豬母豬 夜裡哭哭)》之銘言:
: https://gist.github.com/ErikAugust/724d4a969fb2c6ae1bbd7b2a9e3d4bb6
這code是來自Google關於Spectre的範例程式
https://spectreattack.com/spectre.pdf
獻醜一下我只看程式碼並稍微參照論文的解讀
readMemoryByte()第一個參數是malicious_x、
第二個參數value回傳最有可能的兩個結果,第三個參數score回傳對應的評分(越大越好)
readMemoryByte()會猜測真實位址為(array1真實位址 + malicious_x)的資料
一般來說你對一個只有160bytes的陣列讀array1[12345678]肯定會當掉
因為在虛擬記憶體映射時會找不到(array1的虛擬位址+12345678),
會產生區段錯誤(Segmentation Fault),於是程式就被OS殺掉了
虛擬記憶體映射是現代CPU的基礎,它令程式可以使用實際上零碎的記憶體來組成連續的
而且也能保證User級的應用程式彼此從記憶體上隔離,達成安全性
https://zh.wikipedia.org/wiki/%E8%99%9A%E6%8B%9F%E5%86%85%E5%AD%98
看wiki比較詳細
這份code的核心在victim_function(),原理是基於分支預測
考慮以下程式碼:
if (x < array1_size)
{
temp &= array2[array1[x] * 512];
}
x就是malicious_x(不過程式執行時混入安全的training_x,每五次才會用一次malicious)
array1[x]就是我們想撈出來的資料,array1_size是一個小於array1大小的數字
假設x = 123456789,正常來說執行到array1[x]會當掉
所以碼農會為這段程式碼加上邊界檢查,當x>=array1_size就會不會跑到array1[x]
就在這時候分支預測登場了,CPU猜測會中 temp &= array2[array1[x] * 512],於是讀取
array1[x],然後再讀array2[array1[x] * 512]
假設array1[x]是28,那array2[28*512]到array2[29*512-1]這段就會被載進快取
後面再透過測定讀取array2每一段512bytes的時間,判斷是Cache Hit/Miss
這樣就能猜測array1[x]
我的理解是,與Meltdown相比Spectre無法直接給定目標位址,
只能盡可能全倒出來然後去翻找,感覺挺沒效率的
不過能夠讀取array1[12345789]而不會crash就已經很有趣了

Links booklink

Contact Us: admin [ a t ] ucptt.com