system: [SYSTEM]

user: 4. 基于UEFI固件的攻击检测系统的模块设计与实现 4.1. BIOS镜像解析模块的设计与实现 BIOS镜像解析模块需要完成的任务包括获取BIOS镜像文件，对BIOS进行模块分解，将压缩的部 图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 图4. UEFI BIOS镜像文件结构层次图 图5. FFS首部格式 图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所示。 图7. 系统BIOS信息显示效果 Table 1 EPS table structur offset name length description 00H 字串锚 4 BYTEs “_SM_”，指定为四个ACSSII码(5F 53 4D 5F) 04H EPS校验和 BYTE 05H EPS长度 BYTE EPS表的长度 06H SMBIOS主版本 BYTE 07H SMBIOS次版本 BYTE 08H 最大结构大小 WORD 最大的SMBIOS结构的大小 0AH EPS修正 BYTE 0BH-0FH 格式化区域 5 BYTEs 10H 中间锚串 5 BYTEs “_DMI_”，指定为五个ACSSII码(5F 44 4D 49 5F) 15H 中间校验和 BYTE 16H 结构表长度 WORD SMBIOS结构表的总长度 18H 结构表地址 DWORD SMBIOS表的起始物理地址 1CH 结构表数量 WORD SMBIOS结构表的总个数 1EH SMBIOS BCD修正 BYTE 表1. EPS表结构 Table 2 Part of the BIOS table format are offset name length value description 00H Type BYTE 0 BIOS信息指示 01H 长度 BYTE Varies Type0格式区域的长度 02H 句柄 WORD Varies EPS表的长度 04H 厂商 BYTE 01H BIOS供应商的信息， 一般为01H代表在字符串域中的第一个字符串 05H 版本 BYTE 02H BIOS的版本信息， 一般为02H代表在字符串域中的第一个字符串 06H BIOS起始地址段 WORD Varies 08H BIOS发布日期 BYTE 03H 一般为03H，代表在字符串域中的第三个字符串 09H BIOS ROM大小 BYTE Varies 表2. 部分BIOS表格式区域 BIOS镜像解析模块和计算机系统信息模块是系统通过固件层实现的主要模块，其他模块的实现相对简单，由于篇幅问题，在此暂时不作介绍。