“ Meltdown” CPU漏洞的简化解释

“ Meltdown” CPU漏洞的简化解释

我刚刚阅读了有关“ Meltdown” CPU安全漏洞的白皮书,因为我很好奇这里到底发生了什么。 白皮书对此进行了详细说明,但由于篇幅较长且学术性强,因此我认为应该有一个更简单的概述。

Meltdown攻击是绕过许多现代CPU的安全检查的一种巧妙方法,它允许从未修补操作系统上的任何进程读取内核模式内存。

本文介绍了其实际工作原理-您可以在Meltdown网站其他地方阅读有关这些漏洞的影响的更多信息。

首先,称其为“ bug”(尽管有很多)可能有点夸大其词-CPU的功能如所宣传。 问题是有人想出了如何读取操作本来应该避免的副作用的方法。

接下来是一些技术性知识,但我将尝试尽可能简单地进行解释。 当然,我已经掩盖了细节-这里的目的只是从概念上传达它的工作方式。

在找到问题的实际原因之前,您需要了解一些先决条件。

先决条件#1-CPU内存缓存

CPU高速缓存是CPU上的一块内存,用于存储最近访问的数据页。 因为这些页面直接缓存在CPU上,所以访问它们的速度比必须一直回到主内存要快。

当CPU从主内存中读取数据时,它将在CPU缓存中缓存该页面的副本。 下次如果需要缓存页面时,它需要从主内存中读取数据,它可以从速度更快的CPU缓存中加载该值。

高速缓存中的每个页面为4096字节,并且高速缓存足够大以存储许多这些页面(取决于CPU)

前提条件2-乱序执行

每个CPU内核都有多个执行单元,每个执行单元都可以执行不同类型的操作。

例如:Intel i7具有17至20个执行单元-2x整数伪指令,1x除法,1x装载存储器,1x存储存储器单元等…

为了使这些单元尽可能繁忙,CPU将等待即将到来的指令,并在等待时在不同的执行单元上开始执行它们 当前指令完成。

(这是一个过分简化的视图,但足以用于本次讨论。在实践中,指令被分解为微操作,并分发给执行单元)。

先决条件#3-特权模式

在任何时间点,CPU均以特权模式或非特权模式运行。

  • 内核代码以特权模式运行,并允许访问所有映射的内存。
  • 用户代码以非特权模式运行,并且如果尝试读取或写入标记为特权的内存,则用户代码将失败并失败。

基本上,操作系统以特权模式运行,而已安装的程序则以非特权模式运行。

问题

如果您考虑以上情况,则似乎用户模式(非特权)代码不应读取内核模式内存,因为CPU会引发异常。

问题是:

  1. 指令完成之前,不会执行特权模式检查。 (即:不在乱序执行期间)。
  2. 即将执行的指令的无序执行会产生副作用,可以观察到。

运作方式如下

首先,攻击者分配一个内存块,该内存块由256页内存(即256 * 4096字节)组成。 此刻该内存块中的每个页面都不会被缓存,因为它从未被访问过。

接下来,执行类似于以下代码的序列。 这称为“发送者”:

  1. 执行一些会引发异常的指令(什么都没关系)
  2. 从特权内存中读取一个字节。 我们称之为“秘密”
  3. 将机密乘以4096(高速缓存页面大小)
  4. 使用该乘数值作为已分配内存块的索引并读取一个字节(即:从N页读取一个字节,其中N是秘密)

假设CPU在指令1完成之前开始乱序执行指令2-4,则指令4将导致分配的内存块的一页被缓存在CPU上。 缓存的页面将与从内核模式内存读取的字节直接相关。 例如:如果密码为21,则分配的存储块的第21页现在将被缓存在CPU上。

最后,“接收者”观察到这种无序执行的副作用,以确定读取的机密字节。

  1. 捕获上述指令1引发的异常。
  2. 遍历分配的内存块中的每个页面,然后…
  3. 从每一页读取一个字节花费的时间。
  4. 如果字节加载很快,则该页面必须已被缓存并泄露了机密。

从上面的示例继续,分配的内存块的页面0到20读起来很慢,而页面21则要快得多-因此秘密值必须为21。

现在,只需重复以上所有内容,即可读取想要的秘密字节数。 白皮书说,他们能够读取高达500Kb /秒的速度。

From: https://hackernoon.com/a-simplified-explanation-of-the-meltdown-cpu-vulnerability-ad316cd0f0de