APP下载

基于统一可扩展接口的固件安全性分析

2021-03-31宋桂成

微型电脑应用 2021年3期
关键词:固件驱动程序控制权

宋桂成

(河南省统计局, 河南 郑州 450018)

0 引言

传统BIOS采用汇编语言编写,编写难度大,很难对BIOS的功能进行补充,在硬件兼容性、自身安全性以及可扩展性方面存在较多缺陷。随着时间的推移,传统BIOS已经严重制约了计算机的创新。2003年,Intel 设计并提出新一代固件标准:统一可扩展固件接口[1](Unified Extensible Firmware Interface, UEFI)。与传统BIOS相比,UEFI全部使用C语言进行编码,为驱动和应用程序提供了良好的接口规范,方便厂商根据需求编写驱动程序,具有良好的可扩展性,此外,还提供了健全的文档规范和丰富的接口协议。

然而正是由于UEFI的丰富接口,新的标准为攻击者编写恶意驱动带来了更多的可能,UEFI固件安全形式变得日益严峻。随着UEFI的应用,UEFI变得越来越复杂,更多的安全组织开始对UEFI进行研究。2016年Anibal Sacco和Alfredo Ortega在CanSecWest安全会议上展示了一种UEFI攻击方式[5]。他们通过向UEFI中植入一小段代码来获得计算机系统的控制权。2017年Alex Matrosov和Eugene Rodionov在Blackhat ASIA安全会议上展示了一种全新的UEFI攻击技术[9],他们针对不同固件厂商的固件实现漏洞,向SPI Flash插入一段Rootkit代码,从而完全获取受害者计算机的控制权。在2017年Blackhat Vegas安全会议上[8],Cylance通过逆向分析的技术,针对不同厂商的UEFI引导配置模块,找出UEFI引导配置的安全漏洞,实现了UEFI引导过程的Rottkit攻击。2017年,Ulf Frisk针对UEFI的预启动[9],使用直接内存访问(Direct Memory Access,DMA)技术,通过挂钩引导服务函数SignalEvent(),成功修改操作系统引导程序。对UEFI的安全引导过程进行攻击。

本文以UEFI开源规范为基础,针对UEFI安全引导模型进行分析,详细阐述了可能存在的安全风险以及典型的漏洞利用方法,给出了面向UEFI的典型漏洞利用范式,并提出了SMI信号抑制和Speed Racer两种基于SPI Flash的漏洞利用方法。

1 UEFI技术概述

1.1 UEFI架构

UEFI是Intel为PC固件的体系结构、接口和服务提出的建议标准[2]。它为操作系统和固件提供了标准接口,能够在硬件发生变更时为固件提供准确的信息,保证操作系统的运行不受影响。它在启动过程的主要功能是:(1) 充当固件可信执行的初始节点,能够对固件的其他节点进行完整性校验;(2) 对硬件进行初始化以及测试工作;(3) 加载执行额外的固件模块;(4) 选择引导设备,加载并执行操作系统引导程序;(5) 退出UEFI服务,启动操作系统。

除此之外,UEFI具有强大的可扩展性。UEFI通过模块化设计将其功能分为硬件控制部分和操作系统软件管理部分。其中,主板厂商利用操作系统软件管理提供的编程接口,根据自己的需求实现丰富的功能。UEFI的体系架构,如图1所示。

图1 UEFI体系架构

从图中可以看到UEFI与固件、操作系统和操作系统引导程序(UEFI OS Loader)之间的层次关系。UEFI是操作系统和平台固件之间的纽带,它提供系统化的标准方法,能够加载驱动并管理他们之间的交互。

1.2 UEFI启动流程

UEFI采用模块化设计,其系统引导过程包括六个阶段,UEFI的启动流程,如图2所示。

图2 UEFI启动流程

SEC(Security)阶段:SEC是UEFI系统开始执行的第一阶段。它用于处理不同的平台复位事件。SEC是系统安全的根节点,为系统启动固件提供控制节点。SEC的优点在于它可以提供基础安全锚点,UEFI通过该锚点构建完整的安全引导验证过程。SEC阶段运行结束后找到下一引导进程,并将控制权进行转交。

PEI(Pre-EFI Initialization)阶段:PEI阶段是UEFI的核心部分。它由PEI Foundation(PEI基础)和PEIM(初始化模块)组成,其中初始化模块是存储于ROM中以压缩形式保存的二进制代码块,PEI Foundation为初始化模块提供调度以及公共核心服务。PEI阶段的主要任务是对CPU和主存进行初始化,同时将平台固件信息传递给DXE阶段。

