Re: [情報] Intel嚴重漏洞 OS更新將會降低效能
※ 引述《s25g5d4 (function(){})()》之銘言:
: 1 ; rcx = kernel address
: 2 ; rbx = probe array
: 3 retry:
: 4 mov al, byte [rcx]
: 5 shl rax, 0xc
: 6 jz retry
: 7 mov rbx, qword [rbx + rax]
前文恕刪。
沒想到電蝦版鄉民這麼有志於學,我來更正並補充一些觀念好了
首先,來解釋幾個名詞:
1. speculative execution
例: if (a<b)
c = b+1
else
c = b+2
現代處理器都有分支預測器(branch predictor)去預測接下來程式會往哪走
然後就往那個方向執行下去,以範例來說,如果處理器覺得if會成立
那他不用等到(a<b)算出來,就可以先執行 c = b+1的部分
2. out-of-order exection
例: b = a * 2
c = b + 5
d = a + 10
這個例子中,第1行和第3行並沒有資料相關性(data dependency)
所以1,3行可以一起執行,第2行則需等到第1行 a*2 算出來才可執行
執行順序為(1, 3),然後(2)
3. in order retirement
雖然執行次序可以亂,但是retire指令仍要依序來
以第一個例子來說,如果if指令還沒有retire,那麼暫存器c就不會真正被寫入
回到paper例子,這個例子主要是利用speculative execution
第4行前面其實是有一個很難算出來的branch,比方說indirect jmp
根據某個記憶體內容,來決定要跳到哪,這個記憶體內容可能不在cache裡
所以要從dram那邊讀出來要很久,這個時候分支預測器就跳出來說話了
說接下來可能會從第4行開始執行,所以4,5,6,7行就這麼執行下去了
(註:4,5,7有資料相關性,因此會依序執行)
他們可以執行到前面的branch算出來,發現預測錯誤為止
第4行是把kernel的資料搬一個byte存到暫存器rax裡
由於intel在執行指令的時候沒有檢查權限,而是等到要retire了才檢查
從結果上來看,雖然rax最終都沒有被真正寫入,但是第4行終究被執行了
kernel的資料被搬到了rax的rename register(T1)
然後T1向左移了12個bit(第5行)
最後第7行,從[rbx+T1]這個user位址中讀了一個cache line出來
執行到此,第4行前面的那條指令終於算出來了,發現錯了
把rax, rbx的資料都還原回去,就當作沒有讀過kernel的資料
也有可能他預測對了,終於可以retire,retire完之後
接下來要retire第4行的指令,結果發現他根本沒有權限讀取資料
一樣也把rax, rbx的資料還原回去,當作沒有讀過kernel的資料
可是不管怎樣,第7行的那個cache line還是被搬到了cache裡
而且這個cache line還是user可以合法存取的
所以接下來駭客只需要合法的存取256(2^8)個cache line
看哪一個比較快,就知道kernel資料的那8個bit是什麼了
例如第4個cache line讀起來比較快,那8個bit就是00000100
這裡補充一點,現在學界普遍認為資料預取(data prefetch)不會越過page boundary
由於第5行shift 12個bit的關係,這256個cache line分別位於不同的page
所以存取第一個cache line並不會造成後面的cache line也被cpu預先搬到cache來
由於他們都位於不同page的關係,需要不同的位址轉換(tlb entry)
只有之前讀過的cache line那個page有做過位址轉換,因此tlb hit
其他的通通都tlb miss,要花很長時間做table walk
轉換完位址之後,cache miss又要去記憶體搬資料
因此跟之前第7行讀過的cache line比起來,讀取的執行時間差異又更大了
大概就這樣
至於白話文解釋和解法,去看我之前的回文吧#1QJRc-vL
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 136.62.164.18
※ 文章網址: https://www.ptt.cc/bbs/PC_Shopping/M.1515139158.A.DC1.html
推
01/05 16:04,
6年前
, 1F
01/05 16:04, 1F
推
01/05 16:04,
6年前
, 2F
01/05 16:04, 2F
→
01/05 16:06,
6年前
, 3F
01/05 16:06, 3F
→
01/05 16:06,
6年前
, 4F
01/05 16:06, 4F
→
01/05 16:07,
6年前
, 5F
01/05 16:07, 5F
→
01/05 16:08,
6年前
, 6F
01/05 16:08, 6F
推
01/05 16:09,
6年前
, 7F
01/05 16:09, 7F
→
01/05 16:09,
6年前
, 8F
01/05 16:09, 8F
→
01/05 16:09,
6年前
, 9F
01/05 16:09, 9F
→
01/05 16:09,
6年前
, 10F
01/05 16:09, 10F
推
01/05 16:10,
6年前
, 11F
01/05 16:10, 11F
→
01/05 16:11,
6年前
, 12F
01/05 16:11, 12F
→
01/05 16:11,
6年前
, 13F
01/05 16:11, 13F
推
01/05 16:12,
6年前
, 14F
01/05 16:12, 14F
→
01/05 16:12,
6年前
, 15F
01/05 16:12, 15F
→
01/05 16:12,
6年前
, 16F
01/05 16:12, 16F
→
01/05 16:13,
6年前
, 17F
01/05 16:13, 17F
→
01/05 16:15,
6年前
, 18F
01/05 16:15, 18F
推
01/05 16:20,
6年前
, 19F
01/05 16:20, 19F
推
01/05 16:29,
6年前
, 20F
01/05 16:29, 20F
推
01/05 16:31,
6年前
, 21F
01/05 16:31, 21F
推
01/05 16:31,
6年前
, 22F
01/05 16:31, 22F
→
01/05 16:35,
6年前
, 23F
01/05 16:35, 23F
→
01/05 16:35,
6年前
, 24F
01/05 16:35, 24F
→
01/05 16:36,
6年前
, 25F
01/05 16:36, 25F
→
01/05 16:36,
6年前
, 26F
01/05 16:36, 26F
推
01/05 16:39,
6年前
, 27F
01/05 16:39, 27F
→
01/05 16:39,
6年前
, 28F
01/05 16:39, 28F
→
01/05 16:39,
6年前
, 29F
01/05 16:39, 29F
推
01/05 16:44,
6年前
, 30F
01/05 16:44, 30F
推
01/05 16:49,
6年前
, 31F
01/05 16:49, 31F
推
01/05 16:50,
6年前
, 32F
01/05 16:50, 32F
→
01/05 16:50,
6年前
, 33F
01/05 16:50, 33F
→
01/05 16:51,
6年前
, 34F
01/05 16:51, 34F
推
01/05 16:52,
6年前
, 35F
01/05 16:52, 35F
推
01/05 17:10,
6年前
, 36F
01/05 17:10, 36F
→
01/05 17:10,
6年前
, 37F
01/05 17:10, 37F
→
01/05 17:13,
6年前
, 38F
01/05 17:13, 38F
→
01/05 17:13,
6年前
, 39F
01/05 17:13, 39F
→
01/05 17:56,
6年前
, 40F
01/05 17:56, 40F
推
01/05 21:37,
6年前
, 41F
01/05 21:37, 41F
→
01/05 21:37,
6年前
, 42F
01/05 21:37, 42F
推
01/05 21:49,
6年前
, 43F
01/05 21:49, 43F
推
01/05 21:52,
6年前
, 44F
01/05 21:52, 44F
推
01/06 01:01,
6年前
, 45F
01/06 01:01, 45F
推
01/06 13:50,
6年前
, 46F
01/06 13:50, 46F
推
01/06 19:51,
6年前
, 47F
01/06 19:51, 47F
→
01/06 19:51,
6年前
, 48F
01/06 19:51, 48F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 29 之 38 篇):