首页 > 解决方案 > Flush & Reload 缓存侧通道攻击

问题描述

我试图了解 Flush + Reload 缓存侧通道攻击。据我所知,攻击利用了可以将非特权数据加载到缓存中的事实(利用分支预测、推测执行等)。然后,攻击者使用探针阵列来访问内存,快速加载的内存被假定在缓存中(秘密数据的一部分)。

我发现不清楚的一件事是攻击者如何能够遍历作为非特权内存的虚拟内存?例如 - 迭代内核虚拟内存或其他进程的内存。

标签: securitycachinghardwarespectreside-channel-attacks

解决方案


首先,您应该看看我对为什么查找表不能在恒定时间内运行的描述,因为我有关于缓存和标记如何工作​​的图片。

缓存位于MMU和 CPU 之间,而 MMU 是创建虚拟内存的对象;因此缓存攻击实际上是虚拟内存的一个独立功能。它们是强制刷新缓存的功能,然后选择如何重新加载缓存,因为您正在寻找时间信息。缓存之间的外部获取是泄漏信息的原因。(注意,这基本上是一个 x86 问题,因为它不允许缓存锁定,这与 1990 年以来的大多数 CPU 不同。另一个警告是我只为非 x86 架构制造了硬件,所以如果我对缓存有误,请告诉我锁定关键数据)。

作为一个通用示例,我们有一个 1k 字节的缓存,我们将使用 AES s-box 作为查找表,因此有 256 个条目。

  • 通过从内存中读取 2k 字节,通过不同的进程强制刷新缓存刷新。
  • AES 进程开始运行,并通过总线获取的代理将数据 sbox 数据放入缓存中
  • 然后,我们从内存中读取 1023 字节的不同数据,以覆盖除一个之外的所有 AES 条目,并查看该数据何时因总线读取而变慢

现在是我们攻击虚拟内存的 MMU 版本。如果您查看我链接的答案,您会看到有缓存标签。现在让我们假设一个简单的例子,我有两个 20 位的进程(1MiB 的地址空间)。MMU 使这两个进程具有相同的虚拟表,从 0xYYY00000 开始,其中 YYY 是内存中的实际前缀。如果我知道 MMU 是如何映射数据的,我可以基于内存重叠的方式在缓存中创建的标记信息创建结构化攻击。

在Bernstein 对 AES 的缓存定时攻击中,有更多关于如何在软件方面构建这些攻击的详细信息 。


推荐阅读