本文尽量只引用和使用“第一手资料”,避免使用媒体的报道,仅供个人参考,Use at your own risk!

影响范围

形态1(绕过边界检查 | Bounds Check Bypass / Spectre):目前所有支持乱序执行的处理器,包括Intel、AMD以及部分ARM处理器(1)

形态2(分支目标注入 | Branch Target Injection / Spectre):Intel、AMD以及部分ARM处理器(1)其中AMD官方宣称此形态对于AMD处理器风险非常低(2):目前缺少有效的利用方式。此攻击需要可以预测CPU分支预测器处理方式

形态3(流氓数据缓存载入 | rogue data cache load / Meltdown):仅限Intel少部分ARM处理器 (1)

 

影响程度/攻击难度(3)

形态1:对很多程序理论上均可攻击,且可通过浏览器JavaScript达成。漏洞可导致攻击者可读取本进程空间内的内存数据。但实际应用中,击中想要的缓存难度不低。而且除了一些特殊情况外,难以用于逾越进程边界和特权边界

形态2:对含有 间接跳转 的程序理论上均可攻击,可导致没有权限的攻击者读取未有软件修复的程序内存数据(包括系统内核数据),可跨越特权边界/虚拟机边界。实际应用需要一定条件

形态3:对未打相关补丁的操作系统内核的攻击,可导致没有权限的攻击者读取操作系统内核数据,攻击执行条件最简单。仅影响Intel处理器和少部分ARM处理器

以上漏洞的利用需要至少拥有在计算机上运行脚本/代码的权限。与之前永恒之蓝的漏洞不同,并不是远程执行类漏洞

 

修复方式

形态1

软件修复:对于浏览器等类似应用,砍掉高精度计时器精度以及禁止 SharedArrayBuffer ,例如Firefox就是这么干的(4)。对于Windows用户更新相关软件即可

硬件修复:同下

形态2

软件修复:

Intel 使用retpoline补丁编译程序(对Skylake及以上效用有限)。

AMD 不需要retpoline只需要 LFENCE。但为了避免麻烦Linux社区最终实现了一个AMD优化版的 retpoline(5)

硬件修复:

Intel 更新微码补丁后,CPU将会有IBRS(限制间接分支预测)以及IBPB(间接分支预测屏障)的MSR(6),开启后可以阻止形态1/2攻击

AMD K10架构以后已有类似IBRSIBPB的相关功能,不需要微码补丁。但更新微码补丁后将不再需要IBRS

值得一提的是,软件修复方式比硬件方式更”廉价”

形态3

Intel 处理器通过操作系统推送KPTI / KVA更新解决。AMD 不受影响

 

性能影响

这个各大媒体都有评测了,这里不多说。只提几点:

1.KVA/KPTI对于内核/用户状态切换开销比较大,对服务器应用影响比较明显,30%性能损失对于某些服务器应用并不是危言耸听,对普通个人用户影响不显著。在Windows系统上支持 INVPCID 的Intel处理器性能损失最小,但对于老一代的普通PCID则完全没有优化,也就是Haswell及以后的处理器性能影响最小。对于Linux会尝试使用 PCIDINVPCID 优化最快路径,当然最快的还是Haswell 以后

2.IBRS会根据设定在特定情况下(例如内核或者用户进程)关闭间接分支预测性能影响比较大甚至这个影响对于个人用户都是十分明显的公司同事打了BIOS补丁后实测,Win10在i7-4712MQ上测试PCMark掉了20%。

