在近期举行的Black Hat Europe会议上,研究人员提到了英特尔管理引擎11(Intel Management Engine 11)中的漏洞,攻击者一旦利用该漏洞绕过传统的基于软件的防护措施,即便计算机关机!也能够进行攻击。
简介
1、Intel ME简介
Intel ME作为一项专利技术,由集成在平台控制器中心(PCH)芯片中的微控制器和一组内置外设组成。
2015年开始,x86指令集的LMT处理器内核已经集成到PCH中。
图1. ME核心的LMT2 IdCode
ME也是英特尔Boot Guard信任的基础,它可以防止攻击者将其代码注入到UEFI中。ME的目的是初始化平台并启动主处理器,它可以全面访问USB设备,同时还可以拦截和修改网络数据包以及图形卡上的图像。
2、Intel ME中的漏洞简介
最早被熟知的漏洞是Ring-3 Rootkit。
攻击者将代码注入到UMA内存的一个特殊区域,Intel ME卸载当前未使用的内存页面。在英特尔推出了UMA保护之后,现在这个区域用AES加密,ME存储每个页面的校验和,当页面返回到ME的主存储器时进行检查。
2010年,Vassilios Ververis在GM45中也提出了针对ME执行的攻击方法,通过使用“零接触”配置模式(ZTC)绕过AMT授权。
攻击媒介
ME使用的大部分数据都是由英特尔授权的,当然,ME与用户之间仍然有一些交互:
1、HECI
HECI是一个独立的PCI设备,作为在主系统和ME之间交换消息的循环缓冲区。 由于ME内部的应用程序可以注册他们的HECI处理程序,这就增加了潜在的安全威胁(CVE-2017-5711)。不过,苹果电脑默认禁用HECI。
2、网络(仅限vPro)
AMT是一个大型的模块,它集成了众多不同层次的网络协议。这个模块包含大量的遗留代码,但只能在业务系统中找到。
3、硬件攻击SPI接口
在研究ME的时候,我们尝试在SPI闪存仿真器的帮助下绕过签名验证。
这个专用的设备看起来像普通的SPI闪存,但是每次访问时都可以发送不同的数据。这意味着如果在开始时数据签名被检查并且重新读取数据,则可以将代码注入到ME中实现攻击。
我们在固件中没有发现这样的错误,即首先读取数据,然后验证签名。当再次访问时,检查数据以确保它与第一次读取的数据相同。
4、内部文件系统
ME使用SPI闪存作为主文件存储系统。
文件系统有一个相当复杂的结构,许多特权进程将其配置文件存储在其中。因此,文件系统似乎是一个潜在的受害区域。
5、潜在的二进制模块攻击媒介
(1)选择一个模块进行分析。
МЕ操作系统实现了类似Unix的访问控制模型,区别在于控制是基于每个进程的。用户ID、群组ID、可访问硬件列表和允许的系统调用都是为每个进程静态设置的。
图2.进程的静态规则示例
结果是只有一些系统进程能够加载和运行模块。父进程负责验证其子进程的完整性和设置特权。当然,一个风险是,一个父进程可以给子进程设置很高的特权,以绕过限制。 一个能够产生子进程的进程是BUP(BringUP)。在对BUP模块进行逆向工程的过程中,我们在Trace Hub设备初始化函数中发现了堆栈缓冲区溢出漏洞。
文件/home/bup/ct是未签名的,使我们可以借助Flash Image Tool将修改后的版本转移到ME固件中。
现在我们可以在一个大的BUP初始化文件的帮助下,在BUP过程中引起缓冲区溢出。但是利用这个需要绕过防止堆栈缓冲区溢出的机制。
图3.堆栈缓冲区溢出漏洞
(2)绕过堆栈缓冲区溢出保护。
ME实现了一个经典的方法来防止堆栈中的缓冲区溢出堆栈cookie。实施情况如下:
因此,需要在开发预测cookie值或在检查cookie完整性之前进行控制。进一步的研究表明,随机生成器中的任何错误都是致命的。
查看溢出之后和完整性检查之前调用的函数,我们发现名为bup_dfs_read_file的函数间接调用memcpy,它反过来从命名为Tread Local Storage(TLS)的结构中获取目标地址。
值得注意的是,BUP函数使用系统库服务来访问共享内存。换句话说,读写功能通过共享内存机制获取并记录数据。但是这个数据除了BUP之外没有其他用处,所以使用这个机制可能会引起人们的注意。
内存是共享的,因为负责MFS交互的BUP代码的一部分是从另一个模块(文件系统驱动程序)复制的,在这里使用共享内存是合理的。
图4.调用memcpy函数
图5.从TLS获取地址
在缓冲区溢出的情况下,TLS的这个区域可以被文件读取功能覆盖,这可以用来绕过缓冲区溢出保护。
(3)Tread Local Storage。
访问TLS由gs段注册表调解,结构如下所示:
图6. TLS结构
图7.获取TLS字段
gs指向的段不可写入,但TLS结构本身位于堆栈的底部,在存在限制的情况下仍可以对其进行修改。
所以在缓冲区溢出的情况下,我们可以覆盖TLS中SYSLIB_CTX的指针并生成新的这样的结构。由于bup_dfs_read_file函数的功能,我们可以得到任意的写入能力。
(4)使用read函数来获得任意的写入原语。
bup_dfs_read_file函数以64字节块的形式从SPI-flash中读取数据,因此可以在一次迭代中覆盖指向SYSLIB_CTX的指针,在下一次迭代期间,sys_write_shared_mem函数将提取我们创建的地址并将其传递给memcpy作为目的地址。这样做,我们可以得到一个任意的写入原语。
图8.迭代读取bup_dfs_read_file中的文件
ASLR的缺失使我们能够使用任意写入原语覆盖返回地址,并劫持程序控制流程。需要说明的是,堆栈不可执行。
但是,BUP可以产生新的进程并负责检查模块签名。所以需要使用面向返回的编程(ROP),我们可以创建一个拥有所需权限的新进程。
(5)可能的攻击向量。
要成功利用此漏洞,我们需要对MFS或整个Intel ME区域进行写入访问。供应商应该阻止对ME地区的访问,但大多数都没有这样做,这种配置错误使得系统易受攻击。 通过设计,Intel ME允许通过HECI从BIOS发送的特殊HMR-FPO消息写入ME区域。攻击者可以通过利用BIOS漏洞发送这样的消息,如果ME处于制造模式,或者通过DMA攻击,则可以直接从OS发送消息。 具有物理访问权的攻击者总是可以用自己的映像(通过SPI编程器或安全描述符跳过跳线)覆盖,导致平台完全受损。 最常见的问题之一就是能否进行远程开发。如果符合以下条件,则可以进行远程开发:
另外请注意,在启动过程中,ROM不会检查固件的版本,从而使攻击者以最新的系统为目标,恶意地将ME降级到易受攻击的版本。
结论
该漏洞的编号分别为INTEL-SA-00086(CVE-2017-5705,CVE-2017-5706,CVE-2017-5707),漏洞描述包含以下信息: CVSSv3评分:
8.2 High AV:L/AC:L/PR:H/UI:N/S:C/C:H/I:H/A:H
受影响的产品:
研究中最重要的发现是在Intel ME中运行任意代码的漏洞。这种漏洞有可能危及包括英特尔保护音频视频路径(PAVP)、英特尔平台信任技术(PTT / fTPM)、英特尔Boot Guard和英特尔软件防护扩展(SGX)在内的多种技术。 利用在bup模块中发现的漏洞,我们可以打开PCH红色解锁机制,通过DFx链打开对所有PCH设备的使用权。
换句话说,就是使用JTAG。我们可以获得对其内部JTAG接口的访问,通过这样的访问,可以调试在ME上执行的代码,读取所有进程和内核的内存,并管理PCH内的所有设备。
我们最终发现了大约50个内部相关设备,在这些设备中,只有ME有完全的访问权限,而主处理器只能访问其中一小部分。