DXE(Driver Execution Environment)阶段:DXE阶段主要完成大多数的系统初始化工作。DXE阶段通过HOB(Hand-off Block)查询平台相关信息,并为驱动程序搭建完整的运行环境。DXE内核提供一系列的启动时服务(boot service)和运行时服务(runtime service),该阶段的DXE调度内核对DXE驱动程序和外部设备驱动程序进行枚举。UEFI允许驱动程序来源的多样性,为了保证平台的完整性与安全性,UEFI必须对固件采取散列和加密认证的方式保障固件的合法性。DXE阶段结束后,将控制权转交给BDS阶段。

BDS(Boot Device Selection)阶段:DXE结束后,BDS阶段得以运行。它负责执行符合UEFI驱动模型的所有驱动,初始化操作系统启动时所需要的设备。BDS为用户提供启动设备选择列表,供用户对启动设备进行设置和选择。根据用户的选择,BDS加载执行OS Loader,加载操作系统并将控制权转交给操作系统。

1.3 UEFI安全引导

对于攻击者来说,引导固件是潜在的攻击目标,面临着很多威胁。安全问题是UEFI规范的重中之重,其主要安全机制是Secure Boot[10]。 UEFI安全引导的主要功能是使用加密(数字签名和哈希)对UEFI映像进行验证,用于保证UEFI启动过程中执行固件的合法性。如图3所示。

图3 UEFI镜像验证过程

UEFI规范规定了基于PKI的平台公钥基础设施,设置了平台安全可信链密钥(PK)。一般来说,PK由设备厂商拥有,可以对平台的其他信任锚进行更改。

除了PK之外,UEFI安全启动还维护着三个额外的信任锚数据库:

(1) 密钥交换密钥(Key Exchange Key,KEK)数据库;

(2) 已允许签名(The Allowed signature)数据库DB;

(3) 被禁止数据库(The Forbidden database)数据库DBx。

KEK由设备厂商拥有,可以对DB或DBx进行修改。DB相当于白名单,存储着所有受信固件映像的数字签名和哈希。如果一个驱动的哈希或数字签名存在于DB,UEFI便允许系统对该驱动进行引导。DBx相当于黑名单,存储着所有不受信任的UEFI映像。对于被加入黑名单的UEFI映像,UEFI拒绝对其加载执行。UEFI利用哈希和数字签名对UEFI固件映像的来源进行保障。简而言之,如果无法确认UEFI映像的合法性,该映像将无法得到执行。更具体的,如果操作系统启动引导器(Boot Loader)无法通过认证,则UEFI将无法对操作系统进行引导。

2 UEFI脆弱性分析

UEFI建立在平台初始化[11]的标准框架之上,在引导过程中,UEFI遵循着PI(Platform Initialization)规范。PI规范允许使用模块化的方法支持芯片和硬件平台的初始化,包括系统初始化、系统引导和引导前的特殊配置需求。UEFI可以在系统的任意位置发现并执行文件。这种系统的引导过程包括一系列的阶段,每个阶段既有自己独特的优势,也包含着不同的风险。

2.1 UEFI驱动程序篡改

DXE阶段是PI规范要求的最终阶段,该阶段由DXE基础框架、DXE调度程序和DXE驱动程序三部分组成。DXE阶段使用HOB查询平台信息,为驱动程序提供运行环境,同时DXE内核可以对设备进行扫描,枚举驱动程序。DXE运行结束后将控制权转交给BDS阶段。

一般来说,驱动程序与应用程序存储在缺乏保护机制的硬盘上,DXE调度程序通过轮寻检测的方式加载驱动程序。UEFI驱动程序具有不同来源,为了确保平台的完整性与安全性,固件的更改必须处于平台制造商的控制监督下。在不同的平台下,都必须严格遵循散列和加密的认证方式。否则,攻击者便可以通过更换驱动、感染应用程序等手段篡改UEFI驱动程序,实现UEFI阶段的恶意驱动执行。

2.2 NVRAM变量篡改

DXE阶段运行结束后,BDS启动管理器可以对UEFI驱动程序进行控制,具有这个阶段的控制权。当BDS启动管理器进行启动管理时,会生成UEFI Shell命令,加载OS Loader,同时启动UEFI驱动程序。它能够配置NVRAM变量,利用SPI Flash 接口完成全局控制,同时控制具体哪一个文件被加载。UEFI驱动程序和相关信息利用NVRAM变量进行传递,同时给出一个可视化列表已备用户查看。BDS启动管理器加载NVRAM变量的启动项,执行启动策略,最终将控制权转交操作系统。

NVRAM变量保存了UEFI驱动和应用程序的默认加载顺序信息。攻击者可以通过更改该变量的方法对NVRAM变量中的UEFI驱动和应用程序引导路径进行篡改,将其指向攻击者已构造好的恶意驱动或应用程序。使得UEFI加载并执行恶意驱动,对系统安全造成破坏。NVRAM变量中还存在操作系统加载器OS Loader的存储路径,UEFI接口能够利用OS Loader的存储路径进行传输信息。在上述的可视化列表中具有对NVRAM变量的查询和修改的权限,因此,在受到攻击时,NVRAM变量中存在的OS Loader路径信息可能被篡改,这样当计算机重新启动后,启动加载项会由OS Loader变成攻击程序,使系统受到攻击,不受用户的控制。

