刷新和重新加载缓存侧信道攻击



我正在努力了解Flush+Road缓存侧通道攻击。据我所知,攻击利用了无特权数据可以加载到缓存的事实(当利用分支预测、推测执行等时)。然后,攻击者使用探测阵列访问内存,该内存被快速加载,假设在缓存中(机密数据的一部分)。

我发现有一件事不清楚,那就是攻击者如何能够在非特权内存的虚拟内存中迭代?例如,在内核虚拟内存或其他进程的内存上迭代。

  1. 存在不同的缓存侧通道攻击。有很多变体,但你似乎混淆了两个:Prime+Probe和Flush+Road。因为这是一个关于Flush+Road的问题,我会坚持下去。

  2. Flush+Road的工作原理是滥用共享代码/数据,并结合clflush(缓存刷新指令)的工作方式,至少在x86上是这样。其他体系结构也有变体。受害者和攻击者必须在物理上共享至少1页数据。当攻击者使用指向此共享数据的地址的clflush命令时,它将从缓存层次结构中完全清除。因为数据是共享的,所以攻击者可以在缓存中攻击这些数据。因此,攻击者反复刷新与受害者共享的数据,然后允许/等待受害者运行,然后重新加载数据。如果攻击者的缓存未命中,则受害者不会访问数据(不会将数据带回缓存)。如果这是一个打击,受害者确实(至少可能)。攻击者可以区分缓存命中和未命中,因为内存访问的时间非常不同。

  3. 如果攻击者和受害者是不同的进程,他们如何共享数据?您需要了解一点现代操作系统。通常,共享库只在内存中物理加载一次。例如,标准c库只加载一次,但不同的应用程序访问相同的数据(物理上),因为它们的页表指向相同的物理地址,因为操作系统是这样设置的。

  4. 有些操作系统更具攻击性,会扫描物理内存来查找具有完全相同数据的页面。在这种情况下;合并";通过更改页面表,使所有使用此数据的进程都指向新的单个物理页面,而不是具有两个物理副本。不幸的是,即使在非共享库中,这也允许Flush+Road发生-如果你知道受害者的代码,并且你想监视它,你只需将其加载到你的地址空间(mmap-it),操作系统就会很高兴地消除重复内存,让你可以访问他们的数据。只要你们两个都只是阅读数据,就没问题;如果您试图写入数据,那么操作系统将被迫取消合并页面。然而,这对FLUSH+RELOAD来说很好:无论如何,你只对阅读感兴趣!

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

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

为了举一个一般的例子,我们有一个1k字节的缓存,我们将使用AES s盒作为查找表,因此有256个条目。

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

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

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

最新更新