1. 引言
固件(Firmware)是计算机上电后首先执行的一组程序,运行在计算机底层,固化在Flash芯片中,常用于完成配置硬件设备,为操作系统提供硬件操作接口,引导操作系统的启动等功能,被业界称为是连接计算机基础硬件和系统软件的“桥梁”。UEFI (Unified Extensible Firmware Interface,统一可扩展固件接口)是新的固件标准,目前被业界广泛使用。UEFI为固件和操作系统之间的接口制定了新的标准和规范,并为启动操作系统提供了所需的标准环境 [1] 。
BIOS (Basic Input/Output System)的主要功能 [2] 包括:1)开机自检,计算机启动时,BIOS掌握着硬件设备的控制权,首先检查CPU是否工作正常,还包括定时器、可编程中断控制器、基本内存、显卡等的自检工作。2)系统初始化,初始化相应的硬件设备,并对外围设备进行驱动。3)BIOS提供了系统设置功能,用户在进入操作系统之前可以进入BIOS设置界面,对系统的一些参数进行设置,如光盘/硬盘/USB引导顺序、端口使能/禁用等。4)引导操作系统启动,BIOS按照设置中保存的启动顺序读入操作系统引导代码,从而完成操作系统的加载启动。作为连接硬件和操作系统的枢纽,BIOS的安全对计算机至关重要。Flash芯片已经允许在操作系统运行过程中,通过特定的软件技术直接对BIOS中的内容进行刷新写入 [3] ,给用户和系统维护带来了便利,但与此同时也引入了很多的安全风险。
早期,众所周知的CIH病毒 [4] 就是直接向BIOS固件芯片和硬盘中写入乱码,篡改了BIOS中的正常代码,造成计算机无法启动,使用户数据严重破坏并无法还原。1999年,Phoenix公司提出并实现了通过在BIOS固件中嵌入一个代码模块ILS [5] (Internet Launch System),为用户自动连接网络,下载服务软件,启动web服务,后来此项目遭到了抵制,被终止。后来出现了ACPI BIOS rootkit [6] 和PCI rootkit [7] ,分别利用ACPI和PCI在固件中植入恶意代码。文献 [8] 根据UEFI自身和启动过程中存在的安全隐患,提出了基于UEFI存储攻击设备和劫持操作系统内核的两种攻击方式。BIOS攻击的特点:不同于操作系统攻击和网络攻击,针对BIOS的攻击,在操作系统中是找不到的,在硬盘中也是看不到的,传统杀毒软件杀不掉,格式化硬盘或更换硬盘清不了,重装系统也无法去除。BIOS恶意代码驻留在被攻击终端的计算机主板固件芯片中,难以检测和清除。随着信息技术的飞速发展,针对固件的攻击手段越来越多,计算机安全受到严重的威胁,BIOS一旦被植入恶意代码,可能致使整个计算机瘫痪。因此,BIOS攻击检测和防护成为当前亟待解决的问题。目前,对于BIOS攻击检测的研究和分析,国际国内的信息安全领域所做的相关工作还较少,固件安全领域的相关资料也较少,对开展固件攻击检测的研究和实现增加了一定的难度。
文献 [9] 提出了一种BIOS安全检测方法,即进行BIOS完整性度量。文献 [10] 提出对BIOS安全隐患进行扫描,通过匹配安全隐患库特征码,判断BIOS是否存在隐患。本文研究UEFI固件技术并借鉴文献 [9] [10] 的检测方法,设计与实现了一个新的基于UEFI固件的攻击检测系统。本文针对BIOS镜像解析模块所采用的实现方式与以往不同。传统的BIOS,对于不同的类型如Award BIOS,AMI BIOS,Phoenix BIOS等,各厂商的规范不尽相同,BIOS镜像文件的格式处理和模块组成有很大差异,因此以往的BIOS安全检测系统通常是针对一种特定类型BIOS的研究与实现,有一定的局限性。目前,市面上新主板的BIOS普遍支持UEFI规范,不同的BIOS厂商都实现了UEFI规范所定义的接口。UEFI规范定义了新的固件结构,BIOS文件格式遵循UEFI组织发布的PI规范里定义的Firmware Storage Specification。本文系统根据UEFI规范对BIOS镜像文件进行解析,设计与实现基于UEFI固件的攻击检测系统,增加了系统的通用性。而且,传统BIOS检测系统通常采用静态检测技术,本文系统客户端在Windows系统下开发,可以被广泛使用,不仅可以完成BIOS攻击检测工作,也可以使用户对BIOS有更深入的了解和认识。
2. 基于UEFI固件的攻击检测系统总体设计
本系统利用实验室已经实现的基于UEFI的固件木马攻击系统 [11] 来实施向BIOS中植入木马。固件攻击开发系统以原X86平台BIOS为基础,通过利用计算机BIOS中系统管理模式(SMM)的基本原理、接口设计以及SMI中断处理实现,可模拟对计算机固件的攻击。固件木马攻击系统网络拓扑图如图1所示。
固件木马攻击系统验证了木马能够被植入到BIOS中。基于固件木马攻击系统平台,本文所设计的系统主要通过获取BIOS镜像文件并对BIOS镜像进行解析,将BIOS采样和标准模块进行对比,对BIOS进行完整性度量,以此检测BIOS是否被篡改、是否受到木马攻击,并且检测出BIOS的哪一模块受到破坏。被篡改的模块可能隐藏着一定的安全漏洞,需要深入研究,提出防护措施。此外,本文系统利用SMBIOS实现了从固件层获取到计算机系统各组件的信息,包括BIOS、主板、内存、CPU及其他计算机设备的详细信息,对计算机硬件进行状态检测,便于用户监测系统状态,更好地进行攻击检测工作。整个固件攻击检测系统的总体架构如图2所示。
基于UEFI固件的攻击检测系统由客户端和服务器端组成,需要客户端和服务器端进行数据的通信。客户端按照功能划分总体上包含四个模块:BIOS镜像解析模块,基准信息记录模块,计算机系统信息模块和检测分析模块。其中BIOS镜像解析模块是系统的核心模块和系统实现的关键环节,该模块包含的任务有:获取固件层BIOS镜像文件,对BIOS镜像进行模块分解和解压,并获取BIOS各个模块的MD5

