关于CVE-2017-5753推测执行中数组访问时间差异的技术疑问
为什么推测执行下数组不同偏移的加载时间能测出差异?
你这个问题问到点子上了——其实数组偏移本身不会影响访问时间,这里的时间差完全是CPU缓存的「侧信道」在搞鬼,也是Meltdown/Spectre这类漏洞利用的核心原理。我给你拆解一下:
攻击前的准备:清空缓存
攻击者会先把arr2所有元素对应的缓存行都从CPU缓存里清除掉(比如用clflush指令),确保后续正常访问这些位置时,都需要从内存里加载,速度会很慢。触发推测执行,偷偷预热缓存
利用漏洞触发CPU的推测执行:虽然程序在正确执行路径下index2不会是0x200或0x300,但CPU会提前推测执行这个数组访问操作。如果推测的index2是0x200,那arr2->data[0x200]就会被偷偷加载到CPU缓存里;如果推测的是0x300,那被加载到缓存的就是arr2->data[0x300]。测量时间,判断推测值
等推测执行的错误路径被回滚后,攻击者再分别测量加载arr2->data[0x200]和arr2->data[0x300]的时间:- 如果某个位置的加载速度特别快,说明它已经在缓存里了——也就意味着刚才推测执行时用的是这个偏移值;
- 速度慢的那个,说明没被缓存,推测执行时没访问它。
说白了,这里测的不是数组偏移的时间差,而是缓存命中/未命中的时间差——CPU缓存命中的访问速度比从内存加载快几个数量级,这个差异完全可以被攻击者检测到。
内容的提问来源于stack exchange,提问作者user3274434
相关产品推荐
相关产品推荐

