论缓冲区溢出攻击的分析和防范策略

  • 格式:pdf
  • 大小:288.32 KB
  • 文档页数:2

论缓冲区溢出攻击的分析和防范策略章三平龚玉兰(南昌市工业技术研究院,江西南昌330006)摘要:本文主要针对缓冲区所产生的网络安全漏洞等问题进行分析和研究,并对如何维护网络的安全和稳定,保护计算机内数据信息不被外界攻击者攻击破坏而带来不便进行探讨。

并重点论述如何加强对缓冲区的注重和保护,如何对产生的网络安全问题进行及时的防范和解决。

关键词:缓冲区;缓冲区溢出;网络安全;防范策略1引言缓冲区溢出是一种常见且危害很大的系统攻击手段,通过向程序的缓冲Ⅸ写入超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈使程序转『硎丸行其它指令,以达到攻击的目的。

2缓冲区溢出攻击原理分析2.1缓冲区溢出的概念和原理缓冲区是程序运行的时候机器内存中的一个连续块,它保存了给定类型的数据,随着动态分配变量会出现问题。

大多时为了不占用太多的内存,一个有动态分配变量的程序在程序运行时才决定给它们分配多少内存。

这样想下去的话,如果说要给程序在动态分配缓冲区放入超长的数据,它就会溢出了。

一个缓冲区溢出程序使用这个溢出的数据将汇编语言代码放到机器的内存里,通常是产生root权限的地方,这就不是什么好现象了。

仅仅就单个的缓冲区溢出惹眼,它并不是最大的问题根本所在。

但如果溢出送到能够以r o ot权限运行命令的区域,一旦运行这些命令,那可就等于把机器拱手相让了。

2.2攻击原理引起缓冲区溢出问题的根本原因是C(与其后代c++)本质就是不安全的,没有边界来检查数组和指针的引用,也就是开发人员必须检查边界(而这一行为往往会被忽视),否则会冒遇到问题的风险。

标准c库中还存在许多非安全字符串操作,包括:st r c py0、s pnnf f0、get s0等。

当程序写入超过缓冲区的边界时,这就是所谓的“缓冲区溢出”。

发生缓冲区溢出时,会覆盖下一个相邻的内存块。

由于C 语言本质上的不安全性,所以它允许程序随意(或者更准确地说是完全出于偶然)溢出缓冲区。

没有运行时检查来这一防止写入超过缓冲区末尾,所以程序员必须在其自己的代码中执行这一检查,否则继续下去会出现问题。

缓冲区溢出的副作用取决于:(1)写入的数据中有多少超过缓冲区边界(2)当缓冲区已满并且溢出时,覆盖了哪些数据(如果有的话)(3)程序是否试图读取溢出期间被覆盖的数据(4)哪些数据最终替换被覆盖的内存一般情况下,覆盖其它数据区的数据是没有意义的,最多造成应用程序错误,但是,如果输入的数据是经过“黑客”精心设计的,覆盖缓冲区的数据恰恰是黑客的入侵程序代码,黑客就获取了程序的控制权。

此外,攻击者利用缓冲区溢出得到机器上的交互式会话(s heU)。

如果被利用的程序以较高的优先权在运行(如r oot用户或管理员),则攻击者就会在交互式会话中得到该优先权。

最惊人的缓冲区溢出是堆栈的摧毁,它会在超级用户或r oot、s hel l中造成后果。

许多可以利用脚本都能在网络上找到,它们对特定体系结构上的堆栈进行摧毁。

2-3缓冲区溢出漏洞攻击方式最常见的攻击手段是通过制造缓冲区溢出使程序运行一个用户s heU,在通过s heH执行其它命令.若该程序输入r oot且有s ui d权限的话,攻击者就获得了一个有r oot权限的s heU,此时就可以对系统进行随意操作了。

