论文部分内容阅读
随着信息技术的发展,各式各样的软件应用到现代社会的方方面面。由于软件规模不断膨胀、运行环境更加复杂和功能更加多样,如何保障软件的安全性已成为业界日益关注的焦点。软件漏洞是软件安全性的关键,如果被攻击者利用,将会造成不可估量的损失,尤其是在安全攸关的领域(如国防、金融、能源和交通等)。因此,如何有效地检测软件漏洞已经成为世界各国在信息安全领域的研究重点。整型(integer type)是C/C++语言的基本数据类型,广泛应用于整数数值的表示、算术运算、数据下标等。为满足不同的计算需求,C/C++语言提供多种宽度和不同符号类型。由于整型的有限表示范围、不同符号或宽度间的类型转换可能导致计算结果失真或数值被误解,引发整数漏洞(integer-based vulnerability),包括整数上溢、整数下溢、符号错误和截断错误。攻击者常常间接利用整数漏洞实施诸如恶意代码执行、拒绝服务DoS (Denial of Service)等攻击行为。国际权威漏洞披露组织CVE (Common Vulnerabilities and Exposures)在2007年发布的年度报告中指出,整数漏洞已成为威胁软件安全的第二大类漏洞。因此,全面、有效、精确地检测程序中潜在的整数漏洞是当前的研究热点。本文围绕整数漏洞安全问题,深入分析了整数漏洞的安全模型和漏洞特征,提出了基于信息流的整数漏洞插装和验证方法,重点研究了良性整数溢出的识别方法、IO2BO (Integer-Overflow-to-Buffer-Overflow)漏洞的高效动态跟踪方法和符号错误漏洞的精确检测方法。本文主要贡献如下:1.综述了整数漏洞的研究进展。从缺陷发生后行为的角度提出了新的整数漏洞安全模型,总结了判定整数漏洞的充分条件。从漏洞判定规则对充分条件覆盖的角度对现有检测方法进行比较和分析。通过实例分析,讨论了整数漏洞在现实中的特征分布。2.提出了基于信息流的整数漏洞插装和验证方法。信息流包括数据流和控制流,映射程序的语义片段,目前广泛应用于静态或动态检测软件漏洞或提供安全保护。结合整数漏洞的特性,借助信息流分析、污点分析和代码插装,本文提出了基于信息流的整数漏洞插装方法,并在GCC编译平台实现原型系统DRIVER。该方法从限定分析对象范围的角度出发,将插装对象约减为污染信息流路径上的危险操作,从而降低动态验证的运行开销。3.首次提出了一种基于多精度等价验证的良性整数溢出识别方法。在现实软件中,程序员会故意使用整数溢出来实现特殊功能或代码简洁,而现有研究工作对良性整数溢出的识别能力很低。为此,本文提出了基于多精度等价验证的识别方法。给定一个整数溢出报告,该方法首先提取其程序上下文,并创建一个新的高精度版本的程序片段。在高精度版本中,整型用更多的比特来表示,使得原始版本中的整数溢出不复发生。通过验证原始版本和高精度版本的语义等价性,即在所有可能输入下二者的输出是否一致,来判断该溢出是否为良性。实验表明,该方法有较强的良性整数溢出识别能力。4.提出了一种基于动态跟踪的IO2BO漏洞检测方法。IO2BO漏洞是最为常见的一类整数溢出。由于溢出数值被内存相关操作使用,易被攻击者利用并构造严重的恶意行为。经验丰富的程序员会对潜在溢出运算添加清除操作以阻止其影响程序的正常行为,然而现有检测方法无法排除这类被过滤的IO2BO。为提高IO2BO漏洞的检测精度,本文提出了一种高效的动态跟踪方法,选择极大且不常使用的脏数据(dirty value)来代替异常的溢出数值,并使用脏数据作为溢出标签。该方法可以保证溢出标签在随后的算术运算和值传递操作中正常传播,以及遇到清除操作时被自动清除,最后监测内存相关操作是否使用脏数据来生成漏洞报告。5.提出了一种基于数据流模式的符号错误检测方法。从符号类型转换的数据来源是否可信和转换后数值是否能被程序安全性操作使用的角度出发,本文定义了四种无害符号类型转换的数据流模式。借助数据流分析,静态识别程序中无害的符号类型转换为安全操作,并排除对它们的插装,从而提高了符号错误的检测精度。