论文部分内容阅读
近年来,随着信息技术的快速发展,网络互连和资源共享在方便了人们的工作和生活的同时也造成了各种安全隐患。各种利用软件的漏洞、安全弱点的恶意攻击手段层出不穷。每年,由于软件安全弱点造成世界范围的安全事件不计其数,使人们的正常生活蒙受巨大损失。
通过我们收集的各种统计信息,包括诸如CERT(Coodinatoin Center)这样的安全问题研究机构发布的安全分析报告中可以发现,目前各式各样的攻击仍频频地发生,甚至有不断增加的趋势。而在这些众多威胁软件安全的攻击方式中,缓冲区溢出这种系统攻击方式一直占了极大的比重。David Wagner等人在2000年的“网络与分布式系统安全性”会议(NDSS2000)上发表的一篇论文中就指出:当今被广泛利用的漏洞中多达百分之五十都是缓冲区溢出,而且这一比例正随着时间而不断上升。同时,在目前很多的攻击报告中显示,有很大部分的攻击都是直接或间接的通过利用软件中的缓冲区溢出漏洞来实施的,比如在2003年频频发作的振荡波攻击就是利用windows远程过程调用功能中的缓冲区溢出漏洞实施攻击的典型例子。
鉴于此,为消除缓冲区溢出对软件安全带来的威胁,国内外的研究人员在缓冲区溢出的防范做了大量的工作,也取得了很多的研究成果。然而,由于缓冲区溢出漏洞广泛地存在于目前已有的软件中,而且其攻击方式多种多样,所以它的彻底防范十分困难。就目前已有的方法而言,它们都有着各自的缺陷,没有一种可以完美地解决缓冲区溢出的问题,这致使这种攻击仍然不断地出现。在我们为增强软件安全而进行的研究工作中,我们也把目光投向了缓冲区溢出的防范,希望能够找到一种较好的方法,克服已有防范方法的缺陷,比较彻底地解决缓冲区溢出问题。
通过我们对缓冲区溢出原理和各种攻击方式的仔细研究,我们发现目前的各种攻击方式一个共同的特定就是“会改变程序的执行轨迹”。基于这个特点,我们结合目前已有的研究成果,首先设计了一套linux平台下的“程序执行轨迹的监控机制”,它可以对程序的执行轨迹进行较为细粒度的监控。接着,通过利用这套机制,我们设计了两个缓冲区溢出的防范方法。一个是针对栈溢出的防范方法,设计这个方法是因为栈溢出仍然目前是最为常见的攻击方式,通过对它的防范可以杜绝大部分的攻击。另一个方法通过对程序广义函数调用进行监控来实施防范,所谓广义函数调用就是程序中发起类似普通函数调用功能的操作,比如函数指针调用,setjmp,longjmp等。
实验表明,两种防范方法都有具有较好的防范效果。第一种方法较好地解决栈溢出的问题。第二种方法通过目前普遍使用的,由John Wilander[WIL02]提供的攻击平台进行测试,它对目前所有的攻击方式,如栈溢出,格式化字符串溢出,堆溢出和函数指针溢出等都有明显的防范效果。
此外,值得一提的是,在我们第二种方法的设计过程,我们没有针对特定的攻击方式。它良好的实验效果让我们有理由相信它对未来可能的攻击方式也有较好的防范能力。