幽灵(Spectre)是如何工作的?

这是作者为 Handmade Network 的 2024 年学习狂欢提交的文章,从近期学习者角度出发,非 CPU 或 CPU 漏洞专家视角,内容未经权威验证。

Spectre 漏洞相关

  • 2017 年发布,是利用现代 CPU 设计中固有的推测执行特性的一类漏洞,可通过推测执行来利用原本正确的程序并提取本应保密的信息。
  • 推测执行是 CPU 用于提高性能的一种技术,在处理条件语句时会预测条件真假并相应执行,正确预测可节省时间,错误预测则会回滚并承担小的代价。
  • 但 CPU 不能完美回滚错误推测,例如在推测执行时缓存不会回滚,这为 Spectre 攻击提供了可能。

通过定时攻击读取内存

  • 利用定时信息可揭示系统工作情况,通过计时可以仅利用定时器提取内存内容,如通过代码char dereferenceAndLookup(char* p) { return probeArray[*p]; },加载最快的probeArray索引就是*p的值。

实际 Spectre 攻击示例

  • 利用数组作为相对指针绕过语言中不能直接访问内存地址的限制,在有边界检查的程序中,推测执行可在知道越界前加载越界数据到缓存,从而实现攻击。
  • char exploitable(int i) { if (0 <= i && i < arraySize) { char secret = pointerishArray[i]; return probeArray[secret]; } return -1; },恶意的越界i值可导致推测执行加载敏感数据到缓存。
  • 实际攻击需考虑 CPU 缓存单位为缓存行(128 字节),probeArray需较大且secret乘以 4096 以确保每次访问有自己的缓存行,还需训练 CPU 预测i在界限内等细节,且要将probeArray从缓存中清除以利用缓存时间确定secret的值。

总之,文章介绍了 Spectre 漏洞的原理及利用方式,展示了其潜在的危险性。

阅读 11
0 条评论