面向新一代固件接口标准的固件模糊测试系统
2014-09-29马佳敏1理1姚颉文2
马佳敏1,潘 理1,姚颉文2
(1.上海交通大学电子信息与电气工程学院电子工程系,上海 200240;2.Intel亚太研发有限公司,上海 200336)
1 概述
计算机固件的执行权限高于操作系统,能实现对所有硬件设备的直接控制,同时也是操作系统安全机制的盲区所在。恶意代码利用固件安全漏洞能轻易劫持操作系统,甚至破坏硬件本身。统一可扩展固件接口(Unified Extensible Firmware Interface,UEFI)[1]是新一代的计算机固件接口标准。UEFI固件超过99%的编码用C语言完成,更是引入了完整的网络协议栈。膨胀的代码量以及基于C语言的实现,均可能导致UEFI固件漏洞数的大幅增加。一些C语言下常见的代码安全漏洞,如缓冲区溢出漏洞、格式化串漏洞等,很可能被恶意代码利用。
目前常见的代码漏洞检测方式有静态漏洞分析和动态漏洞分析2种,其中前者以语法、词法分析为基础,分析被测程序特征,通过匹配漏洞数据库或规则列表的方式定位漏洞[2-4];后者通过执行目标代码,监测异常状态的方式检测漏洞。典型的动态漏洞分析有模糊测试法[5-7]和信息流追踪法[8-9]2种,前者通常包含随机数据生成器,通过大量的测试用例测试目标代码;后者通过监控输入数据在程序执行过程中遗留在内存或寄存器中的痕迹来判断是否有漏洞。静态漏洞分析法检测漏洞的能力取决于对程序特征的描述以及漏洞库的丰富性,局限性过高。动态漏洞分析中的信息流追踪法主要针对缓冲区溢出漏洞,通用性不高。而模糊测试法流程简单、通用性高,在操作系统和网络漏洞检测领域已经获得了广泛应用[10],能有效应用于UEFI固件漏洞检测中。
本文基于UEFI的开源实现平台可扩展固件开发套件(EFI Development Kit,EDK)II[11],设计开发面向UEFI固件的模糊测试系统。本文系统实现为客户端/服务端模式,在服务端通过专门的测试数据生成引擎生成测试数据,客户端为测试用例获取测试数据提供统一的编程接口。该方案所采用的测试逻辑与测试数据生成相分离。通过对比UEFI下自我认证测试系统[12]的代码覆盖率,并以一个实际UEFI固件漏洞为例,说明该模糊测试系统的漏洞检测效果。
2 模糊测试系统架构
模糊测试系统通常由测试框架、功能模块、测试数据生成引擎以及测试用例集构成。其中,测试框架负责自动化执行测试用例,对测试环境进行初始化和清理操作;功能模块为模糊测试系统提供相应功能,如记录系统执行状态,为测试用例提供编程接口等;测试数据生成引擎负责测试数据的生成;测试用例集由针对不同目标代码的测试用例构成,以测试数据生成引擎提供的测试数据为输入,执行目标代码进行测试。
衡量模糊测试系统性能好坏的一个重要标准是代码覆盖率,即测试用例在执行目标代码时,测试数据所通过目标代码占全部目标代码的百分比。测试数据生成引擎提供的测试数据质量高低,很大程度上决定了测试用例的代码覆盖率。好的测试数据有助于触发需要满足特定条件的安全漏洞。而在UEFI环境下实现这样一个测试数据生成引擎代价过高,且很难保证生成测试数据的质量。因此,采用Peach[13]作为系统中的测试数据生成引擎。Peach是开源、通用的智能模糊测试平台,以能生成高质量的测试数据著称。不过UEFI固件对Peach的运行环境支持并不成熟,因此,Peach需要运行在传统的操作系统上。
根据以上分析,将模糊测试系统实现为位于远端主机和目标主机的2个部分,前者负责测试数据的生成;后者负责对由UEFI固件中各个服务、协议构成的目标代码的测试,如图1所示。
图1 模糊测试系统架构
远端主机由运行在操作系统上的测试数据生成引擎Peach和模糊测试服务端构成;目标主机由运行在UEFI环境下的测试框架、模糊测试服务端和测试用例集构成。为了保证整个系统的扩展性和移植性,这里的测试框架使用了UEFI下自我认证测试系统的测试框架。同时为了便于目标主机中的测试用例集获取远端主机中生成的测试数据,实现了由模糊测试服务端和模糊测试客户端构成的模糊测试系统功能模块,前者负责对Peach系统的调度以及测试数据的传递;后者为测试用例提供获取测试数据的统一编程接口。模糊测试服务端和模糊测试客户端之间通过网络协议通信,这两者也是模糊测试系统中的核心模块。测试用例集中的测试用例与目标代码一一对应,以从模糊测试客户端获取的测试数据为参数,通过接口调用的方式执行目标代码进行测试。
模糊测试系统下的测试用例在测试目标代码时,测试流程由6步构成,如图2所示。
图2 测试流程
该测试过程具体流程描述如下:
(1)测试用例向模糊测试客户端传递获取测试数据的请求。
(2)模糊测试客户端将请求封装为特定的请求帧,并通过网络协议传递给模糊测试服务端。
(3)模糊测试服务端解析请求帧后,以系统调用的方式启动Peach系统,生成测试数据。
(4)模糊测试服务端将生成的测试数据分片并封装为特定的测试数据帧后,通过网络协议传递给模糊测试客户端。
(5)模糊测试客户端接收测试数据帧后,经过解析重组将测试数据传递给测试用例。
(6)测试用例以获取的测试数据测试目标代码。
3 模糊测试系统的实现
在构成模糊测试系统的4个组成部分中,由于模糊测试框架使用了现有的UEFI下自我认证测试系统的测试框架,测试用例集的编写也需要符合其规范[14]。测试数据生成引擎Peach本身并不支持所生成测试数据的导出,因此需要略微修改其源码。模糊测试功能模块作为衔接测试用例和测试数据生成引擎的重要模块,是模糊测试系统实现的重点也是难点所在。模糊测试功能模块的实现包括模糊测试客户端、模糊测试服务端以及两者间通信方式的设计实现。
模糊测试客户端和模糊测试服务端之间的通信,有以下3点要求:支持可靠的数据传递;支持大容量数据的传递;简化数据传递流程,尽量降低负载。目前UEFI下并没有提供同时支持以上3个条件的网络协议。因此,基于传输控制协议(Transmission Control Protocol,TCP)设计实现轻量级文件传输协议(File Transfer Protocol,FTP)协议。在该轻量级FTP协议中定义了请求帧和测试数据帧,前者用于模糊测试客户端向模糊测试服务端发起获取测试数据的请求;后者用于模糊测试服务端向模糊测试客户端传递生成的测试数据。定义的2类帧的帧格式中均只包含必需的域,其中请求帧由测试数据生成相关信息,以及一个可选的用于传递控制信息的域构成;测试数据帧由帧重组相关信息,以及可变长度的有效载荷构成。
UEFI下的可执行程序分为应用程序和驱动2类,驱动中的功能函数以协议的形式供其他应用程序和驱动调用。这里将模糊测试客户端实现为UEFI下的驱动,对外提供模糊测试协议,用于测试数据的获取。由于测试数据在远端主机生成,模糊测试协议需提供基本的连接建立,连接终止和网络数据获取功能。模糊测试协议的接口定义如下:
同时模糊测试协议中定义了测试数据格式和测试数据生成方式2个枚举类型,分别对应于希望Peach生成的测试数据格式,以及Peach中生成测试数据的2种方式——基于生长和基于变异的数据生成方式。测试用例调用模糊测试协议的GetFuzzData获取测试数据时,仅需提供测试数据格式和测试数据生成方式,GetFuzzData执行流程如图3所示。
图3 GetFuzzData执行流程
GetFuzzData的执行由3个层次构成,分别是逻辑控制层、数据处理层和网络收发层。首先,逻辑控制层根据测试数据格式和测试数据生成方式,调用数据处理层中对应的处理函数完成相应的初始化并生成请求帧;接着,数据处理层调用网络收发层中的网络发送函数向模糊测试服务端传递请求帧,并通过网络接收函数接收来自模糊测试服务端的测试数据帧分片,直到接收到完整的帧;最后,网络收发层将重组后的测试数据向上层传递。
模糊测试服务端则实现为一个标准的服务端程序,监听来自模糊测试客户端的请求帧。模糊测试服务端通过请求帧,获知执行测试数据生成引擎Peach相关的输入信息,并通过系统调用的方式执行Peach生成测试数据。生成的测试数据,由模糊测试服务端依据测试数据帧的格式分片,封装后向模糊测试服务端传递。同时,模糊测试服务端在后台运行记录系统运行状态的子进程。
4 实验结果与分析
本节以测试用例的代码覆盖率为指标,对比基于模糊测试系统编写的测试用例与基于原UEFI下自我认证测试系统编写的测试用例,并通过一个实际的安全漏洞揭示模糊测试系统如何挖掘UEFI固件高危安全漏洞[12]。
测试环境选取由EDK II Revision 13762编译出的NT32[15],NT32是UEFI Shell的模拟器,为测试用例提供了一个可执行环境。测试数据生成引擎Peach选用的版本号为2.3.8。UEFI下代码覆盖率工具选用英特尔基于Bullseye[16]开发的UEFI固件代码覆盖率测试工具。目标代码为UEFI固件中负责将可执行文件载入内存的映像驱动(EDKII/Mde ModulePkg/Core/Dxe/Image/Image.c),对比结果如图4所示。
图4 代码覆盖率对比
图4中的结果显示基于模糊测试系统开发的测试用例,代码覆盖率平均提升超过了15%。其中部分函数的代码覆盖率几乎没有提升,如CoreExit,而有的则提升了1倍,如CoreLoadImage,这主要是因为后者涉及了大量与输入数据结构相关的操作,如对输入测试数据格式的解析、合法性判断等;前者恰恰相反,涉及操作与输入数据结构无关,如对内存空间的清空操作等。合理构造的测试数据,能够通过尽可能多的合法性判断代码,因而代码覆盖率就高,也有助于触发深层漏洞。
通过模糊测试系统可以挖掘出十分严重的安全漏洞,以NT32下GPT(GUIDed Partition Table)驱动的一个缓冲区溢出漏洞为例,相关代码如下:
以上代码用于从磁盘中读入数据。Line1采用固定大小EFI_PARTITION_ENTRY分配用于存储磁盘数据的内存空间。测试用例在执行该目标代码时,若作为输入的测试数据中的PrimaryHeader->SizeOfPartionEntry(Line7)项大于EFI_PARTITION_ENTRY,位于磁盘中的数据将会覆盖后续的执行代码,导致UEFI固件运行的崩溃。模糊测试服务端的后台进程能够监测到UEFI固件的崩溃状态,并保存触发漏洞的测试数据。结合该测试数据与微软提供的集成开发环境VS2008(Visual Studio 2008)可视化开发套件的调试功能,将很容易确定相应的漏洞。而在现实环境中,黑客完全可以通过构造恶意的GPT表,使位于磁盘的数据覆盖内存相关区域,达到劫持系统的目的。
5 结束语
计算固件处于计算机系统的核心地位,自身的安全漏洞往往隐藏较深,需要满足特定的条件才能被触发,这成为了检测UEFI固件漏洞的难点所在。本文提出的面向UEFI固件的模糊测试系统,通过模糊测试技术的应用以及测试用例集的高代码覆盖率,保证了漏洞检测的全面性和高效性,较好地解决了UEFI固件漏洞检测的问题。下一步的研究工作主要有以下2点:(1)添加对UEFI固件中网络协议测试的支持;(2)基于文中提出的模糊测试系统,编写更多的测试用例,全面测试UEFI固件的协议和服务。
[1]Zimmer V,Rothman M,Marisetty S.Beyond BIOS:Developing with the Unified Extensible Firmware Interface[M].2nd ed.[S.l.]:Intel Press,2010.
[2]周振柳,计算机固件安全技术[M].北京:清华大学出版社,2012.
[3]唐艳武,蒋 凡.上下文相关的软件漏洞模式自动提取方法[J].计算机工程,2010,36(17):51-56.
[4]Ding Sun,Tan H B K,Liu Kaiping,et al.Detection of Buffer Overflow Vulnerabilities in C/C++with Pattern Based Limited Symbolic Evaluation[C]//Proc.of the 36th International Conference on Computer Software and Applications.Lzmir,Turkey:[s.n.],2012:559-564.
[5]Yang Dingning,Zhang Yuqing,Liu Qixu.Blend Fuzz:A Model-based Framework for Fuzz Testing Programs with Grammatical Inputs[C]//Proc.of the 11th International Conference on Trust,Security and Privacy in Computing and Communications.Liverpool,UK:[s.n.],2012:1070-1076.
[6]李伟明,张爱芳,刘建财,等.网络协议的自动化模糊测试漏洞挖掘方法[J].计算机学报,2011,34(2):242-254.
[7]沈亚楠,赵荣彩,王小芹,等.基于文件规范描述的文件模糊测试[J].计算机工程,2010,36(16):52-53,59.
[8]Liu Zhi,Zhang Xiaosong,Li Xiongda.Proactive Vulnerability Finding via Information Flow Tracing[C]//Proc.of the 2nd International Conference on Multimedia Information Networking and Security.Nanjing,China:Nanjing University,2010:481-485.
[9]唐和平,黄曙光,张 亮.动态信息流分析的漏洞利用检测系统[J].计算机科学,2010,37(7):148-151.
[10]章 烨.Fuzz安全测试技术研究[D].西安:西安电子科技大学,2010.
[11]Intel Corporation.EDK II Module Writer’s Guide Revision 0.01[EB/OL].[2013-06-18].http://www.intel.com/.
[12]姚颉文,谢康林,石永军,等.基于EFI驱动-协议模型的自我认证测试系统[J].计算机仿真,2005,22(7):75-78.
[13]Sutton M,Greene A,Amini P.Fuzzing Brute Force Vulnerability Discovery[M].[S.l.]:Addison-Wesley,2006.
[14]Intel Corporation.UEFI SCT Case Writers Guide 0.91[EB/OL].[2013-06-18].http://www.uefi.org.
[15]Intel Corporation.EDK II Lab Setup&NT32 Build[EB/OL].[2013-06-18].http://uefidk.intel.com/.
[16]Bullseye Testing Technology.Bullseye Coverage Measurement Technique[EB/OL].[2013-06-18].http://www.bullseye.com/measurementTechnique.html.