1、此段代碼運(yùn)行在CPU用戶態(tài)模式下(cpl=3),且ptr指向一個(gè)內(nèi)核地址空間的地址。

2、CPU在執(zhí)行指令2時(shí),會首先把數(shù)據(jù)讀取到緩存中(這時(shí)還沒有進(jìn)行權(quán)限檢查)。

3、由于CPU的亂序執(zhí)行特性,執(zhí)行步驟2的同時(shí),后面幾條指令也被會執(zhí)行,且指令3和指令5的計(jì)算操作是根據(jù) 指令2讀取到的數(shù)據(jù) 執(zhí)行的。

4、當(dāng)CPU對指令2進(jìn)行權(quán)限檢查時(shí)會發(fā)生一個(gè)訪問異常,之后執(zhí)行的兩條指令的操作狀態(tài)會發(fā)生回滾,但Cache、TLB沒有回滾,這樣就繞過了CPU的權(quán)限檢查機(jī)制。

5、可以利用邊信道攻擊來探測哪些頁面被訪問過,結(jié)合特定的代碼場景,就可以推測出內(nèi)核地址空間中的內(nèi)容了。

2、Spectre漏洞分析

Spectre,對應(yīng)漏洞庫編號:CVE-2017-5753/CVE-2017-5715。

1、正常情況下,當(dāng)offset 大于array1->length時(shí),下面的代碼永遠(yuǎn)不會執(zhí)行。

2、如果array1->length沒有被緩存,由于CPU分支預(yù)測的特性,CPU當(dāng)前指令流水線會等待緩存加載完成,同時(shí)在另外一條指令流水線上,下一條指令“value = array1->data[offset]”會被預(yù)測執(zhí)行。

3、一旦發(fā)現(xiàn)offset大于array1->length,預(yù)測執(zhí)行的指令和結(jié)果將會被丟棄并加載正確的指令重新處理。

4、當(dāng)array1->length和array2->length沒有被緩存時(shí),exploit可以分別讀取 array2->data 0x200和0x300偏移處的數(shù)據(jù),通過比較兩次訪問的用時(shí),就可推斷執(zhí)行的是哪條指令,從而推斷出value的低位值,而這個(gè)value正是上面越界讀取到的值,這樣就可以泄露任意內(nèi)核地址空間的一位,這當(dāng)然就可以構(gòu)造出能讀取更多內(nèi)存地址的exploit了。通常訪問用時(shí)更短的,說明數(shù)據(jù)已經(jīng)被加載到了緩存,這也意味著分支指令被預(yù)測執(zhí)行到了。

分享到

zhupb

相關(guān)推薦