Figure 1. Firmware trojan attack system network topology
图1. 固件木马攻击系统网络拓扑图

Figure 2. The overall framework of the firmware attack detection system
图2. 固件攻击检测系统总体框架图
值。计算机系统信息模块显示了BIOS、CPU、内存、缓存等计算机组件的详细信息。检测分析这一模块的功能是将解析后的被测BIOS文件与标准代码样本进行模块MD5值对比,检测BIOS是否被篡改,并具体显示出BIOS的哪一模块发生变化。服务器端利用通信模块与客户端进行通信,接收客户端发出的请求,并给出响应。数据处理模块是对客户端发出的请求进行处理,并对通信数据做加解密工作。木马攻击前的原BIOS叫做标准代码样本,当前不知道是否被攻击的BIOS是被测代码样本,被测代码与标准代码进行对比、检验,才能实现检测功能。因此,标准代码样本库需要安全地备份和存储,显然存储在本地并不安全,我们将BIOS标准代码远程存储在服务器上。服务器端通过数据管理模块对用户的BIOS标准样本和模块MD5进行统一的管理与存储。客户端记录基准信息时将标准BIOS文件和模块MD5值上传至服务器上。当系统调用检测分析模块时,服务器端会返回相应BIOS数据给客户端。
3. 基于UEFI固件的攻击检测系统流程设计
本系统的流程主要是获取到固件层BIOS镜像文件之后,将固件木马攻击之前的原BIOS镜像文件和当前被测BIOS镜像文件进行模块分解,由于BIOS实际是经过压缩、加密后存储在Flash芯片上的,所以需要对压缩存储的模块按照模块长度、压缩算法等进行解压缩,还原为最原始的BIOS二进制文件。对解析出的各个模块计算MD5消息摘要,将目标被测BIOS代码样本的各个模块分别与相对应的标准代码样本模块进行MD5值比较。如果全部一致,说明所有模块都没有变化,与原来代码一样,BIOS并未受到攻击;如果有一个或多个模块对比不一致,说明BIOS受到攻击,MD5消息摘要不一致的模块被破坏。固件攻击检测系统流程图如图3所示。
本系统实现的关键技术在于固件BIOS和操作系统之间的通信。UEFI BIOS系统主要包括8个模块:UEFI BIOS基础代码模块,硬件相关代码包括CPU代码、芯片组代码和设备代码,端口控制代码,兼容支持模块,UEFI OS加载器,固件应用程序,文件系统驱动模块,SMI中断处理模块。其中SMI中断处理模块以及文件系统驱动模块是OS和BIOS通信的桥梁,是本文系统实现的基础。
4. 基于UEFI固件的攻击检测系统的模块设计与实现
4.1. BIOS镜像解析模块的设计与实现
BIOS镜像解析模块需要完成的任务包括获取BIOS镜像文件,对BIOS进行模块分解,将压缩的部