3.IBPB会根据设定在特定情况时(例如模式切换/上下文切换/虚拟机之间切换清空间接分支预测缓存,对于多任务性能有一些影响。

三个都打开时,性能损失最大。retpoline可以在Skylake以前的处理器部分的避免使用IBRS(至少打了补丁的软件无法攻击),但对于Skylake以后的处理器retpoline效用有限不能完全阻止攻击

 

各个操作系统的默认处理方式

RedHat(7)

比较有代表性的Linux系列。Linux系统会在系统启动时加载微码更新(如果有)因此不刷BIOS也可以修复SpectreAMD K10以后的CPU自带类似IBRS和IBPB的功能因此不需要微码更新也可以修复Spectre,但性能有一定影响

Intel处理器(没有微码补丁):仅开启KPTI仅修复形态3(Meltdown)

Intel处理器(打了微码补丁):KPTI + IBRS(仅内核) + IBPB(用户态上下文切换+虚拟机状态切换)三种形态都修复

AMD处理器(没有微码补丁):IBRS(内核+用户态) + IBPB(用户态上下文切换+虚拟机状态切换) 三种形态都修复

AMD处理器(打了微码补丁):IBPB(内核/用户态切换+用户态上下文切换+虚拟机状态切换) 三种形态都修复

 

Windows

Windows因为闭源其实现并不能很好确定,只能通过其公告、网友截图和已有OS补丁推测 (8) 。微软修复相关漏洞需要更新2018/01补丁集合Windows系统理论上也可以在开机时加载微码更新,但目前微软没有推送相关微码更新 (8) 。根据微软公告推测微软要求刷BIOS来修复Spectre (9)

Intel 处理器(没有微码补丁):系统更新开启KVA(KPTI的M$实现)仅修复形态3 (Meltdown)

Intel 处理器(打了微码补丁):KVA + IBRS? + IBPB?  三种形态都修复?(无法验证)

AMD 处理器(没有微码补丁):不使用硬件解决方案。仅内核使用 LFENCE 软件修复形态2 ?(无法验证)

AMD 处理器(打了微码补丁):IBPB? 三种形态都修复? (无法验证)

 

微软对Spectre应该完全采用硬件方式解决——IBRS和IBPB,因为不像Linux可以比较容易的打上软件补丁。不出意外推测打了微码补丁后应该与RedHat的方案类似。不同之处在于,对于AMD,未打微码补丁之前 似乎不会 开启IBRS(提示硬件不支持)有人(10)表示在没有微码补丁的情况下M$会为内核使用LFENCE。不过信息来源暂无法验证

同时,因为部分安全软件的兼容性问题,除非安全软件显性设置一个注册表设定或用户自行设置,否则部分用户暂时不会收到相关OS补丁(11)

 

Meltdown/Spectre相关补丁开关

Linux(7)

# echo 0 > /sys/kernel/debug/x86/pti_enabled #关闭KPTI
# echo 0 > /sys/kernel/debug/x86/ibpb_enabled #关闭IBPB
# echo 0 > /sys/kernel/debug/x86/ibrs_enabled #关闭IBRS

KPTI 0为禁用,1为启用

IBPB 0为禁用,1为 用户态上下文切换+虚拟机状态切换 时启用IBPB,2为  内核/用户态切换+用户态上下文切换+虚拟机状态切换 时启用IBPB。2与IBRS冲突,将不使用IBRS

IBRS 0为禁用,1为 内核状态下启用IBRS,2为 在内核与用户状态下均启用。

Windows

Win下使用注册表控制(12),直接放几个命令

开启全部补丁

reg add “HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management” /v FeatureSettingsOverride /t REG_DWORD /d 0 /f

reg add “HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management” /v FeatureSettingsOverrideMask /t REG_DWORD /d 3 /f

reg add “HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Virtualization” /v MinVmVersionForCpuBasedMitigations /t REG_SZ /d “1.0” /f

禁用Spectre相关补丁

reg add “HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management” /v FeatureSettingsOverride /t REG_DWORD /d 1 /f

reg add “HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management” /v FeatureSettingsOverrideMask /t REG_DWORD /d 3 /f

禁用Meltdown相关补丁

reg add “HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management” /v FeatureSettingsOverride /t REG_DWORD /d 2 /f

reg add “HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management” /v FeatureSettingsOverrideMask /t REG_DWORD /d 3 /f

禁用全部补丁

reg add “HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management” /v FeatureSettingsOverride /t REG_DWORD /d 3 /f

reg add “HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management” /v FeatureSettingsOverrideMask /t REG_DWORD /d 3 /f

(1)https://developer.arm.com/support/security-update

(2)https://www.amd.com/en/corporate/speculative-execution

(3)https://googleprojectzero.blogspot.com/

(4)https://blog.mozilla.org/security/2018/01/03/mitigations-landing-new-class-timing-attack/

(5)https://lwn.net/Articles/743380/

(6)https://lwn.net/Articles/743019/

(7)https://access.redhat.com/articles/3311301

(8)https://www.catalog.update.microsoft.com/

(9)https://support.microsoft.com/en-us/help/4073757/protect-your-windows-devices-against-spectre-meltdown

(10)https://gist.github.com/woachk/2f86755260f2fee1baf71c90cd6533e9

(11)https://support.microsoft.com/en-us/help/4056894/windows-7-update-kb4056894

(12)https://support.microsoft.com/en-us/help/4072698/windows-server-guidance-to-protect-against-the-speculative-execution