1. 程式人生 > >intel漏洞詳細解析

intel漏洞詳細解析

ops OS moved arm 間接 有效 clas 代碼 ati

1. CVE-2017-5754(Meltdown):惡意數據緩存加載
即采用特定指令,探測內核訪問不到的內存內容。
通過本地運行特定程序的方式讀取系統運行的CPU緩存,獲得當前運行系統緩存的所有信息

比喻:https://baijiahao.baidu.com/s?id=1588835621748074141&wfr=spider&for=pc
簡化的例子:https://baijiahao.baidu.com/s?id=1589161700913499450&wfr=spider&for=pc

1)亂序執行:
代碼:
a = 1; b = 2; c = 3; d = a + b + c;
CPU:
a = 1
b = 2 -> d = a + b + c;
c = 3
亂序執行出現bug -> oops -> 恢復現場 -> cache中的數據仍存在 -> 通過cache的訪問延時來推測

2)Meltdown –限制
只能訪問同一地址空間的內容,因此被攻擊的數據必須與攻擊者位於同一地址空間。
傳統的Linux進程與內核采用同一頁表,成為用戶程序獲取內核數據的基礎。
理論上,用戶程序可以獲取位於同一地址空間的任何數據(比如沒有r權限的數據)。
另外,攻擊手段依賴CPU的設計失誤,也就是亂序執行時不檢查訪問權限,因此只對intel的CPU有效。

3)Meltdown –防禦
內核與用戶態頁表隔離
KASLR: kernel address isolation to have side-channels efficiently removed
KPTI: Kernel Page Table Isolation

4)性能問題
由於引進了PCID技術,性能影響較小
PCID:
進程切換不需要刷新TLB(ASID in ARM)
12bits: 4096項
多核問題

2. CVE-2017-5753(Spectre1):分支目標註入
即利用了間接分支預測器,有意讓間接分支目標出現錯誤的(攻擊者指定的)預測。

3. CVE-2017-5715(Spectre2):邊界檢查旁路
即利用了條件分支指令之後的預測執行,有意讓條件分支出現錯誤的(攻擊者指定的)預測。

if (condition){
codea();
}
codeb();

CPU執行順序(預測):兩個分支同時執行
if (condition) > codea() > codeb() > ...
> 回退


Meltdown vs Spectre
Meltdown: 攻擊者在自己的代碼中訪問目標數據,依賴CPU的亂序執行不檢查權限Bug
Spectre: 攻擊者創造條件,讓攻擊者之外的代碼去訪問目標數據

intel漏洞詳細解析