近日现代 CPU 的 Meltdown & Spectre 漏洞沸沸扬扬,最先是 Google 研究员发现能够经过内存侧信道时序攻击来获取隐私数据,后续 Chromium, Apple 以及 Mozilla 都发文讨论了其对各个平台的影响与应对方案。 网上讨论该漏洞的文章也不少,笔者我的感受 This is how Meltdown works, Why Raspberry Pi Isn't Vulnerable to Spectre or Meltdown 讲解的不错,而本文则翻译自 Meltdown in a nutshell 这个简述;本文概括于 Linux 配置使用、内部原理与 Shell 编程系列。html
对于以下伪代码:shell
x = read(memory_location_of_os_where_secret_lies) // 抛出异常
y = arr[x *4096] // 基于 x 读取本地内存
复制代码
应用程序会被编译或者解释为 CPU 指令,第一行对于敏感内存的读取最终会抛出异常,不过因为 CPU 的推测执行(Speculative Execution)优化,第二行代码会在 CPU 进行权限检测前执行,即 y 的值实际上已经被读取到了 CPU 缓存中。若是 x 的值是 s
,那么内存 arr[s
* 4096] 即会被 CPU 读取。CPU 发现进程无权读取后,即会清除 x 与 y 的值,不过 CPU 为了优化读取速度,会将本次的读取值缓存到 CPU 本地。攻击者即利用这一特性发起了旁路攻击,攻击者使用相似暴力破解的方式,遍历全部可能的 arr[x *4096] 地址;根据计时器来判断哪一个地址的读取速度最快,便可以获取到 x 的值 s
。依次类推能够得到 ‘e’, ‘c’,’r’,’e’,’t’ 等值。编程