论文部分内容阅读
网络空间安全中的各种博弈行为,漏洞挖掘、恶意代码检测、模型提取与分析作为一种战略资源而被各方积极关注。如何快速有效地发现漏洞、检测恶意代码行为是解决软件自身安全问题的根本,也是信息安全领域的研究重点。漏洞检测与分析、恶意软件行为分析,以及模型自动化提取与分析都是建立在测试用例自动化生成的基础上,配合各个领域的检测特征和行为规范,实现不同的安全分析、检测目的。所以,测试用例的有效性与自动化程度直接决定了各种安全分析的效率。Concolic测试解决了覆盖特定执行路径测试用例的自动化生成问题,能够有效地帮助安全人员理解数据内部流向和恶意行为触发条件、方式等问题,具有高路径覆盖率,低冗余测试、准确性高的特点,极大地提高了漏洞挖掘、恶意代码分析的效率。在漏洞挖掘时,Concolic测试能够帮助研究人员在复杂的数据依赖关系中捕获数据之间内在约束,并且精确记录路径动态执行过程中的约束条件,从而进一步判定路径可行性和路径约束的完备性,加之配合不同漏洞类型的约束规则,能够对不同类型的软件漏洞进行挖掘。恶意代码分析过程中,研究人员利用Concolic测试配合事先制定的搜索策略和恶意行为特征规则,精确定位检测恶意代码的触发条件,进而捕获其恶意行为,达到分析恶意软件行为的目的。Concolic测试是程序分析理论中一种典型的程序混合分析技术,是一种能够覆盖特定执行路径测试用例的方法模型,与程序的抽象和推理、模型检测等理论相互结合,为程序优化、漏洞检测与分析、恶意软件行为分析等技术提供基础。“ Concolic ”由“ concrete”和“ symbolic ”组合而成,代表模糊测试技术和符号执行技术的结合。符号执行技术和模糊测试技术是程序静态分析和动态分析领域的两大典型技术,符号执行技术的核心思想是利用符号模拟程序执行收集当前路径分支语句中的谓词,并形成路径约束条件;而模糊测试技术的核心思想是利用随机输入驱动程序真实执行。二者都是面向路径的程序分析方法,前者由于没有真实执行程序,存在路径爆炸隐患;后者由于大量随机输入可能并未改变被测程序的执行路径,存在测试冗余问题。所以,研究人员致力于将两种方法的优势结合起来,克服各自缺陷。然而,Concolic测试发展至今,在工业界仍然没有被大规模的应用,其主要原因是由于Concolic测试本身还有诸多困难需要克服,例如路径爆炸、环境交互、复杂数学函数、符号指针操作,中间语言优化、浮点数计算等问题。这些问题阻碍了 Concolic测试技术的发展,使得Concolic测试无法实现理论上百分之百的路径覆盖率,以及不得不面临测试效率和准确性的质疑。本文以改进Concolic测试效率和准确性为最终目标,深入分析了 Concolic测试技术的优劣及面临的主要挑战,重点研究了 Concolic测试技术中存在的中间语言优化、环境交互和复杂数学函数三个典型问题,并最终提出切实有效的解决方案,主要贡献和创新性成果如下:首先,针对Concolic测试的中间语言冗余问题,提出一种基于冗余标志位检测和删除的中间语言优化方法。中间语言优化是指通过精简优化中间语言的代码结构,提高Concolic测试后续分析效率。本文分析并讨论了中间语言中存在的冗余标志位的原因,并根据标志寄存器和汇编指令的依赖关系,对x86指令进行分类和索引,深入研究了冗余标志位的检测和删除过程。本文以中间语言Vine IL为例,提出一种针对汇编指令冗余标志位检测和删除的方法,设计并实现了运行于x86架构下冗余标志位检测和删除系统。冗余标志位检测和删除方法具体如下:首先,根据汇编指令和标志寄存器的依赖关系,将汇编指令分成三类建立索引,并分析常用指令序列,提高后续指令查找效率。其次,提出一种逆序线性扫描算法,过滤标志寄存器无关指令,检测依赖标志寄存器的指令以及上下文中影响该标志寄存器的指令,建立标志寄存器和对应指令的依赖关系FRC( flag relevant chain, FRC)。最后,根据FRC探测去除冗余标志位的中间表示过程,最大程度地精简每条指令的中间表示,提高后续求解效率。其次,针对Concolic测试的环境交互问题,提出一种基于数据输入函数探测和校正的隐藏路径探索算法。环境交互问题研究是指分析数据输入函数(data input interface function,DIIF)引起的部分代码必须在特定外部条件下才能被访问的现象,目的在于解决环境密集型程序中隐藏路径的探测问题。本文讨论了由DIIF引起的环境交互问题的原因,深入研究DIIF的探测和校正过程,提出基于模拟器和文件插桩两种方式的数据输入函数探测和校正算法,解决了环境密集型程序的某些关键代码或者潜在漏洞被遗漏的问题。该方法具体包括:首先,明确给出了 DIIF定义,根据其输出参数特性,从Windows SDK、C语言标准库中筛选DIIF及其具有输出属性的参数,建立DIIF索引。其次,提出一种细粒度的污点分析算法,在程序执行过程中,检测函数调用指令,借助DIIF索引判断该函数是否为DIIF,并根据DIIF函数签名,定位其输出参数所在内存区域。最后,在程序执行过程中,对关键分支的决定条件,即相应DIIF输出值进行校正,实现隐藏路径的探测。最后,针对Concolic测试的复杂数学函数引起的路径无解问题,提出一种基于局部模糊测试的复杂数学函数返回值的探测和校正方法。复杂数学函数问题研究是指分析包含复杂数学函数的路径约束条件超出约束求解器求解能力的现象,目的在于解决复杂数学函数引起的大量路径无解问题。针对这一问题,本文针对复杂数学函数返回值进行建模,利用二进制文件插桩工具进行用户态级别的指令插桩,实现复杂数学函数返回值的探测和校正算法,解决复杂数学函数导致的路径无法求解问题。该算法具体内容如下:首先,根据黑盒函数处理的思想,提出一种针对复杂数学函数的细粒度的污点分析算法,匹配函数返回值模型,仅收集复杂数学函数返回值相关的分支条件谓词,定位复杂数学函数返回值所在内存区域。其次,提出一种定向路径搜索方法,通过添加复杂数学函数标签,优先访问复杂数学函数所在路径。最后,文本提出一种针对复杂数学函数进行局部模糊测试的方法,用来验证约束求解结果的正确性,解决不可达路径访问的问题。