*本文中涉及到的相关漏洞已报送厂商并得到修复,本文仅限技术研究与讨论,严禁用于非法用途,否则产生的一切后果自行承担。
写在前面的话
调试机制是帮助跟踪几乎所有平台上的故障源的标准组件。一般主要在平台生产之前使用,但也经常用于翻新和修复返回的平台。安全研究人员可以多次使用调试特性测试攻击,包括定位和使用JTAG,使用USB调试以及使用debug查找系统管理模式(SMM)中的漏洞。我们进行安全研究,用于计算基础设施的硬件基础创建实用的防御。我们确认,通过USB进行的调试可以访问在UEFI固件和运行时SMM固件中安装持久的rootkit,而这些系统不能安全地设置调试策略( CVE-2018-3652)。这种漏洞将允许具有设备物理访问权限的攻击者可以执行“Evil Maid”攻击。正如其他人所报道的,防范这种类型的攻击是相当困难的。为了提供对这种威胁的可见性,我们为开源的CHIPSEC框架发布了一个模块,以检测脆弱的系统。
保护固件
每次计算机启动时,固件保护机制都必须执行固件以初始化可用配置中的固件,这为软件执行创建了预期的安全环境。如果恶意软件能够更改某些配置,则可以通过在特权模式下执行或重新配置系统,以违反软件正常运行的预期安全环境以及违反安全属性,并将其权限提升到高于其它软件的权限,其中最直接的方法是修改固件。
当然,具有物理访问权限的攻击者可以简单的连接固件编程器就可以修改固件,从理论上来说,这确实需要详细的设备信息,但实际上在大多数情况下这些信息都很容易获取。其根本原因就在于大多数固件存储在串行可编程接口(SPI)闪存芯片上,这就为读取和写入存储芯片创建了物理标准,SPI闪存编程器相对容易购买或创建。为了在不破坏系统的情况下获得访问权限,攻击者还需要弄清楚要改变的内容。然而,有一位研究人员(Dmytro Oleksiuk)却开发了一种通用的概念验证后门,根据这个样本,攻击者可以轻松的将这个后门安装到大多数固件模块中。这意味着,这些工具和技术的易用性和可用性,可使得非专业的攻击者甚至是“脚本小子(script kiddie)”很容易的就可以访问固件rootkit。Eclypsium的安全专家做了一个测试,他们能就在不到4分钟的时间里就在企业所用的笔记本电脑上安装此rootkit,并且实现物理访问,你可以看此视频了解整个过程。
修改固件的另一种方法是通过特权软件,为了防御此类攻击,固件应在引导期间尽早配置与固件存储相关的保护位。完成此操作后,正常的软件(甚至包括提升内核权限的恶意软件)将无法执行固件存储写入,直到重新启动时,固件再次执行保护自身的过程。但是,即便这样,固件仍会以某种方式写入存储器并进行代码和配置更新。这虽然可以通过重新启动来完成,但并不是在所有情况下都可以实现。另外,在运行时期间的SMM中执行的可信代码可用于绕过保护并写入固件存储。据此来看,SMM是攻击者尝试安装持久性固件rootkit的主要目标。
使用SMM固件调试
如上所述,研究人员已经证明通过调试功能可用于查找固件漏洞并直接绕过基于软件的保护。实际上,通过调试功能发现漏洞一直是攻击者最喜欢的方法。研究人员的分析表明,在启用调试机制的系统上,物理攻击会比没有启用调试机制的时候更容易。因为这种情况下攻击者是不需要特殊的固件编程器,也不需要打开程序。通过使用可用的公开工具,他们只需通过插入一个外部USB即可安装持久rootkit,绕过安全启动和许多其他安全功能。
研究人员已经证明可以在SMM中暂停系统并从系统上下文中对内存进行任意更改,这样攻击者就可以获得SMM执行的高级权限。另外,就是通过编写代码来修改固件存储,此类攻击者可以利用现有的固件rootkit来安装持久性恶意软件。虽然这具有重大的安全隐患,但对于调试机制来说,这也是其一个预期的调试目的。不幸的是,有些系统无法在运行中关闭这些调试功能。
调试访问
对于安全人员来说,为了了解系统的风险,重要的是要知道运行系统上是否启用了调试机制。不幸的是,这个了解过程并不容易,对技术的要求很高。为此,Eclypsium的安全专家开发了一个开源CHIPSEC模块来提供帮助,该模块主要检查运行系统上的两个主要组件:
1.CPU调试功能
2.直接连接接口让我们深入到这些检查中,并将其分解为组件。首先,CPU调试功能的状态位于IA32_DEBUG_INTERFACE
模型特定寄存器(MSR)中。在英特尔软件开发人员手册中,我们可以看到此MSR的细分:
如果我们忽略保留位,我们可以看到3个有趣的东西:
1.启用位。
2.一个锁定位。
3.发生调试位。
如果根据此规范,默认情况下,调试是禁用和解锁的。利用发布的chipsec模块,研究人员检查了调试是否被禁用和锁定,而这些调试则是固件在运行中设置的安全配置。通过执行这些模块,检查将通过。另外,研究人员还检查了调试发生位,但根CHIPSEC维护人员的说法,这个检查会发生误报的情况,因此Eclypsium的安全专家决定不依赖于这个检查结果得出检查是否通过或失败的决定。
但是,CPU调试只是调试机制问题的一部分,下一步是检查直接连接接口(DCI)的状态。此功能在之前曾在被研究者利用过,DCI会被记录在每个计算机平台的芯片组数据表中,例如“Intel 100系列和Intel C230系列芯片组系列平台控制器集线器(PCH)数据表第2卷”,名称为“DCI控制寄存器”。
尽管该寄存器似乎存在于由intel制造的芯片组中,但它仅在此特定数据表中记录。在该寄存器内部,在过多的保留位之间,我们找到“Host DCI Enable”
位或HDCIEN。如果启用,芯片组将通过USB提供调试功能。因此,检查非常简单; 安全配置会禁用DCI,该位应为0。只有当上述两项检查都表明没有启用调试功能时,我们才会考虑安全地配置系统并从我们的chipsec模块返回PASSED。至于CPU调试功能MSR中的“Debug Ocured”
位,我们决定遵循CHIPSEC维护者的建议,只有在设置了该位时才显示警告。理论上,它表示在引导期间的某个时刻启用了调试。可以在上的github上找到CHIPSEC我们的模块是debugenabled.py
安装chipsec后,您可以使用以下命令行单独运行此模块:
我们已经观察到一些系统出现故障,但很难知道还有多少系统受到影响。英特尔发布了一份安全公告(CVE-2018-3652),内容涉及一些未安全设置调试策略的系统。如果您的系统受到影响,我们建议您运行检查并亲自查看。
缓解措施
理论上,对固件保护机制是个不错的想法,但现实中,攻击者通过对固件保护机制的修改,可以获取对敏感系统的完全物理控制。如果一个系统未能通过固件保护机制的检查,则即使在非常有限的时间段内,任何人都可以获得系统的物理访问。只需插入USB端口并运行公开的脚本代码,攻击者就可以绕过几乎所有的安全技术。例如,攻击者可能会使用自己开发的恶意软件或rootkit感染固件,而且他们可以在不打开软件的情况下进行操作。
某些系统可能在BIOS或固件设置菜单中具有启用或禁用调试功能的设置。禁用该设置后,安全管理员可以检查该配置是否通过上文提到的`chipsec`测试模块。在这种情况下,使用强密码或其他机制保护这些设置非常重要。
在其他情况下,你可能需要联系系统开发商并询问是否有安全禁用调试访问的版本。
结论
在本文中,Eclypsium的研究人员研究了使用USB调试来绕过安全措施并安装固件rootkit的攻击。虽然应该在系统运行中禁用调试机制,但是目前它仍是进行快速安全检查来确定你的系统是否受到影响的好办法。研究人员希望用他们的研究,帮助组织理解和防御“邪恶女仆”攻击。随着实时嵌入式系统的复杂程度不断提高,低效率的调试方法的成本日益增加。鉴于当前嵌入式应用的复杂性还有继续上升的趋势,对这些系统的调试将成为开发商考虑的关键因素。
原文地址:https://blog.eclypsium.com/2018/07/23/evil-mai%EF%BB%BFd-firmware-attacks-using-usb-debug/