下面主要介绍一下如何控制程序跳转到攻击代码:2.3.I打开记录(A ct i vat i on R ec or d sl在程序中,每一个函数调用发生,在堆栈中会留下一个A ct i vat i on Recor ds,它包括函数结束时返网的地址,攻击者通过溢出这些自动变量,使地址指向攻击程序代码.通过改变程序的返回地址,当调用结束时,程序就跳到攻击者设定的地址,而不是原地址.这类溢出被称为st ac ks m as hi ng a tt a ck。

2.3.2函数指针Funct i on Poi nt e m lvoi d(*f oo)(1)定义一个返回函数指针的变量foo,Funct i on Poi n t er s可用来定位任何地址空间.所以只需在任何空间内的F un ct i on Poi nt ers附近找到一个能溢出的缓冲区,然后溢出它来改变F unct i on Poi nt er s.在某时刻,当程序通过F unc t i on Poi nt er s 调用函数时,程序的流程就按黑客的意图实现了(典型的溢出程序有:L i nux下的Super probe程序)o2.3.3长跳转缓冲区(h画m pbu如r s)在c语言中,包含了一个简单的检验/恢复系统,称为se t j m p/l ongj m p.即在枪验点设定set j m p(buf fer),用l ongj m p(buffer)恢复.但若攻击者能够进入缓冲区空间,则l ongj m p(buf f cr)实际上跳转到攻击者的程序代码.像Funct i on Poi nt er s,l ongj m p缓冲区能指向任何地方,所以攻击者要做的就是找到一个可供溢出的buf f er即可。

3缓冲区溢出的防范策略缓冲区溢出攻击通常是在一个字符串里综合了代码植入和激活纪录。

如攻击者将目标定为具有溢出漏洞的自动变量,然后向程序传递超长的字符串,进而引发缓冲区溢出。

经过精巧设计的攻击代码以一定的权限运行漏洞程序,获得目标主机的控制权。

这种攻击手段屡次得逞主要是利用了程序中边境条件、函数指针等设计不当问题,即利用了c程序本身的不安全性。

大多数W i ndow s、Li nux、U ni x系列的开发都依赖于C语言,所以缓冲区溢出攻击成为操作系统、数据库等应用程序最普遍的漏洞之3.1编写正确的代码编写正确的代码是一件非常有意义但耗时的工作,特别象编写C语言那种具有容易出错倾向的程序(如:字符串的零结尾),这种风格是由于追求性能而忽视正确性的传统引起的。

尽管花了很长的时间使得人们知道了如何编写安全的程序,具有安全漏洞的程序依旧出现。

因此人们开发了一些工具和技术来帮助经验不足的程序员编写安全正确的程序。

为了寻找一些常见的诸如缓冲区溢出和操作系统竞争条件等漏洞,代码检查小组检查了很多的代码。

然而依然有漏网之鱼2008年第6期存在。

尽管采用了s t r nepy和s npr i nf f这些替代函数来防止缓冲区溢出的发生,但是由于编写代码的问题,仍旧会有这种情况发生。

比如l pr m程序就是最好的例子,虽然它通过了代码的安全检查,但仍然有缓冲Ⅸ溢出的问题存在。

3.2非执行的缓冲区通过使被攻击程序的数据段地址空间不可执行,从而使得攻击者不可能执行被殖入被攻击程序输入缓冲区的代码,这种技术被称为非执行的缓冲区技术。

事实上,很多老的U ni x系统都是这样设计的,但是近来的U ni x和M S W i ndow s系统由于实现更好的性能和功能,往往在在数据段中动态地放入可执行的代码。

所以为了保持程序的兼容性不可能使得所有程序的数据段不可执行。

3.3数组边界检查殖入代码引起缓冲区溢出是一个方面,扰乱程序的执行流程是另一个方面。

不象非执行缓冲区保护,数组边界检查完全放置了缓冲区溢出的产生和攻击。

这样,只要数组不能被溢出,溢出攻击也就无从谈起。

为了实现数组边界检查.则所有的对数组的读写操作都应当被检查以确保对数组的操作在正确的范围内。

最直接的方法是检查所有的数组操作,但是通常可以采用一些优化的技术来减少检查的次数。

3.4程序指针完整性检查程序指针完整性检杳和边界检查由略微的不同。

与防止程序指针被改变不同,程序指针完整性检查在程序指针被引用之前检测到它的改变。

因此,即便一个攻击者成功地改变了程序的指针,由于系统事先检测到了指针的改变,因此这个指针将不会被使用。

与数组边界检查相比,这种方法不能解决所有的缓冲区溢出问题;采用其它的缓冲区溢出方法就可以避免这种检测。

但是这种方法在性能上有很大的优势,而且在兼容性也很好。

3.5兼容性和性能的考虑程序指针完整性检查与边界检查相比,并不能防止所有的缓冲区溢出问题。

然而在执行的性能和兼容性上具有相当的优势:3.5.1性能边界检查必须在每个数组元素操作时完成一次检查。

相比之下,程序指针检查只在被引用的时候实现检查。

无论在C还是在c++中,这种花在程序指针引用上的开销始终比数组的指针引用小。

3.5.2应用效能边界检查最难实现之处在于在C语言中,很能确定数组的边界。

这是由于在C中,数组的概念和通用指针的混用造成的。

由于一个指针是一个独立的对象,没有与特定的边界条件关联,只有一个系统的机器字来存储它,而标识边界信息的数据却没有存放。

因此需要特殊的方法来恢复这些信息;数组的引用将不在是一个简单的指针,而是一个对缓冲区描述的指针组。

3.5.3与现有代码的兼容性一些边界检查方法为j’与现有的代码保持兼容而存系统的性能上得到了损失。

而另一些则用别的方法达到目的。

这样就打+破的传统的c的转换规则,转而产生了一类新的c编译器,只能编译C的一个子集,有的还不能使用指针或者需要别的改变。

3.5.4有效的组合在这里我们研究、比较在第二部分描述的各种漏洞攻击和在第三部分描述的防卫方法,以此来确定何种组合能完全消除缓冲区溢出问题。

但是我们没有把边界检查计算在内,因为它能有效地防止所有的缓冲区溢出,但是所需的开销也是惊人的。

最普通的缓冲区溢出形式是攻击活动纪录然后在堆栈中殖入代码。

这种类型的攻击在1996年中有很多纪录。

而非执行堆栈和堆栈保护的方法都可以有效防卫这种攻击。

非执行堆栈可以防卫所有把代码殖入堆栈的攻击方法,堆栈保护可以防卫所有改变活动纪录的方法。

这两种方法相互兼容,可以同时防卫多种可能的攻击。

剩下的攻击基本上可以用指针保护的方法来防卫,但是在某些特殊的场合需要用手丁来实现指针保护。

全自动的指针保护需要对每个变量加入附加字节,这样使得指针边界检查在某些情况下具有优势。

4结论缓冲区溢出是当今很流行的一种网络攻击方,它易于攻击而且危害严重,给系统的安全带来了极大的隐患。

因此,如何及时有效地检测出计算机网络系统入侵行为,越来越成为网络安全管理的一项重要内容。

本文从上面的系统环境及程序设计语言角度,对目前主要的网络攻击方式,缓冲区溢出攻击的出现和原理进行了详细的分析,并根据缓冲区溢出攻击的类型提出了相应的防范策略。

在本文中,我们详细描述和分析了缓冲区溢出的攻击和防卫方法。

由于这种攻击是目前常见的攻击手段,所以进行这个方面的研究工作是有意义和成效的。

研究的结果表明,堆栈保护方法和非执行缓冲区方法对于当前绝大多数的攻击都能有效地防御,指针保护的方法可以对剩下的攻击进行有效的防御。

参考文献:…1莫尉,王国秋.缓冲区溢出漏洞攻击的分析研究卟计算机与现代化2007,4.【2】叶红,东升.计算机缓冲区溢出安全问题研究Ⅱ】.计算机工程与科学2004,11.【3】蒋涛.缓冲区溢出原理及防护Ⅱ】.计算机安全,2005,6.(上接第27页)最大特点就是不用手和眼睛,这对那些采集数据同时还要完成手脚并用的工作场合尤为适用。