ga('set', 'anonymizeIp', 1);
最近爆出的CPU漏洞闹的沸沸扬扬,各大云服务商都在做紧急处理,打补丁,而这将导致CPU性能下降 ,严重的甚至达到20%以上。不知道Intel是否还能继续保持优势呢。
以下转载了来自漩涡整理的一些相关信息。
影响范围
形态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架构以后已有类似IBRS和IBPB的相关功能,不需要微码补丁。但更新微码补丁后将不再需要IBRS
值得一提的是,软件修复方式比硬件方式更"廉价"
形态3
Intel 处理器通过操作系统推送KPTI / KVA更新解决。AMD 不受影响
性能影响
这个各大媒体都有评测了,这里不多说。只提几点:
1.KVA/KPTI对于内核/用户状态切换开销比较大,对服务器应用影响比较明显,30%性能损失对于某些服务器应用并不是危言耸听,对普通个人用户影响不显著。在Windows系统上支持 INVPCID 的Intel处理器性能损失最小,但对于老一代的普通PCID则完全没有优化,也就是Haswell及以后的处理器性能影响最小。对于Linux会尝试使用 PCID 和 INVPCID 优化最快路径,当然最快的还是Haswell 以后
2.IBRS会根据设定在特定情况下(例如内核或者用户进程)关闭间接分支预测,性能影响比较大。甚至这个影响对于个人用户都是十分明显的。公司同事打了BIOS补丁后实测,Win10在i7-4712MQ上测试PCMark掉了20%。
3.IBPB会根据设定在特定情况时(例如模式切换/上下文切换/虚拟机之间切换)清空间接分支预测缓存,对于多任务性能有一些影响。
三个都打开时,性能损失最大。retpoline可以在Skylake以前的处理器部分的避免使用IBRS(至少打了补丁的软件无法攻击),但对于Skylake以后的处理器retpoline效用有限不能完全阻止攻击
各个操作系统的默认处理方式
RedHat(7)
比较有代表性的Linux系列。Linux系统会在系统启动时加载微码更新(如果有)因此不刷BIOS也可以修复Spectre。AMD 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_MACHINESYSTEMCurrentControlSetControlSession ManagerMemory Management" /v FeatureSettingsOverride /t REG_DWORD /d 0 /f
reg add "HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSession ManagerMemory Management" /v FeatureSettingsOverrideMask /t REG_DWORD /d 3 /f
reg add "HKLMSOFTWAREMicrosoftWindows NTCurrentVersionVirtualization" /v MinVmVersionForCpuBasedMitigations /t REG_SZ /d "1.0" /f
禁用Spectre相关补丁
reg add "HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSession ManagerMemory Management" /v FeatureSettingsOverride /t REG_DWORD /d 1 /f
reg add "HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSession ManagerMemory Management" /v FeatureSettingsOverrideMask /t REG_DWORD /d 3 /f
禁用Meltdown相关补丁
reg add "HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSession ManagerMemory Management" /v FeatureSettingsOverride /t REG_DWORD /d 2 /f
reg add "HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSession ManagerMemory Management" /v FeatureSettingsOverrideMask /t REG_DWORD /d 3 /f
禁用全部补丁
reg add "HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSession ManagerMemory Management" /v FeatureSettingsOverride /t REG_DWORD /d 3 /f
reg add "HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSession ManagerMemory 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/
(10)https://gist.github.com/woachk/2f86755260f2fee1baf71c90cd6533e9
(11)https://support.microsoft.com/en-us/help/4056894/windows-7-update-kb4056894