当前位置:问答库>论文摘要

题目:二进制代码的漏洞检测方法研究

关键词:漏洞检测,反汇编,类型重构,符号执行,污点分析

  摘要



软件作为当今信息社会的重要信息载体,已广泛应用于能源、交通、通信、金融和国防等安全攸关领域中。软件中的安全漏洞都可能导致非常严重的后果,因此如何自动化地检测软件中的安全漏洞,已成为信息安全研究领域亟需解决的重大课题。目前绝大多数软件都以二进制代码形式发布,由于语义抽象的缺失使其分析起来更加困难。因此,面向二进制代码的逆向分析以及安全漏洞检测方法研究已成为本领域研究的热点和难点问题。 本文致力于对面向二进制代码的逆向程序分析方法(尤其是软件安全漏洞的检测方法)进行研究,并实现具有一定通用性或者实用价值的自动化漏洞检测技术。本文的主要研究工作和创新点如下: 为提高反汇编过程的效率及反汇编结果的准确度,通过对传统反汇编方法的探究,本文在前人工作的基础上提出了一种基于控制流图精化的静态反汇编方法。该方法把二进制代码通过函数定位切分成单个函数,然后再对单个函数生成初始的过程内控制流图,使用图论的方法与汇编指令的特征匹配相结合,提炼出真实的控制流图。本文以CoreUtils中的22个程序作为测试基准,将该方法与2种线性扫描算法进行了对比实验。实验结果表明:本文所提出的反汇编方法比Objdump快63.2%,并且可以高度精确地绘制出控制流图,因此具有准确度高、效率高的显著特性。 由于类型信息在编译过程中被移除,且二进制代码中的低级抽象难以理解,因此类型重构一直被认为是恢复高级抽象遇到的困难问题之一,现有的大多数工具对类型重构的准确度不够高。本文提出一种保守的类型重构方法,针对类型重构引入一种简单的中间语言,基于这种中间语言构造寄存器抽象语法树,并使用寄存器抽象语法树部分解决了基址指针别名问题,可有效收集基本类型和结构体类型的类型约束信息。提出一种判断二进制代码中的循环结构及识别循环变量的方法,可有效收集数组类型的约束信息,并据此生成类型约束,然后通过处理类型约束来重构最终的类型。本文以CoreUtils中的15个程序作为测试用例,将该方法与IDA Pro进行对比实验,实验结果表明本文提出的方法不仅可以高效地重构数据类型,而且在结构体类型重构方面可恢复比IDA Pro多达5倍的数据。对这些数据的人工验证与分析表明,使用该方法重构的类型准确率高。 提出了一种基于过程内的静态符号执行方法,将二进制代码转化为中间语言,然后利用控制流信息、类型信息、输入点信息、函数建模信息,在二进制程序的过程内进行符号执行,并在执行过程中得到与输入相关的约束表达式集合。根据特定的漏洞安全属性规则,对约束表达式集合进行检查,以判断是否存在相应模式的漏洞。该方法运行在二进制程序的过程内,因此极大地缩减了路径状态空间,提高了运行效率。本文归纳了两类漏洞的安全属性规则,并据此成功地检测到了符合相应模式的漏洞。 二进制代码的污点分析方法已成功应用于软件漏洞分析及恶意代码检测方面,但目前大多数污点分析方法不支持浮点指令,执行效率较低,且传播的精度也不够高。本文提出并实现了一种基于执行踪迹离线索引的污点分析方法,以字节为粒度,且支持污点标签,并首次描述并解决了即时翻译执行导致的污点丢失问题。为此,本文首先提出执行踪迹离线索引的生成及查询算法,通过离线索引可跳过与污点数据无关的指令,以提高污点分析的效率。然后使用污点标签以标识污点的来源和位置,并提出较完善的污点传播算法,支持浮点指令,以尽可能精确地刻画污点信息从源操作数传递到目的操作数的过程。本文实现了灵活的可配置机制,用户可通过黑名单动态地引入污点数据。将本文提出的方法应用到漏洞检测的场景中,使用12个真实的软件漏洞作为测试样本集,将本文中的方法与TEMU作对比实验,实验结果表明本文方法具备较强的漏洞检测能力,可验证的漏洞数比TEMU更多,且其平均执行效率比TEMU高5倍。