Apple电脑Intel芯片组制造模式未关闭导致Ring3任意代码执行漏洞分析(CVE-2018-4251)

概述

“隐匿式安全”(Security Through Obscurity)是指通过隐藏特定内容、让外部人员无法知晓系统的设计原理,这种方式的缺点是显而易见的。然而,一些硬件制造商却以“保护知识产权”为前提,要求必须是签署过保密协议(NDA)的人员才能阅读技术文档。这样的策略,对于普通用户和硬件制造商来说,无疑是双输的。

其中的一个例子是Intel Management Engine(Intel ME),包括其服务器(Intel SPS)和移动(Intel TXE)版本。

如果想要了解更多Intel ME的背景知识,请点击参考(https://github.com/ptresearch/me-disablement/blob/master/How%20to%20become%20the%20sole%20owner%20of%20your%20PC.pdf%20%20http://blog.ptsecurity.com/2017/08/disabling-intel-me.html)。

在本文中,我们将详细说明一个未记录的(Undocumented)命令是如何做到覆盖SPI闪存从而实现ME漏洞本地利用的(INTEL-SA-00086)。这一漏洞的根源就在于未记录的Intel ME模式,特别是制造模式(Manufacturing Mode)。

关于制造模式

Intel ME制造模式是用于在生产期间对终端平台进行配置和测试,因此,这一模式本应在销售给用户之前禁用(关闭)。但是,这一模式及其潜在风险并没有在Intel的公共文档中进行任何描述。由于相关实用程序(Intel ME系统工具的一部分)无法正式使用,所以普通用户无法禁用此模式。一旦由于某种原因启用了此模式,那么此时没有方法能够通知用户或保护用户。甚至,作为专门用于识别UEFI固件级别芯片组和CPU中配置错误(例如SPI闪存区域访问权限的错误配置)的实用程序Chipsec,都对Intel的制造模式一无所知。

制造模式允许对存储在一次性可编程存储器(FUSE)的关键平台设置进行配置。其中包括BootGuard的设置(ACM和UEFI模块中数字签名密钥的模式、策略和哈希值)。其中还有一些被称为FPF(Field Programmable Fuses,现场可编程熔断器)。要查看可以写入FUSE的FPF列表,我们可以使用Intel ME System Tools中的FPT(Flash Programming Tool,闪存编程工具)实用程序。

FPF仅占FUSE阵列的一部分,大多数FPF都用于存储平台的参数。其中一部分被称为IP FUSE,用于存储IP(Intelligent Property,硬件逻辑块)单元的设置。因此,DFx Aggregator在 

除了FPF外,在制造模式下,硬件制造商可以对Intel ME的设置进行调整,这些设置存储在SPI闪存上Intel ME内部文件系统(MFS)中。可以通过重新编程SPI闪存,来实现对这些参数的更改。这些参数被称为CVAR(可配置的NVAR,命名变量)。

Intel ME中的mca_server模块用于对CVAR进行设置。MCA是“生产线配置架构(Manufacture-Line Configuration Architecture)”的缩写,是生产过程中配置平台过程的通用名称。与FPF一样,CVAR可以通过FPT进行设置和读取。

CVAR列表具体取决于Intel ME的平台和版本。对于支持Intel AMT的芯片组,其中一个CVAR是进入MEBx(ME BIOS Extension)的密码。

如果要对FPF或CVAR进行设置,Intel ME必须要处于制造模式。分配FPF的过程包括两个步骤:设置FPF的值(保存到临时存储中),以及将FPF值提交给FUSE。第一步只能在制造模式下实现。但如果在该模式下,制造商设置了FPF值,并且此前从没有内容写入到FUSE数组的响应范围,那么实际的“烧录”(Burn)将会在制造模式关闭后自动发生。这也就是说,如果系统处于制造模式,就意味着FPF可能从未被初始化。

制造模式关闭的标志存储在MFS上的文件/home/mca/eom中。当SPI闪存被基本文件系统的固件覆盖时,平台可以再次在制造模式下运行,尽管这时已经无法覆盖FUSE。

OEM公钥

基于上述原因,配置Intel平台的过程非常复杂,其中包括了多个步骤。一旦硬件制造商在此过程中出现任何失误,都会使整个平台面临严重风险。就算是制造模式已经关闭,也可能会发生制造商没有设置FPF的情况,从而导致攻击者可以用自己编写的值来替代用于签署BootGuard(ACM)和UEFI模块启动代码的密钥。在这种情况下,平台就仅会加载攻击者的恶意代码,并且会持续加载。由于攻击者的密钥被写入持久性内存,永远不会被删除,所以这将导致产生不可修复的硬件漏洞。有关此攻击的详细信息,建议参阅Alexander Ermolov的文章 (https://2016.zeronights.ru/wp-content/uploads/2017/03/Intel-BootGuard.pdf) 。

在较新的系统(Apollo Lake、Gemini Lake、Cannon Point)上,FPF不仅存储BootGuard的密钥,还会存储OEM的公钥(严格意义来说,是RSA加密方式的OEM公钥的SHA256哈希值),而后者支持多种ME安全机制。例如,SPI闪存中的SMIP(Signed Master Image Profile)负责存储制造商指定的PCH硬件配置(PCH Straps)。这一部分需要使用密钥进行签名,而该密钥的SHA256哈希值存储在SPI闪存上的特殊文件(分区)中。其文件名是FTPR分区中的oem.key(针对Cannon Point PCH,是在OEMP分区中的OEMP.man),其中包含各种OEM提供的用于对各种数据进行签名的公钥。在下图中,我们可以看到经过制造商签名的数据集的完整列表,每个数据集都有一个Cannon Point平台的唯一密钥:

oem.key文件本身使用OEM根密钥签名,其公钥的哈希值写在FPF中。

因此,一旦攻击者破坏了OEM根密钥,那么他可能会破坏上述所提到的所有数据,这比旧平台上攻陷Boot Guard的情况要更为严重。

在写入ME区域时绕过块

在近期以前(Intel Apollo Lake版本之前),Intel ME都位于一个独立的SPI区域,该区域具有CPU、GBE和ME的独立访问权限。因此,只要正确配置了访问属性,就无法从CPU(主系统)端读取或写入到ME。但是,在当前版本中,用于Intel芯片组的SPI控制器具有一个称为Master Grant的特殊机制。这一机制会为每个SPI主控制器分配一个严格定义的SPI闪存区域。无论SPI描述符中记录的访问权限是什么样的,主控制器都能够控制其特定的区域。每个主设备都可以定义任何其他主设备访问(读取或写入)其特定区域的权限(但仅能定义分配给自己的这部分区域)。

这意味着,即使SPI描述符禁止了主机访问ME的SPI区域,ME也仍然可以提供访问的权限。我们认为,这一更改可能会产生绕过标准流程更新Intel ME的风险。

主ME区域闪存保护覆盖

Intel ME中实现了一个特殊的HECI命令,允许在CPU端打开对ME SPI区域的写访问。该命令称为HMR FPO(主ME区域闪存保护覆盖)。在之前,我们详细说明了这个命令。

收到HMR FPO命令后,Intel ME仅在重置后才会启用对该区域的访问权限。Intel ME自身还具有安全措施:只有当UEFI BIOS是平台启动过程的所有者时,才会在EOP之前接受该命令。EOP是一种不同的HECI命令,它在将控制权交给操作系统(ExitBootServices)之前,将UEFI发送给ME。有时,BIOS Setup包含在EOP之前发送HMRFPO命令的选项。

收到EOP后,Intel ME会忽略HMR FPO,并返回相应的错误状态。但这只会在制造模式关闭后才会发生。在制造模式下,无论是否存在EOP,Intel ME都会随时接受HMR FPO。所以,如果制造商没有关闭制造模式,攻击者就随时可以更改Intel ME。当然,要更改Intel ME,还需要管理员权限,但即使是OS内核在最初也无法重新刷新Intel ME。在这一阶段,攻击者可以重新刷新ME映像,利用例如INTEL-SA-00086的漏洞。然后,通过重启来运行修改后的固件。这一过程在除Apple MacBook之外的绝大多数平台上都能够成功实现。而Apple的计算机上包含UEFI中的额外检查,将在UEFI启动时运行,如果已经使用HMRFPO打开了ME区域,那么该机制将会阻止系统的启动。但是,正如我们所展示的那样,如果Intel ME处于制造模式,就能够轻松绕过这一机制。

在不重置主CPU的前提下重置ME

如今的计算机,可以通过几种不同的方式重新启动。根据文档上的记载,有全局复位和仅重置主CPU(不重置ME)这两种方法。但是,如果有一种方法可以在不重置主CPU(通过预先运行HMRFPO命令)的情况下重置ME,那么就可以成功访问该区域,并且保证主系统的继续运行。

在经过对内部ME模块的仔细研究后,我们发现有一个HECI命令“80 06 00 07 00 00 0b 00 00 00 03 00”(关于更多命令,请点击参考

)能够仅对Intel ME进行复位。在制造模式下,即使是在EOP之后,也可以随时发送此命令:

因此,攻击者在发送这两个HECI命令之后,就可以打开ME区域,并在其中写入任何数据。这一过程不再需要对平台整体进行重置。并且,此时SPI描述符中的内容已经被忽略,因为如果系统在制造模式下运行,SPI区域的正确设置保护属性将无法再保护ME不被修改。

漏洞利用案例:CVE-2018-4251

我们分析了多个制造商的平台,包括联想和Apple的笔记本电脑,发现在Yoga和ThinkPad计算机中没有出现任何与制造模式相关的问题。但是,我们发现使用了Intel芯片组的Apple笔记本电脑正在制造模式下运行。在向Apple报告了这一问题之后,该漏洞(CVE-2018-4251)在macOS High Sierra的10.13.5更新中实现了修复。

INTEL-SA-00086的本地利用

通过对CVE-2018-4251进行漏洞利用,攻击者可以将旧版本的Intel ME(例如包含INTEL-SA-00086的版本)写入内存,而无需SPI编程器,也无需访问HAD_SDO网桥。简而言之,这一过程不需要再物理访问到电脑。因此,就可以利用本地的攻击向量来实现漏洞利用,从而使得能够在ME中运行任意代码。

值得注意的是,在INTEL-SA-00086安全公告中,Intel没有提到启用制造模式进行本地利用的这种漏洞利用方式。相反,该公司错误的生成,只有在SPI区域的访问设置配置错误时才可能进行本地利用。因此,为了保护用户的安全,我们决定公开检查制造模式状态的方法,并公布禁用制造模式的方法。

防护方法

Intel系统工具中包括一个MEInfo(以及分别用于移动和服务器平台的TXEInfo和SPSInfo),通过这一工具可以获得有关ME当前状态和整体平台状态的全面诊断信息。我们在之前的研究中,证明了这个实用程序能够检查未记录的HAP模式(High Assurance Platform),同时能够禁用ME。当使用-FWSTS标志对其进行调用时,该实用程序会显示HECI寄存器的详细描述和制造模式的当前状态。当FWSTS状态寄存器中的第四位为1时,证明制造模式启用。

此外,我们还开发了一个程序,用于检查制造模式的状态,以便提供给无法使用Intel ME系统工具的用户。以下是该脚本在开启了制造模式的系统上运行后的显示结果:

接下来的一个问题就是,如果制造商没有关闭制造模式,那么用户如何自行关闭呢?

要禁用制造模式,可以使用FPT中的一个特殊选项(-CLOSEMNF)。此外,这一选项还允许为描述符中的SPI闪存区域设置推荐的访问权限。

下图为输入-CLOSEMNF后的显示内容:

在这里,我们使用-CLOSEMN的NO参数来避免平台的重启,否则在关闭制造模式后,平台将会立即重启。

总结

我们的研究表明,Intel ME存在制造模式未关闭的漏洞,即使是像Apple这样的大型厂商也没能避免受到Intel平台错误配置漏洞的影响。更糟糕的是,由于没有关于这一模式的官方文档记录,直接导致最终用户不知道自身可能遭受数据被盗、永久性Rootkit,甚至是设备变砖的风险。

我们还怀疑,由于BIOS/UEFI和ME的状态没有及时同步,在不重置主CPU的情况下对ME进行重置,还可能会导致其他的安全问题。

参考文章

[1] https://www.intel.com/content/www/us/en/security-center/advisory/intel-sa-00086.html

[2] https://github.com/chipsec/chipsec

[3] https://www.coreboot.org/

[4] https://github.com/ptresearch/me-disablement/blob/master/How%20to%20become%20the%20sole%20owner%20of%20your%20PC.pdf

[5] http://blog.ptsecurity.com/2017/08/disabling-intel-me.html

[6] https://github.com/ptresearch/mmdetect

[7] https://2016.zeronights.ru/wp-content/uploads/2017/03/Intel-BootGuard.pdf%22

[8] https://www.blackhat.com/docs/eu-17/materials/eu-17-Sklyarov-Intel-ME-Flash-File-System-Explained.pdf