Figure 3. Firmware attack detection system flow chart
图3. 固件攻击检测系统流程图
分进行解压缩得到最原始的BIOS二进制代码,并计算每个模块的MD5消息摘要。这一模块是整个BIOS攻击检测系统的最重要的部分,是实现检测、达到检测目标的基础。BIOS在Flash芯片中是根据规范按照一定固件结构存储的,所有模块保存在固件结构单元中,此外,BIOS厂商为了降低BIOS所需的存储空间,并增强代码的安全性,对BIOS的许多模块进行了压缩。因此,对BIOS模块进行攻击检测之前,首先需要将BIOS镜像文件分解,并对压缩的模块进行解压缩得到原始代码。
UEFI作为广泛使用的新一代BIOS规范,为了方便UEFI BIOS的开发与扩展,为Flash芯片中BIOS镜像定义了新的存储结构。这种固件结构类似于一种文件系统,对固件设备文件的组织和存储进行了明确的规定,UEFI BIOS的每个功能模块都存储在固件结构单元中。在这种规范中,整个BIOS被视为一个FD (Firmware Device),BIOS镜像文件就是一个固件设备文件。FD (固件设备)是一片连续的存储区域,一个FD又分成多个逻辑区块,被称作固件卷。FV (Firmware Volume)是连续的格式化的存储空间,一个FV种又包含一个或多个FF (Firmware File),固件文件保存着FV中存储的数据和代码,是固件文件系统最重要的部分。而一个固件文件中又包含着固件文件段,Firmware File Sections是不连续的段,是特定File Type里的独立部分。UEFI BIOS镜像文件结构层次如图4所示。
固件文件系统(Firmware File System,FFS)描述了在固件卷FV上固件文件FF和空闲空间的组织关系,每个Firmware Volume Image包含Header,FFS Image和Free Space,每个FFS Image包括Header和File Sections。FFS首部的格式如图5所示。其中Type 字段描述了固件文件所属类型,固件文件类型有:PEI核心固件文件、DXE核心固件文件、UEFI驱动文件等多种类型文件。
基于UEFI的固件攻击检测系统,通过读取BIOS所对应的内存地址获取BIOS镜像文件,得到BIOS镜像文件之后,利用UEFI 固件文件规范对BIOS文件进行模块分解,对于压缩存储的FV,根据固件文件段中描述的压缩方式,反向操作对其进行解压缩,便可得到BIOS二进制文件,完成BIOS镜像文件的解析。系统BIOS镜像解析效果如图6所示。
4.2. 计算机系统信息模块的设计与实现
计算机系统信息这一模块是对计算机中重要组件的详细信息进行展示,用来查看和检测硬件状态,便于用户监视系统状态。从此模块中可以获取到的信息有:BIOS基本信息,系统信息,系统外围,处理器,缓存,端口连接器,系统插槽,物理存储阵列,内存阵列映射地址以及系统引导的详细信息。这些硬件信息是通过编程从SMBIOS中得到的,并以直观、易读的文本格式显示出来。SMBIOS (System

Figure 4. UEFI BIOS image file hierarchy diagram
图4. UEFI BIOS镜像文件结构层次图

Figure 6. The BIOS image analytical results
图6. BIOS镜像解析效果
Management BIOS)参考规范描述了主板和系统供应商通过扩展英特尔架构系统上的BIOS接口如何将其产品的管理信息以标准格式呈现。DMI (Desktop Management Interface)是用来收集计算机系统自身以及其外围设备相关数据信息的管理系统,遵循SMBIOS规范,并将收集到的数据信息存在BIOS中。因此,我们可以从SMBIOS中获取到想要的计算机组件信息。在SMBIOS 2.7版本规范中为SMBIOS信息定义的唯一访问方法是基于表结构的方法。
编程实现从SMBIOS读取计算机系统信息的步骤:首先寻找EPS表,获取SMBIOS表的入口地址。SMBIOS中数据的存储结构是由EPS表和SMBIOS表一起来描述的,EPS表结构如表1所示。
在EPS表的16H处存储的是SMBIOS表的总长度,表的18H处存储了SMBIOS表的起始物理内存地址。根据EPS表结构,可以看出,找到“_SM_”并找到“_DMI_”,便找到了EPS表。而“_SM_”和“_DMI_”是用固定的ASCII码代表,很容易找到。找到EPS表后,根据表的18H处就可以得到SMBIOS的内存地址。SMBIOS的首地址是Type 0的存储地址,Type 0描述的是BIOS的基本信息。对Type 0表进行解析并以一定格式读出来,便获得了想要的BIOS信息。SMBIOS表是由多个不同类型的表结构构成的,每一个表结构代表一种计算机组件的信息或者其他类型的系统信息。SMBIOS 2.7版本描述了Type 0 - 42,126和127的表结构。本文所设计的系统只选取其中部分常见的计算机组件信息进行展示。Type 0存储的是BIOS信息,Type 1是系统信息,Type 3是系统外围信息,Type 4是处理器信息,Type 7是缓存信息,Type 8是端口连接器,Type 9是系统插槽,Type 16是物理内存阵列。Type 19是内存阵列映射地址,Type 32是系统引导信息。每个SMBIOS表都具有相同的头结构,每个表又划分为格式区域和字符串区域,字符串区域紧跟在格式区域之后。每个Type表的区域内容有所不同,部分BIOS表的格式区域见表2所示。
在BIOS表的00H处代表Type号,01H中描述了其格式区域的长度,在格式区域之后是其字符串区域。根据表结构得知,字符串区域的第一个字符串描述的是BIOS厂商信息,第二个字符串代表的是BIOS版本,第三个字符串是BIOS发布日期。每一个字符串以00H结束,字符串区域以0000H结束。接着是Type 1的内容,获取其他Type信息的方法和BIOS信息类似,本文不再赘述。本文以一台实验机为例,直接获取到的BIOS信息的展示比较混乱,本文系统通过解析,将BIOS的基本信息以直观、易读的格式化文本形式显示出来,效果如图7所示。

