关键词:
软件测试
漏洞验证
符号执行
模糊测试
堆布局操控
摘要:
软件漏洞给人类社会带来严重的威胁和挑战。攻击者借助软件漏洞可以远程入侵计算机系统,对其进行任意破坏或达到特定攻击目的,导致个人隐私、商业机密、国家战略等关键信息被窃取或篡改,造成恶劣的后果。快速验证软件漏洞的可利用性对于评估漏洞危害、制定防御方案、确保软件质量至关重要。研究软件漏洞自动化验证的方法,是实现漏洞可利用性快速验证的关键,借助机器强大的计算能力来完成海量异常样本的分析筛选,进而快速构造利用代码,完成漏洞危害的评估。堆内存漏洞是当前软件漏洞的主要形式之一,现有针对堆内存漏洞的自动验证尚处于起步阶段,只能处理利用过程简单的小规模软件,并且由于存在验证策略选择盲目、程序理解不足的问题,导致堆漏洞验证的效率很低。本文针对上述问题,进行了二进制软件堆漏洞的自动验证方法的研究,主要研究内容及成果如下:(1)提出了一种用户数据损坏漏洞的自动验证方法。首先,研究面向目标验证的内存布局推断方法,通过改写保存关键用户数据并引导程序继续执行,来推断堆内存中的漏洞目标,进而确定目标内存布局。然后,研究基于执行迹分析的程序语义自动理解方法,结合污点分析、符号执行等方法对收集到的程序执行迹进行分析,构建包含关键函数操作的路径片段,并分析路径片段间的数据流和控制流依赖,来建立面向利用的程序语义理解。最后,研究基于模拟执行的漏洞利用路径构造方法,对提取出来的路径片段尝试进行组合,基于面向返回式编程(Return Oriented Programming,ROP)的思路对组合进行模拟测试,从而快速构建利用路径。(2)提出了一种堆元数据损坏漏洞的自动验证方法。首先,研究基于动态模版的漏洞利用模式构建方法,对专家知识进行分析总结,提取其中的关键步骤并用动态模版语言描述,进而构建为可指导利用代码生成的漏洞利用模式。然后,研究程序状态分析和漏洞利用原语的提取方法,通过构建程序原语图来建立对程序的全局感知,并从中提取利用原语。最后,研究基于堆模拟器的漏洞利用路径构造方法,对堆分配器进行抽象建模,对利用原语进行组合并推断出待测试的利用路径。(3)设计并实现了两种堆漏洞可利用性自动验证系统。在上述两种方法的指导下,分别实现了面向用户数据损坏的堆漏洞自动验证系统Tetris和面向堆元数据损坏的堆漏洞自动验证系统Relay。实验证明上述两个系统能够有效的对堆内存漏洞可利用性进行验证,并且相比现有的其它自动验证系统,能够更快速的生成漏洞利用代码。