CPU Spectre(幽灵)漏洞

漏洞描述

攻击概述

由于CPU间接分支预取存在漏洞(CVE -2017-5753/CVE -2017-5715),导致低特权级的软件(guest VM)能够控制高特权层软件(host hypervisor)的分支预取行为,在预取期间执行host hypervisor的任意指令,构造硬件缓存的侧信道攻击(side-channel attack),泄露host hypervisor(或其他guest VM)的任意数据。

针对该漏洞的攻击属于本地攻击,无法通过网络直接完成,且攻击者只能窃取数据,无法篡改系统内容。

攻击原理

分支目标缓存注入

    在x86 CPU中指令体系中,分支预测器(Branch predictors)对软件性能提升起到了很大的作用。其中一个关键组件是分支目标缓存(BTB),BTB缓存cpu最近已经执行的分支指令的目标地址。当cpu执行新的分支指令时,会基于BTB中缓存的历史记录“猜测”本次分支指定可能的目标地址,进行预执行;这样以提高性能。

  下图描述了cpu是如何维护BTB的:

  image.png

    BTB中的每一条历史记录描述过去cpu已经执行过的分支指令的信息,包括分支指令的地址标签(分支指令所在虚拟地址的低12位)和该分支指令跳转的目标地址。当cpu执行新的分支指令时,将会基于地址标签来查找BTB,找到匹配的历史记录,取出记录中的目标地址作为预取的目标地址。

    攻击者可以在guest VM通过在自己构造的guest mode执行分支指令,注入BTB,同时保证分支指令地址的低12位与未来host hypervisor将要执行的分支指令的低12位一样。当host hypervisor执行分支指令时,将使用guest VM注入BTB的恶意目标地址作为预取执行的目标地址。也就是说,guest VM能够在一定条件下控制host hypervisor的控制流,使得 hypervisor执行任意代码。

侧信道攻击构建

那么如何让host hypervisor执行guest VM想要的代码,从而构建侧信道攻击呢?最直接的方法是,在guest VM中分配一块内存,填入攻击者想要的侧信道攻击代码(假设攻击代码在guest VM中的地址为gpa)。通过现有的侧信道攻击方式(https://googleprojectzero.blogspot.com/2018/01/reading-privileged-memory-with-side.html),可以猜测出gpa对应的hpa,然后根据host linux kenerl的direct mapping机制得到对应的hva。此时,guest VM只需要通过分支目标缓存注入,在BTB中预先注入目标地址hva,即可以完成侧信道攻击。

解决方案

    请参考 CPU 相关厂商发布的最新解决方案。