2.3 可信数据库DB篡改

如前所述,UEFI在DXE阶段对UEFI的可执行镜像进行合法性校验,以确定是否加载执行该映像。UEFI的可信数据库DB存放于SPI Flash中,为了防止攻击者对可信数据库进行更改,SPI Flash采用了多个寄存器对其内容进行保护。BIOS_CNTL寄存器和PR[5](Protected Range)寄存器是SPI Flash最主要的两个保护寄存器。

BIOS_CNTL寄存器提供三个保护位[4],分别是BWE、BLE、SMM_BWP。其中BWE为写使能位,如果BWE置1,则用户可以对SPI Flash进行写操作,如果BWE置0,SPI Flash锁定无法进行更改。BLE为锁使能位,用于保证BWE的安全。一旦BLE置1,任何对BWE的操作都会触发SMI(System Management Interrupt)中断,进入CPU的SMM[7]模式。在该模式下,CPU将主动对BWE进行复位操作。SMM_BWP是SMM模式下的写保护位,对BWE提供更强大的保护。当SMM_BWP置1时,BWE将只能通过SMM模式下的系统进行修改。

保护范围寄存器PR(Protected Range)同样可以对Flash芯片进行读写保护,PR寄存器共有32bit,它使用基地址(Protected Range Base)与保护范围偏移(Protected Range Limit)来确定保护范围。在PR寄存器的保护区域内,如果写使能位被设置,将无法对SPI Flash保护区域进行写操作。同样,如果读使能位被设置,保护区域将无法进行读操作。为了防止对PR进行更改,Intel提供HSFS.FLOCKDN ,用于对保护范围寄存器进行保护。一旦该位被设置,将无法对PR寄存器进行更改。

虽然SPI Flash的保护机制非常健全,但在实际应用中,部分主板和固件厂商为了方便固件的升级和维护,相当一部分的设备没有按照保护要求对保护位进行设置,导致SPI Flash的安全性大大降低。经调查[6],仅有6/8005(0.07%)的设备对SMM_BWP进行设置,有4779/5197(92%)的设备没有使用PR寄存器。

3 UEFI漏洞利用方法

UEFI使用安全引导机制来确保所有UEFI可执行镜像的合法性,因此UEFI攻击的主要目标就是UEFI的安全引导验证机制。本文对现有的SMM和Bootkit两种UEFI攻击方法进行了详细的分析及阐述,针对SPI Flash的读写保护机制,提出了SMI信号抑制和Speed Racer两种新的UEFI攻击方法。

3.1 SMM攻击范式

系统管理模式SMM(System Management Mode)[9]是CPU的一种特殊操作模式,SMM面向系统固件,提供孤立于OS的执行环境,具有访问全部内存和外设硬件的最高特权级。SMM模式由SMI中断触发,一旦CPU检测到SMI中断,将立即保存当前状态,进入SMRAM空间,执行SMRAM私有代码,进行系统活动控制和功能处理等行为。防止SMRAM被修改的主要机制是设置D_LCK位,大部分操作平台在启动时设置D_LCK保护位对其进行保护。SMM漏洞是指利用CPU的缓存漏洞对SMRAM进行修改,从而获取SMM权限。

攻击过程,如图4所示。

图4 SMM攻击流程

对于设置了D_LCK保护位的SMRAM来说,攻击者可以通过修改SMRAM地址的方法对D_LCK保护位进行绕过。首先,攻击者采用触发SMI中断的方式加载SMI Handler至CPU缓存区。修改CPU缓存区SMI Handler,并再次触发SMI中断,此时被修改的恶意映像将在CPU的缓存区内执行。由于遵循UEFI规范的设计的部分主板固件代码允许在SMM模式下运行,攻击者可以通过SMM漏洞向SMRAM空间注入Rootkits代码,使得Rootkits代码永久驻留在主板上,并随时可以通过SMI中断激活Rootkits代码。使用这种方法,Ring0级别的安全软件也无法对其检测,即使格式化硬盘也无法将驻留在非易失性存储器中的Rootkits代码清除。

3.2 Bootkit攻击范式

Bootkit是指早于操作系统内核执行的,能够对操作系统内核劫持的攻击技术。UEFI是计算机加电启动后首先执行的代码,在UEFI的BDS阶段,操作系统引导器获取控制权,对操作系统进行引导,成功引导操作系统之后,UEFI执行ExitBootService函数,并将控制权转交至操作系统内核。攻击者可以通过Hook ExitBootSerivice函数的方法,对操作系统内核进行劫持。

