概述    

Meltdown 是影响 Intel x86 微处理器和一些基于 ARM 的微处理器的硬件漏洞。 它允许流氓

进程读取所有的内存,即使它没有被授权这样做。

原理

Meltdown 利用 Intel CPU 的乱序执行漏洞,通过对内存的响应时间差来建立一个侧信道攻击,以此读取整个内核空间。

Intel CPU 采用乱序执行来提高运行效率,但乱序执行都会碰到一个问题,从原理上讲它仅适用于纯顺序执行的指令,一旦遇到分支,即条件跳转指令,因为不执行到条件跳转指令本身,是没法知道程序转向何处执行的,也就是条件跳转指令的下一条指令在未执行前不确定,因此无法预先取得条件跳转指令的后续指令,这时乱序执行会失效,因为它们的前提是预先取得后续指令,为解决这个问题,Intel CPU 采用了分支预测。但分支预测不能保证一定预测成功,当失败时,就会执行指令的回滚以回到正确的分支上,虽然将错误的指令撤销,相应内存块已经读入到了 cache,因为存于 cache 的数据访问速度极快,这可以被作为“侧信道”利用的。

攻击者会利用分支预测故意访问非授权的地址a,检测出非法访问时,所有的数据被清除,但是 cache 中并未删除,此时遍历整个内存,测试访问的速度,访问时间极短则则判断出该地址被 cache,从而推断出该地址是地址a的内容。

检测

对于Linux用户,虽然有 KALSR 技术来参与保护缓冲区溢出问题的计算机安全,但是官方文档仍然提到了通过 Meltdown 漏洞来破解 KALSR 的方法。不过在实际使用当中,寻找时间比较长。对于漏洞检测,可以参见开源检测项目 spectre-meltdown-checker

对于Windows用户,通过使用微软公司发布的检测 PowersShell 脚本,能够判断Windows系统是否受到漏洞的影响:

    首先,安装相应的 PowerShell 模块,打开 powershell,对应命令:

Install-Module SpeculationControl

    其次,需要调用相关脚本,对应命令:

PS> PS> Get-SpeculationControlSettings

    其中,开启的保护会显示为 True,未开启的保护则会显示为 False,如下图所示:

Intel CPU漏洞修复

对于Windows10用户:

如果你是Windows10的话,那么这个更新的代号叫做 KB4056892

具体方法:选择“开始” 按钮,然后依次选择“设置” >“更新和安全” >“Windows 更新”。选择“检查更新”。如果有可用更新,请安装它们。

(这表明:Meltdown 补丁已经安装成功,但是 Spectre 漏洞修复不完整。红色的文字内容是指改名用户还是需要额外的芯片组固件更新)

注:微软官方给出的安全建议:Protect your Windows devices against Spectre and Meltdown

对于BIOS组件的芯片组:

对于BIOS组件的芯片组的固件升级,要去查询主板提供商,根据自己的电脑型号,在下载界面下载对应的 .exe文件

注:List of OEM /Server device manufacturers):Protect your Windows devices against Spectre and Meltdown

对于Linux用户:

为了修补漏洞,Linux内核团队将内核页表隔离(PTI)和 IBRS patch series 两项技术加入内核之中来对抗 Meltdown 和 Specture。用户只需要将系统升级到长期发行版本或者现在正在更新迭代周期的系统(Artful 17.10)即可获得更新.

教训

设计CPU追求速度快是理所当然的,但速度和安全性之间要有平衡点,微结构无论怎样追求高速优化,屁股要擦干净,不要向宏观体系结构泄漏内部信息。

1965年 Intel 创世人之一、时任仙童半导体公司电子工程师的戈登摩尔提出了摩尔定律,对人类的计算之路的快速进步做出了预言。过去二十年,人类在互联网的带动下,信息化发展一路狂奔。这种对速度的追求一定程度上,透支的是安全的掉队。也许这正是一个重新定义平衡点的时刻。

不要走开,后有彩蛋。

 

有的小伙伴可能希望上手试用这一漏洞,详情可参考开源周报2018年第3期

但应提出警告:

警告#1:代码原装提供。您有责任保护您自己,您的财产和数据以及其他人免受此代码造成的任何风险。此代码可能会导致您的计算机上出现意想不到的行为。此代码可能无法检测到您的计算机上的漏洞。

警告#2:如果您发现计算机容易出现崩溃错误,您需要避免将其用作多用户系统。Meltdown 会破坏CPU的内存保护。在易受 Meltdown 漏洞攻击的机器上,一个进程可以读取其他进程或内核使用的所有页面。

警告#3:此代码仅用于测试目的。不要在任何生产系统上运行它。不要在任何可能被其他人或实体使用的系统上运行它。