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