其攻击过程,如图5所示。

图5 UEFI Bootkit攻击流程

首先,攻击者刷写Bootkit恶意代码至UEFI。Bootkit代码使用Hook技术挂载ExitBootService函数。随后,在系统的正常启动过程中,拥有控制权的Bootloader加载操作系统内核,并将控制权转交至ExitBootService函数。UEFI执行ExitBootService函数,Bootkit获取系统控制权,完成操作系统内核劫持功能。

3.3 SMI信号抑制攻击方法

在Intel datasheets[3]中,描述了至少一种抑制SMI中断的方法。SMI控制使能寄存器中(SMI Control and Enable Register,SMI_EN)包含着GBL_SMI_EN位,Intel对此位的描述如下:当SMI_EN设置为0,PCH将不再产生SMI中断信号。当SMI_LOCK被设置,GBL_SMI_EN无法进行更改。经调查[6]在8 005台设备中,有3 216(约40%)台的设备没有对其进行设置。

对于没有设置SMI_LOCK的系统,攻击相对简单。攻击过程,如图6所示。

图6 SMI信号抑制攻击流程

假设攻击者具备Ring0权限。首先,攻击者将GBL_SMI_EN设置为0临时禁用SMI,PCH将不再产生SMI信号。之后,设置BIOS_WE为1,现在可以对未受保护范围寄存器保护的闪存区域进行写入访问。攻击者可以绕过保护受信变量的身份验证方案,通过直接读写SPI Flash的方法修改其内容。攻击者可以通过多种方法绕过安全引导机制,对系统的安全造成破坏。本文选择的方法是在可信数据库DB中插入Bootkit的哈希值。随后替换合法的Windows启动引导器并重置系统。在下一次启动的过程中,由于bootkit已通过可信验证成为合法映像,UEFI固件加载bootkit并将控制权转交,实现UEFI层面的恶意代码执行。

3.4 Speed Racer攻击方法

当BIOS_CNTL寄存器中的SMM_BWP位不可用时,可以通过产生中断信号时间差的方法绕过SPI Flash的保护机制。

SPI Flash拥有多个编程位,它们都与闪存的编程操作直接相关。其中,HSFC(Hardware Sequencing Flash Control)为硬件闪存控制器,它用于控制编程操作的大小和类型。FADDR(Flash Address)为闪存地址寄存器,它用于确定编程操作的目标位置。FDATA(Flash Address)为闪存数据寄存器,它用于保存写操作期间写入的数据以及读操作期间读取的数据。设置HSFC寄存器的FGO为1,便可对闪存进行编程操作。

攻击过程,如图7所示。

图7 Speed Racer攻击流程

攻击者可以在一个多内核的系统中选用一对windows内核驱动程序进行操作[8]。首先,攻击者设置一对用户级代理分别向CPU Core1与CPU Core2发送IOCTL(Input Output control)信号。当CPU Core1收到IOCTL信号后,立即设置BIOSWE为0。接着,在BLE保护位触发SMI中断的同时,CPU Core2立即对SPI Flash的写保护位进行操作。CPU Core2通过设置HSFC寄存器FGO位为1的方法打开SPI Flash的写保护,对存储在SPI Flash中的受信哈希值进行恶意更改。通过这种方法,攻击者便可在信任数据库中插入恶意驱动签名,从而绕过UEFI的安全引导机制。

4 总结

本文针对统一可扩展固件接口存在的安全隐患问题,对UEFI自身框架和UEFI启动过程进行分析,提出了三种基于UEFI的攻击方法。同时在现有的UEFI攻击理论和漏洞利用技术的基础上,利用系统管理模式存在的安全漏洞,通过BootKit、SMI信号抑制和Speed Racer三种方法对SPI Flash的保护机制进行绕过,向存有可信数据库DB的SPI Flash注入恶意驱动签名,实现UEFI恶意驱动执行的功能。

本文提出的基于UEFI的SMI信号抑制攻击方式。由于该方法主要利用主板厂商的保护位设置漏洞进行攻击,因此不具有普遍性。下一步工作分析其它UEFI可利用漏洞,提升UEFI攻击的普适性;对于本文提出的基于UEFI的Speed Racer攻击方式,攻击能否成功具有很大的随机性,不能保证攻击的稳定性。下一步的工作主要对该方法进行优化,确保该攻击的稳定性。

猜你喜欢

固件驱动程序控制权
神农科技集团正式接收广誉远控制权
阻止Windows Update更新驱动程序
公司控制权的来源
FF陷控制权争夺漩涡
计算机硬件设备驱动程序分析
上市公司控制权争夺中独立董事的义务——以万华之争为例
基于SHA1的SCADA系统PLC固件完整性验证方法
基于UEFI固件的攻击验证技术研究*
基于固件的远程身份认证
提取ROM固件中的APP