作者twlin (@@")
看板PC_Shopping
标题Re: [情报] Intel严重漏洞 OS更新将会降低效能
时间Fri Jan 5 15:59:15 2018
※ 引述《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://webptt.com/cn.aspx?n=bbs/PC_Shopping/M.1515139158.A.DC1.html
1F:推 ericinttu : 有白话给个推 01/05 16:04
2F:推 jclin : 简单说就是micro-architecute跟uOPs没有检查权限 01/05 16:04
3F:→ jclin : 所以读进[rcx],做了乘法,又prefetch[rbx+rax] 01/05 16:06
4F:→ jclin : 因为要尽量塞满CPU执行单元,记忆体会尽量满足要求 01/05 16:06
5F:→ jclin : 让资料一ready就可以让这些uOPs去计算 01/05 16:07
6F:→ jclin : 没检查权限又塞进cache,最後就能被side-channel 01/05 16:08
7F:推 DANTEINFERNO: 所以说 怎麽会设计成不先确认权限再开始算R 484偷吃 01/05 16:09
8F:→ DANTEINFERNO: 步过头了? 01/05 16:09
9F:→ jclin : 基本上rax,rbx资料不用还原,因为是在uOPs内做 01/05 16:09
10F:→ jclin : 只是到最後发现白做,就 flush 不用存回 rax/rbx 01/05 16:09
11F:推 a58524andy : 推热心 01/05 16:10
12F:→ twlin : 还原就白话说法嘛,实际上当然是flush掉相关的 01/05 16:11
13F:→ twlin : physical register(rename register) 01/05 16:11
14F:推 s25g5d4 : 所以 porbe array 要对齐 page 的原因是这样,我还 01/05 16:12
15F:→ s25g5d4 : 以为是要读整个 page 进 cache 01/05 16:12
16F:→ s25g5d4 : 当初看的时候也搞不清楚为什麽 cache line 查到的大 01/05 16:12
17F:→ s25g5d4 : 小都是 64 bytes, 却要做 shift 12 01/05 16:13
18F:→ twlin : 是要让256个可能的cache line分别在不同的page 01/05 16:15
19F:推 ATand : 看完这篇再跟白话解释对照就大致明白了 01/05 16:20
20F:推 ununnihao : 所以这根本有可能是为了效能故意这样设计的? 01/05 16:29
21F:推 likeyousmile: 推专业文。PTT清流 01/05 16:31
22F:推 KotoriCute : Meltdown 的部分应该是吧 01/05 16:31
23F:→ twlin : 理论上来说,在tlb做位址转换时就可以顺便检查权限 01/05 16:35
24F:→ twlin : 可能他们检查权限太慢,无法meet timing,所以等到 01/05 16:35
25F:→ twlin : 之後retire再慢慢做,也可能是贪图方便,在retire时 01/05 16:36
26F:→ twlin : 由ROB一并处理各种exception 01/05 16:36
27F:推 jclin : meltdown是这样,spectre是更generalized.只靠分支预 01/05 16:39
28F:→ jclin : 测,不需要记忆体保护机制,但更难实作与成功,却也更 01/05 16:39
29F:→ jclin : 难防 01/05 16:39
30F:推 jclin : 叫 xxlin 都有这麽神吗 01/05 16:44
31F:推 Windcws9Z : twlin版友 印像是AMD的@@ 01/05 16:49
32F:推 Shauter : 又是AMD狂战士 01/05 16:50
33F:→ Windcws9Z : 不知道有没有记错 01/05 16:50
34F:→ kobe8112 : jc大是拐着弯称赞自己吗XDD 01/05 16:51
35F:推 kipi91718 : 话说要怎麽写判断是不是cache hit的存取时间阿? 01/05 16:52
36F:推 jclin : 原来早在 oversea_job 拜读过 twlin 大大推文,一时 01/05 17:10
37F:→ jclin : 不察 01/05 17:10
38F:→ jclin : cache hit/miss这很早就做出啦. x86有很精准的rdtsc 01/05 17:13
39F:→ jclin : 可以算cycle 01/05 17:13
40F:→ StarHero : 的确是酒杯那个比喻比较恰当 01/05 17:56
41F:推 TaiwanFight : 看下来感觉intel没啥问题 问题终究在那些骇客吧 01/05 21:37
42F:→ TaiwanFight : 把骇客抓一抓就好啦 01/05 21:37
43F:推 ken720331 : 楼上这个建议不错..可以提供给intel 01/05 21:49
44F:推 hizerg : 推 这篇说得很白话 01/05 21:52
45F:推 NCTUFAIWEN : 推 看到这篇终於懂惹 感谢你 01/06 01:01
46F:推 ry3298 : 推 01/06 13:50
47F:推 hms5232 : 看了一些文章後去搜寻一大堆文章好不容易看懂分支和 01/06 19:51
48F:→ hms5232 : 预测器了 才看到这篇一看就懂QQ 01/06 19:51