Figure 7. System BIOS information display effect
图7. 系统BIOS信息显示效果

Table 2. Part of the BIOS table format area
表2. 部分BIOS表格式区域
BIOS镜像解析模块和计算机系统信息模块是系统通过固件层实现的主要模块,其他模块的实现相对简单,由于篇幅问题,在此暂时不作介绍。
5. 结束语
当今社会普遍将更多的关注点放在操作系统层的安全上,容易忽略计算机固件层的安全。而针对固件的攻击手段已经越来越多,BIOS作为连接计算机硬件和操作系统的中间桥梁,在计算机中的地位极其重要,一旦受到攻击,将可能致使整个计算机瘫痪。固件攻击造成计算机安全面临严重的威胁,因此,BIOS攻击检测和防护成为当前亟待解决的问题。针对传统BIOS安全检测系统的局限性,本文根据UEFI中固件存储结构规范设计和实现了一种基于UEFI固件的攻击检测系统,增强了系统的通用性。而且,传统BIOS检测系统通常采用静态检测技术,市面上还没有广泛投入使用的BIOS检测工具,本文系统客户端在Windows系统下开发,可以被广泛使用。系统根据UEFI固件文件系统实现了对BIOS镜像文件的解析,检测分析模块将被测BIOS的各个模块的MD5值与服务器中存储的标准BIOS的相应模块进行对比,可以检测出BIOS是否受到攻击,并显示出具体哪个模块受到攻击,定位攻击者的具体行为。此外,系统通过SMBIOS实现了对计算机硬件信息的获取和格式化展示,方便用户检测计算机硬件的状态。