写在前面的话如何入侵一台已关机的电脑?在近日的欧洲黑帽黑客大会上,来自Positive Technologies公司的研究人员Mark Ermolov和Maxim Goryachy跟大家介绍了英特尔管理引擎(Intel Management Engine 11)中存在的安全漏洞,而这个漏洞将允许攻击者访问目标主机中的绝大部分数据和进程。而更加重要的是,在这个漏洞的帮助下,一旦攻击者绕过了传统的基于软件的保护机制之后,他们将能够对已关机的电脑进行攻击。 一、 介绍英特尔管理引擎(Intel ME)是英特尔公司的专利技术,它由一个整合了平台控制器中心(PCH)和一系列内置周边设备的微控制器组成,PCH负责传输处理器和外部设备之间几乎所有的通信流量。因此,Intel ME几乎能够访问计算机中所有的数据。如果攻击者能够在Intel ME上运行第三方代码的话,那么他们就能够完全入侵目标计算机。 我们可以看到,全世界现在有越来越多的研究人员开始关心Intel ME的安全问题了。其中一个原因就是这个子系统正在向新的硬件架构(x86)以及软件平台(修改后的MINIX[1])过度,而x86平台将允许研究人员利用二进制代码分析工具的所有功能。在此之前,固件分析相对来说是比较难的,因为Intel ME早期的版本是基于一种ARCompact微控制器实现的,而这种控制器所提供的一系列指令相对来说也比较陌生。 在此之前,我们几乎是不可能对Intel ME 11进行分析的,因为可执行模块采用了Huffman代码(未知表)进行压缩。但是我们的研究团队成功地恢复了这些表,并且创建了一个专门用于解包镜像的实用工具[2]。 在对可执行模块进行解包之后,我们就可以对Intel ME的软件以及硬件内部结构进行研究了。而通过分析后我们发现,其实Intel ME并不像我们想象中的复杂。 1.1 Intel ME 11概述 关于Intel ME内部结构以及组件的内容可以从参考资料中[1]、[3]、[4]这三篇论文获得。 实际上从2015年开始,LMT处理器核心(x86指令集)就已经被整合到PCH之中了,而这种核心正用于Quark SOC之中: 如何入侵一台已关机的电脑? 图 1.2 Intel ME公布的三个安全漏洞 1.2.1 Ring-3 rootkits 第一个Intel ME安全漏洞公布于2009年,在当年的黑帽黑客大会上,Alexander Tereshkin以及Rafal Wojtczuk曾进行了一次主题为”介绍Ring-3 Rootkits”的演讲,这种攻击需要向UMA内存的特定区域中注入代码。 研究被公布之后,英特尔引入了UMA保护机制。现在这块内存区域已经采用了AES加密,而且Intel ME会在每一个内存页面中储存相应的校验和。当页面返回到Intel ME的主内存区域时,这个校验和将对这些页面进行检测。 1.2.2 Zero-Touch 在2010年,Vassilios Ververis演示了一种针对Intel ME的攻击技术[10],这种技术运用的是Zero-Touch模式(ZTC),而这项技术将能够绕过AMT认证。 1.2.3 Silent Bob 在2017年5月,研究人员公布了一个存在于AMT认证系统中的安全漏洞(CVE-2017-5689)[11],该漏洞将允许未经授权的用户获得目标系统(支持vPro技术)的完整访问权。 因此,总的来说现在只出现了一个允许攻击者在Intel ME内部执行任意代码的安全漏洞。 二、 潜在的攻击向量Intel基本上都会对Intel ME所运用的数据进行签名,但Intel ME仍需要与用户进行一些交互: -本地通信接口 (HECI) -网络(vPro only) -主机内存 (UMA) -固件SPI布局 -内部文件系统 2.1 HECI HECI是一种独立的PCI设备,它可以作为主系统与Intel ME之间数据交换的循环缓冲器。Intel ME中的使用程序可以注册它们自己的HECI处理器,这样将会提升安全漏洞(CVE-2017-5711)的危险系数。在苹果电脑中,默认已禁用了HECI。 2.2 网络(vPro only) AMT是一种大型模块,其中涉及到多种不一样的网络协议。这个模块中包含了大量的遗留代码,并且现在有很多商业系统都在运用它。 2.3 针对SPI接口的硬件攻击 在研究Intel ME的过程中,我忽然想起也许可以运用SPI闪存模拟器来绕过签名验证机制。这种特殊的设备跟普通的SPI闪存看起来很像,但是它可以在每次访问时发送不一样的数据。这也就意味着,如果一开始进行了签名检测然后再读写数据的话,攻击者就可以尝试向Intel ME中注入代码了。 2.4 内部文件系统 Intel ME运用了SPI闪存来作为主文件储存,这种文件系统的结构比较复杂[6],而且很多特权进程都会将配置文件储存在这里。因此,文件系统肯定会是攻击者的主要目标之一。那么接下来,我们就要选择一个代码模块来寻找安全漏洞了。 2.5 选择模块进行分析 Intel ME操作系统实现了类Unix的访问控制模块,user-id、group-id、可访问硬件列表以及允许运用的系统调用都会根据每一个进程来进行静态规则设置: 如何入侵一台已关机的电脑? 图 如何入侵一台已关机的电脑? 图 Intel ME用于保护栈缓冲区溢出的实现如下:
在函数结尾,储存的值会跟已知的正确值进行对比,如果不匹配,则软件发生崩溃,并终止进程; 我们在研究过程中,发现bup_dfs_read_file函数会间接调用memcpy,并返回TLS结构的目的地址。需要注意的是,BUP的读/写函数会运用系统服务来访问共享内容。换句话来说,读取和写入功能可以通过共享内存机制来获得并记录数据。 调用memcpy函数: 从TLS获得地址: 在缓冲区溢出的场景下,这部分TLS区域是可以通过文件读取函数来重写的,而攻击者将能够通过这种方式来绕过缓冲区溢出保护。 2.7 线程本地储存 TLS的访问跟gs段寄存器有关,该结构如下所示: 其中,gs段是不可写入的,而且TLS结构本身位于栈底。因此,为了实现缓冲区溢出,我们需要重写TLS中的指针(指向SYSLIB_CTX),并生成新的结构。根据bup_dfs_read_file函数的工作机制,这将允许我们写入任意数据。 2.8 运用读取函数来获得任意写入原语 bup_dfs_read_file函数不仅可以从SPI闪存中读取数据,而且还可以在迭代过程中修改指针数据(指向SYSLIB_CTX)。而在下一次迭代过程中,sys_write_shared_mem函数将会提取出我们所创建的地址,并将其作为目的地址传递给memcpy。这样一来,我们就能够获得任意写入原语了。 bup_dfs_read_file的部分代码如下: 2.9 可能的漏洞利用向量 为了成功利用该漏洞,我们需要通过特殊的HMR-FPO消息向Intel ME的特定区域写入访问数据[9]。攻击者可以利用BIOS漏洞来发送这种消息,或者直接利用操作系统来发送(Intel ME处于制造模式下),或者通过DMA攻击。 如果下列条件叛族的话,攻击者甚至还可以远程利用该漏洞: 目标平台激活了AMT; 攻击者知道AMT管理员密码,或利用漏洞绕过了验证机制; BIOS没有设置密码保护(或者攻击者知道密码); BIOS开启了ME区域的写入权限; 如果上述条件均满足,那攻击者将能够远程利用该漏洞并访问Intel ME中的数据。 2.10 CVE-2017-5705,6,7概述 这个漏洞分配到的编号为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 受影响的产品[12] 6th, 7th & 8th Generation Intel Core Processor Family Intel Xeon Processor E3-1200 v5 & v6 Product Family Intel Xeon Processor Scalable Family Intel Xeon Processor W Family Intel Atom C3000 Processor Family Apollo Lake Intel Atom Processor E3900 series Apollo Lake Intel Pentium Celeron N and J series Processors 总结本文所介绍的漏洞将允许攻击者在Intel ME中运行任意代码,这种漏洞将会危及到多种英特尔技术的安全性。我们希望本文的研究成果能够帮助更多感兴趣的研究人员了解Intel ME的安全现状。 |