摘 要: 为了提高漏洞挖掘效率,在软件体系结构的基础上,结合符号执行、污点分析和模糊测试中的优点,设计并实现了基于软件体系结构分析的漏洞挖掘系统Fast Fuzzing。该系统主要由体系结构分析、指令追踪、符号执行、污点分析和动态测试五个模块组成,为提高系统效率,系统针对传统技术方法进行了优化处理。实验结果表明Fast Fuzzing系统能够有效发现IE8和IE10中的安全问题,成功触发了IE8和IE10中的多个漏洞,适用于常用软件的安全测试。 

  关键词: 模糊测试; 体系结构分析; 漏洞挖掘; 安全漏洞 

  0 引 言 

  由于软件漏洞的高危害性,漏洞挖掘技术已成为计算机领域中的一个研究热点[1]。一方面,软件安全研究人员专注于各种流行软件的安全性分析和测试,以发现这些软件中的安全问题;另一方面,软件开发商也积极投入到产品的安全检测中,以提高软件的安全性[2]。 

  近年来,在程序分析和编译原理等领域的促进下,面向源代码的漏洞挖掘技术取得了一定成果。然而,该技术仍然存在着许多不足之处:如出于商业利益和商业保护等原因,绝大多数的软件开发商并不对外提供软件的源代码[3]。其次,源代码层次的漏洞挖掘和分析并不能发现在程序编译、程序链接过程中产生的漏洞问题。此外,软件中引入的软件体系结构方法、对外接口的不规范调用,也有可能存在潜在的安全问题[4]。 

  1 系统需求与目标 

  现有的符号执行技术主要面临路径爆炸、约束求解困难和效率比较低等问题,而本文的设计思想基于符号执行技术和模糊测试技术,同时与软件体系结构的方法相结合[5]。因此,本系统的设计目标主要包括如下几点: 

  (1) 高效率。提高本系统的测试效率,使得系统能够对待测软件进行自动化测试,分析软件运行时的状态信息,并且能够准确记录软件的异常行为和崩溃信息。 

  (2) 高适用性。能够对通用格式的数据进行处理,并且通过反馈式生成测试用例,驱动测试过程的持续运行。 

  (3) 高代码覆盖率。能够在动态测试时分析测试用例的代码覆盖率,尽可能生成不同路径的测试用例,提高系统测试时的代码覆盖率。 

  2 系统架构设计 

  为了提高漏洞挖掘的效率,本文在软件体系结构分析的基础上,结合了符号执行和污点分析技术,设计和实现了针对二进制程序的漏洞挖掘系统Fast Fuzzing[6]。 

  Fast Fuzzing漏洞挖掘系统采用离线符号执行和离线污点分析的方法,在PANDA平台的基础上实现了上述功能,同时利用STP求解器进行约束求解,生成新的测试用例。另外,还结合了污点分析结果,得到相关的污点信息,从而用于导向型测试用例的生成[7]。在进行动态测试时,Fast Fuzzing系统会计算每次测试用例的代码覆盖情况,从而在选择新的测试用例进行测试时,优先选择能够提高代码覆盖率的新测试用例。Fast Fuzzing系统架构图如图1所示。Fast Fuzzing漏洞挖掘系统主要由指令追踪模块、体系结构分析模块、符号执行模块、污点分析模块和测试模块组成。 

  3 系统实现 

  3.1 指令追踪模块设计与实现 

  指令追踪模块的主要功能是,记录测试程序执行时每条指令的地址、上下文信息和内存信息等。该模块是在动态分析平台 PANDA下实现的,其作为 PANDA平台的一个工具模块 panda_tools。指令追踪模块主要有如下三个模块: 

  指令追踪:程序执行过程中能够动态分析每条指令,记录指令的具体信息和寄存器信息。指令追踪功能主要通过注册PANDA_CB_INSN_TRANSLATE和PANDA_CB_INSN_EXEC两个回调函数实现。   内存追踪:程序执行过程中对内存的操作进行有针对性的记录,包括内存的申请、内存的读/写、内存块大小和数据信息等。内存追踪方法与指令追踪类似,通过注册 [PANDA_CB_VIRT_MEM_READ,PANDA_CB_VIRT_][MEM_WRITE,]PANDA_CB_PHYS_MEM_READ和PANDA_CB_PHYS_MEM_WRITE四个类型的回调函数,分别实现对虚拟地址内存的读/写操作和物理地址内存的读/写操作的监控。 

  函数追踪:程序执行过程中能够记录系统函数的调用,同时在提供符号表的情况下,能够记录指定函数的调用信息。系统通过 PANDA平台对指令分析的过程,注 册了两个回调函数对其进行处理,类型为PANDA_CB_INSN_TRANSLATE的translate_call back函数和类型为PANDA_CB_INSN_EXEC的exec_callback函数。 

  3.2 体系结构分析模块设计与实现 

  体系结构分析模块的功能是对最基本的主程序和子程序进行静态分析,通过对二进制程序进行基本块划分,记录相关的基本块信息,提取其中的函数调用关系,从而分析程序中的所有路径,再根据静态分析时的信息提取出相应路径的约束关系,用于后续的符号执行中[8]。 

  体系结构分析模块是在IDAPro静态分析工具的基础上实现的,之后通过模块实现的插件对IDAPro反汇编结果进行深入的分析,对程序进行基本块划分和记录,同时提取出其中的调用关系。该模块的基本架构如图2所示。在体系结构分析模块中,主要包含基本代码块分析、函数调用分析和路径分析三个部分。 

  3.3 符号执行模块设计与实现 

  符号执行模块通过分析指令追踪时的记录,结合体系结构分析时的路径关系,将输入数据符号化表示,生成相应的约束关系;之后,在轨迹重放时,根据程序执行时的上下文环境,更新路径约束关系,并利用约束求解器进行求解,生成新的测试用例,对程序进行进一步的测试。本系统基于PANDA平台构建,其底层由QEMU模拟器构建,采用TCG中间语言的方式对指令进行翻译处理。本文在此基础上,采用了离线符号执行的方式,根据指令追踪时的记录,实现对中间代码的符号化分析,从而提高符号执行的效率。 

  符号执行模块首先在体系结构分析模块的基础上,通过对目标软件的静态分析,生成软件内部的函数调用图,进而推导出软件中的路径关系。该模块的基本流程如图3所示。 

  3.4 污点分析模块设计与实现 

  污点分析模块通过指令追踪时对原始输入数据的污点标记,分析相关内存信息,记录污点数据的传播过程,获得输入数据与敏感内存操作的关系,从而生成新的测试用例。 

  污点分析模块是在PADNA平台基础上实现的,借助于指令追踪模块,对目标程序的执行流程进行轨迹记录,生成相应的轨迹记录文件。轨迹记录部分主要针对每条执行过的指令,具体包括指令的地址、指令机器码和指令运行时寄存器、内存的相关信息。 

  3.5 动态测试模块设计与实现 

  动态测试模块是在Windows异常处理机制的基础上,通过执行目标程序捕获运行时出现的异常信息判断测试用例是否会引发程序崩溃,再进一步分析崩溃信息,判断该问题是否是由于软件自身的安全漏洞而引起的。同时,动态测试模块的功能还在于能够不断生成新的测试用例,对目标程序进行持续的测试。本系统主要是在Windows异常处理平台下实现了动态测试模块,主要通过对未执行代码块中插入软件断点追踪指令的执行过程,并且对程序运行时的异常情形进行监控。 

  (1) 处理流程 

  动态测试模块采用加载目标程序的方式对目标程序进程测试。同时,在创建目标程序的进程时,通过DLL注入的方式实现对异常信息的监控和对代码覆盖率的检测功能。其具体处理流程如图4所示。在程序碰到异常情形时,首先通过注入的DLL判断此处的异常是否是DLL注入时插入的指令造成的,如果是则恢复原先指令,记录此时的状态信息,以便分析代码覆盖率;否则的话,则认为是程序中存在的安全问题触发了此类异常,记录测试用例、此时的寄存器和上下文信息,以便进一步确认该安全问题是一个程序漏洞。 

  (2) 异常监控 

  异常监控部分主要包含追踪路径初始化、基本代码块断点设置和异常处理函数设置这两个功能,其具体实现是通过DLL注入的方式对目标程序的执行进程进行监控。 

  (3) 代码覆盖率检测 

  在对基本代码块进行断点设置时,根据BBL_INFO结构中的isexecute字段判断基本代码块是否执行。对于已经执行的基本代码块,将其记录在已测试基本代码块结构中,然后在程序执行完后,将记录中的代码块与模块中的所有代码块进行比对,算出该模块中的基本代码块代码覆盖率。 

  4 系统测试与分析 

  4.1 功能测试 

  (1) 测试方法 

  针对IE10,初始测试用例大小为21 824 B,指令记录文件大小为53 323 MB, 共生成了625 369个测试用例,发现了24个异常。针对IE8,初始测试用例大小为21 824 B,指令记录文件大小为23 954 MB,共生成了405 712个测试用例,发现异常数为31个。通过上述异常分析可以看到,IE8中的异常2和IE10中的异常2信息基本一致,都属于访问不可访问内存错误,而其他异常信息也属于此类错误。为测试Fast Fuzzing系统的代码覆盖率情况,本测试中对比分析FileFuzz工具对IE8软件的测试代码覆盖率情况,结果如表3所示。 

  通过上述结果的对比,可以发现Fast Fuzzing相对于传统的模糊测试工具而言,其在测试时覆盖的代码面更广,能够对软件进行更为全面的安全测试。 

  5 结 论 

  针对传统模糊测试方法的不足,本文设计并实现了一种基于软件体系结构的漏洞挖掘工具,并且结合了混合符号执行技术和细粒度污点分析技术,通过对这两方法的反馈信息进行深入分析,生成新的测试用例驱动测试流程,从而大大地提高了测试时代码的覆盖率和测试效率。   

      参考文献 

  [1] 杨世德,梁光明,余凯.基于ARM嵌入式系统底层漏洞挖掘技术研究[J].现代电子技术,2015,38(18):94?96. 

  [2] 蒲石,陈周国,祝世雄.震网病毒分析与防范[J].信息网络安全,2012(2):40?43. 

  [3] 王铁磊.面向二进制程序的漏洞挖掘关键技术研究[D].北京:北京大学,2011. 

  [4] 陈宝国.美国国家网络安全战略解析[J].信息网络安全,2010(1):66?68. 

  [5] BRUMLEY D, POOSANKAM P, SONG D, et al. Automatic patch?based exploit generation is possible: techniques and implications [C]// Proceedings of 2008 IEEE Symposium on Security and Privacy. [S.l.]: IEEE, 2008: 143?157. 

  [6] BALAKRISHNAN G, REPS T, MELSKI D, et al. What you see is not what you execute [J]. ACM transactions on programming languages and systems, 2010, 32(6): 202?213. 

  [7] WANG T L, WEI T, GU G F, et al. TaintScope: a checksumaware directed fuzzing tool for automatic software vulnerability detection [C]// Proceedings of 2010 IEEE Symposium on Security and Privacy. Oakland: IEEE, 2010: 497?512. 

  [8] SONG D, BRUMLEY D, YIN H, et al. BitBlaze: a new approach to computer security via binary analysis [C]// Procee?dings of 2008 4th International Conference on Information Systems Security. Hyderabad: Springer, 2008: 1?25.