幽灵攻击原理
在一个高层面上,通过组合“推测执行”和微架构的“屏蔽通道数据渗漏”技术,幽灵攻击能违反内存隔离的边界。 更具体的说,攻击者为了发起攻击,首先它得在受害者进程的空间内定位一系列的指令,这些指令在执行的时候会作为秘密信道发送器泄露受害者的内存器和寄存器中的内容。 攻击者然后诱导CPU猜测并执行错误的指令序列,从而将受害者的信息泄露到隐蔽的通道。最后攻击者通过这个隐蔽的通道接收到被泄露的信息。虽然错误地推测执行在CPU的状态上可以被还原到checkpoint点,但是有些部分是不会恢复的,比如cache。
尽管隐蔽通道有很多可能的选择,但是本文所属的实现使用给予缓存的的秘密通道。Flush + Reload [37]或Evict + Reload [28]技术。
怎么诱发和影响错误的分支预测呢?分支预测器是一种cache,存放最近的分支结果。
说白了就是这样,比如你的软件给其他进程提供了一些接口,如果你的接口中有类似下面的判断+数组形式,那么攻击者可以通过不同参数来调用你的接口了。 先是以正常的参数来训练预测器,让它觉得程序非常可能是走这个分支;然后突然给它传一个错误的参数,本来程序按照正常的逻辑来说是不会执行下面的分支。但是因为CPU有预测器,所以还是稀里糊涂的按照之前的分支预测结果去执行了。 结果程序的数据接泄露到cache上了,攻击者可以通过一些技术来获取cache上的这些数据。
if (x < array1_size) y = array2[array1[x] * 256];
这个与ROP不同,它不需要被攻击者程序中有漏洞。