[本文所有内容均来自于对周振柳博士出版的《计算机固件安全技术》一书的摘抄、引用和归纳,如有侵权,请联系删除]
1.引言
1.1 固件和BIOS概念
1.1.1 概念
- 计算机固件是计算机系统中不可缺少的底层基础系统,往往以软件形式固化存储在硬件芯片中。
- BIOS:计算机主板上最重要最核心的计算机固件。
- 固件常常存储于计算机或外部设备的可编程只读存储器(Programable Read-Only Memory,PROM)中。固件常用于对硬件设备进行配置以完成指定功能,或者为操作系统提供硬件操作接口。一些固件也可能成为操作系统内核的一部分,为操作系统的其他部分提供基本服务,并运行于特权模式下。**外围设备(显卡、网卡等)**上也存在固件,用于初始化、驱动这些设备,为操作系统提供操作接口。
- 1996年以后,固件存储逐渐从ROM芯片转换成flash芯片,特征是
- 芯片容量增大,越来越多应用加入到固件中;
- 操作系统运行过程中,通过指定技术直接对固件芯片中的内容进行更新写入。
- 引入更多安全风险。
1.1.2 功能及地位
- 开机自检:计算机开始时BIOS获得系统控制权,BIOS检查CPU是否工作正常,并检查定时器,中断控制器等的状态,以及基本内存,串并口,键盘,显卡等,发现问题将给出提示信息或鸣笛警告。
- 系统初始化:填充相应寄存器的值。
- 提供常驻内存的运行时服务:操作系统和应用程序通过中断方式调用这些服务代码,如Int 10h,Int 13h,Int 15h等。
- 系统设置:提供文本或图形界面的设置程序(BIOS setup),如设置BIOS密码,引导顺序,系统时间等。参数记载在非易失性存储体中,如CMOS芯片或flash芯片的扩展系统配置数据区。
- 引导操作系统:按照设置的启动顺序,查找到有效启动记录后,读入操作系统引导代码,然后将系统控制权交给引导代码,并由引导代码来完成操作系统的装载启动。
1.2 发展及现状
- 1981年第一个BIOS产品
- 2003年,Intel发布新一代BIOS产品新规范:扩展固件接口(EFI)
- 2007年~,Intel联合Microsoft,IBM,Hp,AMI,Dell,Phoenix,AMD 等厂商推动行业规范:UEFI
- 产品:BIOS产品一直由Phoenix,AMI,Award三家公司垄断。
2.计算机固件发展与技术基础
2.1
2.1.1 演变
8086/8088时:CPU加电后第一个动作,就是设置代码段寄存器CS,数据段寄存器DS,附件段寄存器ES,堆栈段寄存器SS的初始值等于0FFFFh,设置指令指针寄存器IP的值为0000h,从而将指令指针指向了物理地址0FFFF0h,从该地址取得第一条CPU将要执行的指令。
当时中央处理器只有20跟地址线,最大寻址空间是2^20bits = 1MBytes,即00000h~0FFFFFh.从CPU加电令指令指针指向的0FFFF0h地址到最大地址空间0FFFFFh地址,这之中仅有16字节的空间,放不下足够固件BIOS初始化代码段,因此存放在这里的起始指令是一条长跳转指令:
FFFF:0000 EA5BE000F0 JMP FAR PTR 0F000:E05Bh
CPU加电后,首先从BIOS中取得这条长跳转指令,执行这条指令,从而跳转到前端空间的指定位置(0FE05Bh),从该位置处取得下一条将要执行的指令继续执行。
中央处理器进化到32位后,其寻址空间增加到了4GB,然而却仍然保留了CPU加电后的指令指针设计特性,即CPU加电后读取的第一条指令仍然存放在4GB空间的最后一个16字节的起始位置,物理地址为0FFFFFFF0h。
这些固化在计算机主板上芯片中的固件BIOS代码的存放区域,虽然是独立存储在芯片中,占用的却是统一的计算机内存地址区域,通常就是内存的最高段的地址区域,这部分内存区域通常也称为影子内存。
2.1.2 传统BIOS缺陷
- 运行在16位实模式下。
- 芯片厂商希望有统一的固件驱动模式和接口,由芯片厂商自行开发出在不同厂商固件BIOS上都能运行测试的驱动,而非由固件BIOS厂商来定制和集成,以加快PC硬件研发的速度。
- 安全考虑欠缺。
2.1.3 新一代固件EFI/UEFI
Intel定义了EFI驱动程序(EFI Driver)和EFI应用程序(EFI Application)结构,允许硬件开发商,操作系统开发商,应用软件开发商以及普通用户从外部存储设备中加载各自开发的硬件驱动程序和固件应用程序。另外,还提供了固件层次的程序调试诊断工具和调试运行仿真环境;定义了统一的引导服务(Boot Services)和运行时服务(Runtime Services)以满足固件和操作系统两个层次的功能调用需求;并且它在运行阶段,很早就从中央处理器加电默认的实模式切换到32位保护模式下运行。
2.2 固件产品和技术研发状态
2.2.1 公用固件产品
三足鼎力:Phoenix、AMI、Award。
2.2.2 开源固件BIOS项目
- TinyBIOS
- OpenBIOS
- LinuxBIOS
- Bochs
2.2.3 我国计算机固件产品研发现状
联想、方正、长城、浪潮等国内计算机或主板大厂商,其计算机或主板上固件BIOS都需要向专业固件BIOS厂商取得授权,并请固件BIOS厂商作必要的技术协助,针对计算机硬件平台特性作必要的修改和移植工作。
2.3 固件开发基础技术与规范
2.3.1 硬件体系架构
北桥芯片负责内存、显卡、CPU之间的集成或连接,南桥芯片负责PCI 、IDE、USB、SATA存储设备以及键盘鼠标网卡等外围接口的集成或连接处理。
初始化包括:中央处理器CPU初始化、内存初始化、系统芯片组初始化。
2.3.2 总线接口规范
为了简化硬件电路设计、简化系统结构,常用一组线路,配置以适当的接口电路,与各部件和外围设备连接,这组共用的连接线路被称为总线。总线一般有内部总线、系统总线和外部总线。
计算机传统固件BIOS发展过程中,其中涉及一些规范是需要硬件厂商、固件BIOS厂商以及操作系统厂商通力合作,在各自的产品中都能够遵循同一个规范,使得硬件、固件和操作系统能够协同一体工作完成某些功能要求。
- ACPI规范
计算机固件产品必须能够产生各种ACPI Table,并且向操作系统报告ACPI Table的内存占用情况。而各种外围设备、控制器(软盘、硬盘、光驱、网卡等)则需要随时将自身的电源使用及开关状态记录在ACPI寄存器中,主板中的传感器也会随时将各芯片的最新电压、温度等参数通过ACPI表格和SMBus总线回传给操作系统。固件还要为系统在各种不同状态下的启动设计和选择正确的路径。
对于固件开发者来说,重要的是建立各种ACPI表格,根据平台特性收集并填写周边设备的ACPI信息;了解主板布线结构,设计必要的ASL语言代码等。ASL代码可由微软提供的ASL编译器编译生成AML目标代码,存储在固件产品运行时构造的ACPI Table中。 - SMBIOS(System Management BIOS)
SMBIOS规范规定了在x86系统架构下,主板和系统制造商如何通过固件BIOS扩展接口,以标准格式提供产品的管理信息。固件开发者必须遵照规范,收集足够多的平台信息,提供固件扩展接口,以向用户或上层操作系统提供这些信息。SMBIOS信息的核心是一个SMBIOS结构表。该表存在于0F0000h到0FFFFFh内存空间中,以对齐于16字节边界的“SM”标识该表。表内容由表头和表结构信息组成。结构信息的内容包含最多128类的信息,由Type0到Type 127.
固件运行时要尽可能多地收集和填写规范中的这些信息,并且实现SMBIOS结构信息访问存取的接口函数。这些接口函数通常用于操作系统向固件索取这些系统信息。
4.BIOS安全漏洞及威胁研究
CVE:全球信息安全界对计算机安全漏洞和脆弱性统一命名的权威知识库。
主要的10类安全漏洞:
BIOS远程开机漏洞
BIOS定时开机漏洞
ChipAwayVirus 漏洞
磁盘恢复精灵漏洞
Phoenix Net漏洞
BIOS弱口令漏洞
CVE-2002-2059
CVE-2005-0963
CVE-2005-4175
CVE-2005-4176
5.计算机固件BIOS安全检测方法与实现
安全检测包括:BIOS系统漏洞检测和BIOS系统恶意代码检测。
5.1 安全检测负责性
安全漏洞:需要针对不同的安全漏洞,提取该漏洞存在的特征,包括漏洞代码的特征、漏洞存在的环境特征(如系统或软件版本号、补丁状态、配置参数等),建立漏洞库,通过特征匹配的方法实现对漏洞的检测。BIOS系统存在于flash芯片中,BIOS漏洞所有特征的提取,只能通过对flash芯片的二进制映像文件分析得到。
恶意代码: 包括对原始BIOS代码的篡改、插入新代码、增加新的非标准BIOS模块。
BIOS产品代码演化过程:
{BISO厂商}
:基础BIOS代码
{主板厂商:平台化}
:主板BIOS代码
{主机厂商:客户化}
:主机BIOS代码
5.2
两种可用的安全漏洞自动检测方法:
基于漏洞库的漏洞扫描:发现漏洞后,能够提取漏洞的代码特征或者环境特征,将所有被发现的漏洞及其特征存储成漏洞库(决定检测结果完备性和准确性,完备性依赖于漏洞库中漏洞的数量和质量,而准确性则依赖于漏洞库中的漏洞特征是否有效,是否能够唯一确定和识别漏洞,而不会出现大量的错报和误报),通过特征匹配的方法实现漏洞自动扫描。是一种静态检测方法。
基于缺陷注入的漏洞测试:通过典型边界输入值或者模拟攻击,发现漏洞存在,是一种动态检测方法,通常在系统或软件运行过程中实施。
通过收集不同BIOS厂商、不同计算机BIOS产品样本,对BIOS二进制映像文件进行模块分解,解压缩,利用反汇编技术(IDA Pro工具)进行漏洞特征分析、提取、验证,最终获取已发现的BIOS安全漏洞的特征。漏洞特征主要包含两种形式:特征字符串和特征二进制码。特征字符串通常包括同漏洞存在相关联的字符串信息,如BIOS版本号、BIOS ID、BIOS厂商信息、表格头部特征信息、提示和界面信息等。特征二进制码则是通过反汇编从模块代码中提取的一处或多处最能代表漏洞存在的二进制指令码序列。在BIOS漏洞库中,漏洞的特则往往是以多个特征的与组合构成,成为漏洞的特征组。
5.3 基于语言的固件恶意代码检测(签名?)
基于语言的安全验证是指,当从一个非信任源获取并装载可执行代码时,在代码执行前,要求同时装载该可执行代码附带的一个安全证书,通过对证书的验证以证明代码的执行将会是安全的。可执行代码的安全证书由代码提供者在编译代码时通过编译器自动生成。
5.5 BIOS产品结构分析
BIOS在flash芯片中的存储是按照类似于一个简单的文件系统来构成的,其构成的最小成分是模块。不同厂商BIOS产品flash映像文件的结构都不一样。而且,为降低成本,减少占用的存储空间,许多模块经过压缩存储。因此,对BIOS进行漏洞扫描和恶意代码检测,都需要首先将BIOS的flash映像文件解析成模块,对压缩的模块再进行解压缩,才能得到真实的数据和代码。