Re: [情报] Intel严重漏洞 OS更新将会降低效能

楼主: twlin (@@")   2018-01-05 15:59:15
※ 引述《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
作者: DANTEINFERNO (DANTE)   2018-01-05 16:09:00
所以说 怎么会设计成不先确认权限再开始算R 484偷吃步过头了?
作者: likeyousmile   2018-01-05 16:31:00
推专业文。PTT清流

Links booklink

Contact Us: admin [ a t ] ucptt.com