最新 基于动态污点分析的二进制程序导向性模糊技术方法-精品

时间:2024-03-30 23:16:14 阅读: 最新文章 文档下载
说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。
基于动态污点分析的二进制程序导向性

模糊技术方法

0

随着现代信息系统规模和复杂度的逐步增加,软件安全问题变得尤为突出,而软件安全漏洞又是威胁信息系统安全的核心问题,因此,如何快速准确地发掘软件安全漏洞成为安全界的热点研究问题。根据研究对象的不同,软件安全漏洞挖掘分为针对开源软件的源码级别漏洞挖掘和针对闭源软件的二进制级别漏洞挖掘。出于对自身商业利益和知识产权的保护,大部分软件厂商并不向外开放其软件源代码,因此针对二进制程序进行安全漏洞发掘是当前研究的一大主流方向。目前,针对二进制程序有效的发掘方法有补丁对比技术、模糊测试技术、静态分析技术和动态分析技术[1]

模糊测试(Fuzzing)技术是一种通过向目标系统提供非预期的输入并监视异常结果来发现软件漏洞的方法[2]。模糊测试首先通过正常样本构造出一系列畸形测试用例,然后针对目标系统使用这些测试用例逐一进行测试并实时监控目标状态,通过对目标异常信息的分析来发掘目标系统中存在的安全漏洞。模糊测试是一种通过输入空间的完全遍历来驱动程序在状态空间进行完全遍历的测试方法,具有测试简单、易于部署等特点。然而,输入空间与状态空间的非对等性导致不同的输入可能驱动程序重复测试相同的状态空间,因此模糊测试具有效率低下的天然缺陷。

传统模糊测试采用完全黑盒的测试方法,在畸形测试用例的生成过程中,没有用到程序的内部信息[3],造成大部分畸形测试用例对程序状态空间进行了重复性测试。如何提高模糊测试的效率是当前模糊测试的主要研究方向,本文提出并实现了针对二进制程序的导向性模糊测试原型系统TaintedFuzz。该系统采用基于动态污点分析与输入分域技术相结合的导向性模糊测试方法,利用程序在动态执行过程中的运行时信息指导模糊测试畸形样本的生成,很好地解决了传统模糊测试效率低下的问题。 1 导向性模糊测试技术

畸形样本生成是模糊测试技术的关键。正常样本数据由安全相关数据和安全无关数据组成,安全相关数据是指与程序安全敏感操作相关的数据,安全无关数据指对安全敏感操作不产生影响的数据[3]。典型安全敏感操作包括字符串处理函数(如strcpymemcpy)、内存分配函数(如mallocHeapAlloc)以及用户根据具体需求指定的安全操作。对安全无关数据的变异通常不会导致软件异常,而对安全相关数据的变异往往能够触发软件中潜在的安全漏洞,因此,首先通过静态分析技术获得安全敏感函数的调用点;然后利用动态污点分析技术对数据依赖关系进行动态跟踪,根据安全敏感函数的参数类型分析对应的安全相关数据;最终通过对安全相关数据的变异实现对目标程序的导向性模糊测试。

考虑到编译器的优化工作,如函数内联、无用代码删除、循环体展开等,这些优化工作可能会将一些安全敏感函数内联到模块函数当中,造成模块函数中出现漏洞的可能性增大。因此,对模块函数进行模糊测试时,发掘目标程序中的安全漏洞具有重要意义。然而,不同于安全敏感函数,这些模块函数往往


不具有调试信息,其函数参数类型不可获得,所以无法根据其函数类型对其相关数据进行变异。提出基于动态污点分析与输入分域技术相结合的导向性模糊测试方法,通过对目标程序处理正常样本过程的学习,获取所有处理输入的模块函数及对应的污点输入;并通过基于执行迹的分域技术,完成对未知格式输入的输入域的划分;最终根据输入域划分的结果对模块函数的污点输入进行变异,实现对目标程序的导向性模糊测试。

本文实现了基于动态污点分析与输入分域技术的导向性模糊测试原型系统TaintedFuzz,整体框架如图1所示。系统分为前端信息收集、中端测试点分析及后端Fuzzing引擎三大模块。系统前端模块利用动态污点分析技术收集目标软件在执行正常测试样本时的运行时信息;中端模块通过对前端收集的预处理信息进行分析处理,获得后端Fuzzing引擎的测试点(check点);后端Fuzzing引擎通过对check点的变异测试,完成对目标软件的导向性模糊测试。

1.1 在线安全敏感操作分析

1.1.1 细颗粒度动态污点分析技术

TaintedFuzz采用细颗粒度动态污点分析技术(Fine?Grained Dynamic Taint Analysis)完成对目标程序执行过程的监控及信息获取。

动态污点分析技术本质上是一种信息流分析,其基本思想是在程序的动态执行过程中,追踪并收集程序对特定输入数据的处理过程。传统动态污点分析技术仅能够分析内存、寄存器或指令是否被单一污点源污染,无法满足针对复杂输入软件的分析。TaintedFuzz通过对污点数据进行字节粒度的标定与传播,完成对目标程序的细颗粒度污点分析。

TaintedFuzz对目标程序的动态监控及信息收集主要由三个部分构成:污点数据的标定、污点数据的传播以及污点分析策略。图2描述了其基本过程。 TaintedFuzz依靠劫持特定的Windows API函数完成对目标程序污点数据的标定及注入。如针对命令行输入型程序可以拦截GetCommandLine的返回值,该函数返回一个指向命令行参数的指针,通过对该指针指向的内存区域进行污点标记,完成对命令行参数的污点标记;针对文件输入型程序,TaintedFuzz通过拦截Windows系统中典型的文件操作函数(如freadReadFile

MapViewOfFile等)并分析这些函数的参数或返回值,完成对文件输入型程序的污点标定。TaintedFuzz通过对输入数据的每个字节赋予一个特定的污点标签,来完成字节粒度上多污点源的标定。污点标签结构为二元组。其中:s示污染源,如文件、命令行等;o表示该污点字节在整个污染源中的偏移量。在完成污点数据的标定之后,TaintedFuzz监控并分析每条CPU指令,来实现对目标代码执行的动态监控,并通过影子内存(Shadow Memory[4]技术实现对内存和寄存器污点信息的存储及传播。在程序的执行过程中,TaintedFuzz将根据需要对相应的信息进行收集,并在达到需要分析的位置(sink点)之后,根据特定的污点分析策略对收集到的信息进行分析。 1.1.2 安全敏感函数分析

TaintedFuzz在细粒度动态污点分析基础上实现了数据依赖关系的动态跟踪,因此在监控程序动态执行的同时,可以在线完成典型安全敏感操作的分析工作。TaintedFuzz首先通过静态分析技术获得安全敏感函数的调用点,然后在动态污点分析时,根据这些


本文来源:https://www.wddqw.com/doc/14385dce356baf1ffc4ffe4733687e21ae45ffba.html