论文部分内容阅读
近年来,随着以计算机科学技术和通讯技术为代表的信息科学技术的广泛而深入的应用,人类社会已经进入了“网络时代”,网络互连和资源共享在方便了人们的工作和生活的同时也造成了各种安全隐患。各种利用软件漏洞的恶意攻击手段层出不穷。每年,由于软件漏洞造成的世界范围内的安全事件不计其数,使人们的日常工作和生活遭受巨大影响。
通过收集的各种统计信息,包括诸如CERT(Coodinatoin Center)这样的安全问题研究机构发布的安全分析报告可以发现,目前各式各样的攻击仍频频地发生,甚至有不断增加的趋势。而在这些众多威胁软件安全的攻击方式中,缓冲区溢出这种攻击方式一直占了较大的比重。同时,在目前很多的攻击报告中显示,有很大部分的攻击都是直接或间接地通过利用软件中的缓冲区溢出漏洞来实施的,比如很多的整型溢出攻击都是借助缓冲区溢出间接地实现攻击目的的。
鉴于此,为消除缓冲区溢出对软件安全带来的威胁,国内外的研究人员在缓冲区溢出的防范做了大量的工作,也取得了很多的研究成果。然而,由于缓冲区溢出漏洞广泛地存在于目前已有的软件中,而且其攻击方式多种多样,所以它的彻底防范十分困难。就目前已有的方法而言,它们都有着各自的缺陷,没有一种可以完美地解决缓冲区溢出的问题,这致使这种攻击仍然不断地出现。在我们为增强软件安全而进行的研究工作中,我们希望能够找到一种更好的方法能够检测和定位缓冲区溢出攻击,从而阻止攻击对系统的不良影响和帮助程序员修复漏洞。
对缓冲区溢出攻击过程进行了分析和抽象,试图从攻击过程的各个关键步骤入手解决缓冲区溢出攻击问题。发现,缓冲区溢出攻击的一个关键步骤是攻击者利用外部输入数据打破程序内部合法的数据依赖关系非法篡改内存空间从而实现攻击者的目的。基于这个事实,设计思想是,首先通过静态程序分析为程序的数据流建立模型,然后通过插入代码在运行时检查程序运行过程中的实际数据流是否与通过静态分析建立的数据流模型一致。在考虑安全问题的情况下,因为攻击者为了成功地完成攻击,需要通过提供外部输入影响程序行为从而达到攻击者的目的,所以只对和外部输入有关的数据流建立模型并检测,从而希望能较大的改善系统效率。又鉴于缓冲区溢出的根本原因是由于C语言中指针和数组类型引起的类型不安全,本文提出的方法使用了针对指针和数组类型的边界检查机制。最后,因为思路是在攻击者利用外部输入破坏内存空间时检查,所以可以很好的阻止攻击者对程序的影响和方便地定位漏洞位置。
基于GCC编译器实现了一个原型系统。初步实验表明,检测方法具有较好的防范效果和较低的时空开销。