论文部分内容阅读
随着电子信息技术和计算机网络的飞速发展,系统安全问题受到越来越多的重视。网络攻击、蠕虫病毒和黑客等名词已经频繁地出现在各种杂志和视频中。由于程序设计语言本身的缺陷以及软件的复杂性,系统的正确性和安全性难以保证,存在各种各样的程序漏洞。其中,最为常见的是与内存篡改相关的程序漏洞,如缓冲区溢出、格式化字符串、堆篡改和整形溢出等。内存漏洞危害巨大,给社会经济带来了难以估量的损失。许多政府和研究机构都对系统安全问题给予了足够的重视。
要彻底地修复有漏洞的程序,最根本的就是在发现程序存在漏洞时,给程序打补丁,消除程序中的漏洞。显然,给程序打补丁就必需要知道程序漏洞的位置,然而目前的很多攻击防范方法都主要关注攻击的检测,而无法自动获得程序漏洞的位置。通常软件开发人员通过手工的代码审计、跟踪、调试等手段进行漏洞定位并修补漏洞。但是,目前的系统的复杂性使得人工定位漏洞效率非常低下,这就迫切需要一种能够自动定位程序漏洞的方法。这也是我们工作的出发点和最终的目标。
本文提出一种针对内存相关漏洞攻击的自动检测和定位的方法。通过动态染色技术检测非法内存访问并且在程序运行过程中记录下与外部输入相关的写指令的地址和目的内存地址。当检测到异常时,根据已经记录的信息回溯定位到非法写内存指令,并对应到源代码中相应的语句。这里,我们会对库函数做特殊的处理,如果非法写内存指令是库函数中的指令,而此条指令的地址对于所有调用该库函数的程序是固定的,所以仅仅定位到这条指令,并不精确。所以,我们的系统通过对库函数调用的识别,可以最终定位到库函数的调用点。对漏洞的精确定位对于修复程序漏洞有着至关重要的作用。
为检测该方法针对内存篡改漏洞攻击错误定位的效果,我们在Linux上,基于Valgrind和Flayer工具实现了原型系统。我们使用常见的含有内存漏洞的程序来测试系统的的有效性。所有测试程序都具有外部输入接口。实验结果证明我们的方法既能够有效地检测到经典的控制流攻击,也能够检测到数据流攻击,而且最终都能够精确地定位到程序漏洞的位置。