收藏 分享(赏)

缓冲区溢出攻击的分析及防范策略.doc

上传人:weiwoduzun 文档编号:5627049 上传时间:2019-03-10 格式:DOC 页数:7 大小:91.50KB
下载 相关 举报
缓冲区溢出攻击的分析及防范策略.doc_第1页
第1页 / 共7页
缓冲区溢出攻击的分析及防范策略.doc_第2页
第2页 / 共7页
缓冲区溢出攻击的分析及防范策略.doc_第3页
第3页 / 共7页
缓冲区溢出攻击的分析及防范策略.doc_第4页
第4页 / 共7页
缓冲区溢出攻击的分析及防范策略.doc_第5页
第5页 / 共7页
点击查看更多>>
资源描述

1、缓冲区溢出攻击的分析及防范策略系别:计算机科学系班级:网络工程姓名:姚康平学号:3111101157指导教师:乐丁惕时间:2014-11-29目录1、缓冲区溢出攻击简介.2、缓冲区溢出攻击原理.3、缓冲区溢出攻击问题.4、缓冲区溢出攻击危害5、缓冲区溢出攻击防范方法6、缓冲区溢出攻击相关对策7、参考文献.一、缓冲区溢出攻击简介缓冲区溢出是指当计算机向缓冲区内填充数据位数时超过了缓冲区本身的容量,溢出的数据覆盖在合法数据上。理想的情况是:程序会检查数据长度,而且并不允许输入超过缓冲区长度的字符。但是绝大多数程序都会假设数据长度总是与所分配的储存空间相匹配,这就为缓冲区溢出埋下隐患。操作系统所使用

2、的缓冲区,又被称为“堆栈” ,在各个操作进程之间,指令会被临时储存在“ 堆栈” 当中, “堆栈” 也会出现缓冲区溢出。 二、 缓冲区溢出攻击原理通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,使程序转而执行其它指令,以达到攻击的目的。造成缓冲区溢出的原因是程序中没有仔细检查用户输入的参数。例如下面程序:void function(char *str) char buffer16; strcpy(buffer,str);上面的 strcpy()将直接把 str 中的内容 copy 到 buffer 中。这样只要 str 的长度大于16,就会造成 buffer 的溢出,

3、使程序运行出错。存在像 strcpy 这样的问题的标准函数还有strcat()、 sprintf()、vsprintf()、gets()、scanf()等。当然,随便往缓冲区中填东西造成它溢出一般只会出现分段错误(Segmentation fault),而不能达到攻击的目的。最常见的手段是通过制造缓冲区溢出使程序运行一个用户 shell,再通过 shell 执行其它命令。如果该程序属于 root 且有 suid 权限的话,攻击者就获得了一个有 root 权限的 shell,可以对系统进行任意操作了。缓冲区溢出攻击之所以成为一种常见安全攻击手段其原因在于缓冲区溢出漏洞太普遍了,并且易于实现。而且

4、,缓冲区溢出成为远程攻击的主要手段其原因在于缓冲区溢出漏洞给予了攻击者他所想要的一切:植入并且执行攻击代码。被植入的攻击代码以一定的权限运行有缓冲区溢出漏洞的程序,从而得到被攻击主机的控制权。在 1998 年 Lincoln 实验室用来评估入侵检测的的 5 种远程攻击中,有 2 种是缓冲区溢出。而在 1998 年 CERT 的 13 份建议中,有 9 份是是与缓冲区溢出有关的,在 1999 年,至少有半数的建议是和缓冲区溢出有关的。在 ugtraq 的调查中,有 2/3 的被调查者认为缓冲区溢出漏洞是一个很严重的安全问题。缓冲区溢出漏洞和攻击有很多种形式,会在第二节对他们进行描述和分类。相应地

5、防卫手段也随者攻击方法的不同而不同,将在第四节描述,它的内容包括针对每种攻击类型的有效的防卫手段。三、 缓冲区溢出攻击问题缓冲区溢出攻击的目的在于扰乱具有某些特权运行的程序的功能,这样可以使得攻击者取得程序的控制权,如果该程序具有足够的权限,那么整个主机就被控制了。一般而言,攻击者攻击 root 程序,然后执行类似“exec(sh )” 的执行代码来获得 root 权限的 shell。为了达到这个目的,攻击者必须达到如下的两个目标:31 在程序的地址空间里安排适当的代码。3.2 通过适当的初始化寄存器和内存,让程序跳转到入侵者安排的地址空间执行。根据这两个目标来对缓冲区溢出攻击进行分类。3.3

6、 在程序的地址空间里安排适当的代码的方法有两种在被攻击程序地址空间里安排攻击代码的方法:1)、植入法攻击者向被攻击的程序输入一个字符串,程序会把这个字符串放到缓冲区里。这个字符串包含的资料是可以在这个被攻击的硬件平台上运行的指令序列。在这里,攻击者用被攻击程序的缓冲区来存放攻击代码。缓冲区可以设在任何地方:堆栈(stack,自动变量)、堆(heap ,动态分配的内存区)和静态资料区。2)、利用已经存在的代码有时,攻击者想要的代码已经在被攻击的程序中了,攻击者所要做的只是对代码传递一些参数。比如,攻击代码要求执行“exec (bin/sh)”,而在 libc 库中的代码执行“exec (arg)

7、” ,其中 arg 是一个指向一个字符串的指针参数,那么攻击者只要把传入的参数指针改向指向“/bin/sh”。3.4 控制程序转移到攻击代码的方法所有的这些方法都是在寻求改变程序的执行流程,使之跳转到攻击代码。最基本的就是溢出一个没有边界检查或者其它弱点的缓冲区,这样就扰乱了程序的正常的执行顺序。通过溢出一个缓冲区,攻击者可以用暴力的方法改写相邻的程序空间而直接跳过了系统的检查。分类的基准是攻击者所寻求的缓冲区溢出的程序空间类型。原则上是可以任意的空间。实际上,许多的缓冲区溢出是用暴力的方法来寻求改变程序指针的。这类程序的不同之处就是程序空间的突破和内存空间的定位不同。主要有以下三种:1)、活

8、动纪录(Activation Records)每当一个函数调用发生时,调用者会在堆栈中留下一个活动纪录,它包含了函数结束时返回的地址。攻击者通过溢出堆栈中的自动变量,使返回地址指向攻击代码。通过改变程序的返回地址,当函数调用结束时,程序就跳转到攻击者设定的地址,而不是原先的地址。这类的缓冲区溢出被称为堆栈溢出攻击(Stack Smashing Attack),是目前最常用的缓冲区溢出攻击方式。2)、函数指针(Function Pointers)函数指针可以用来定位任何地址空间。例如:“void (* foo)()”声明了一个返回值为void 的函数指针变量 foo。所以攻击者只需在任何空间内的

9、函数指针附近找到一个能够溢出的缓冲区,然后溢出这个缓冲区来改变函数指针。在某一时刻,当程序通过函数指针调用函数时,程序的流程就按攻击者的意图实现了。它的一个攻击范例就是在 Linux 系统下的 superprobe 程序。3)、长跳转缓冲区(Longjmp buffers)在 C 语言中包含了一个简单的检验 /恢复系统,称为 setjmp/longjmp。意思是在检验点设定“setjmp(buffer)”,用 “longjmp(buffer)”来恢复检验点。然而,如果攻击者能够进入缓冲区的空间,那么“longjmp(buffer)”实际上是跳转到攻击者的代码。象函数指针一样,longjmp 缓

10、冲区 能够指向任何地方,所以攻击者所要做的就是找到一个可供溢出的缓冲区。一个典型的例子就是 Perl 5.003 的缓冲区溢出漏洞;攻击者首先进入用来恢复缓冲区溢出的的 longjmp 缓冲区,然后诱导进入恢复模式,这样就使 Perl 的解释器跳转到攻击代码上了。3.5 代码植入和流程控制技术的综合分析最简单和常见的缓冲区溢出攻击类型就是在一个字符串里综合了代码植入和活动纪录技术。攻击者定位一个可供溢出的自动变量,然后向程序传递一个很大的字符串,在引发缓冲区溢出,改变活动纪录的同时植入了代码。这个是由 Levy 指出的攻击的模板。因为C 在习惯上只为用户和参数开辟很小的 缓冲区,因此这种 漏洞

11、攻击的实例十分常见。代码植入和缓冲区溢出不一定要在在一次动作内完成。攻击者可以在一个缓冲区内放置代码,这是不能溢出的缓冲区。然后,攻击者通过溢出另外一个缓冲区来转移程序的指针。这种方法一般用来解决可供溢出的缓冲区不够大(不能放下全部的代码)的情况。如果攻击者试图使用已经常驻的代码而不是从外部植入代码,他们通常必须把代码作为参数调用。举例来说,在 libc(几乎所有的 C 程序都要它来连接)中的部分代码段会执行“exec(something)”,其中 somthing 就是参数。攻击者然后使用缓冲区溢出改变程序的参数,然后利用另一个缓冲区溢出使程序指针指向 libc 中的特定的代码段。四、 缓冲

12、区溢出攻击危害可以利用它执行非授权指令,甚至可以取得系统特权,进而进行各种非法操作。缓冲区溢出攻击有多种英文名称:buffer overflow,buffer overrun,smash the stack,trash the stack,scribble the stack, mangle the stack, memory leak,overrun screw;它们指的都是同一种攻击手段。第一个缓冲区溢出攻击-Morris 蠕虫,发生在二十年前,它曾造成了全世界 6000 多台网络服务器瘫痪。在当前网络与分布式系统安全中,被广泛利用的 50%以上都是缓冲区溢出,其中最著名的例子是 1988

13、 年利用 fingerd 漏洞的蠕虫。而缓冲区溢出中,最为危险的是堆栈溢出,因为入侵者可以利用堆栈溢出,在函数返回时改变返回程序的地址,让其跳转到任意地址,带来的危害一种是程序崩溃导致拒绝服务,另外一种就是跳转并且执行一段恶意代码,比如得到 shell,然后为所欲为。五、 缓冲区溢出攻击防范方法缓冲区溢出攻击占了远程网络攻击的绝大多数,这种攻击可以使得一个匿名的Internet 用户有机会获得一台主机的部分或全部的控制权。如果能有效地消除缓冲区溢出的漏洞,则很大一部分的安全威胁可以得到缓解。目前有四种基本的方法保护缓冲区免受缓冲区溢出的攻击和影响。通过操作系统使得缓冲区不可执行,从而阻止攻击者

14、植入攻击代码。强制写正确的代码的方法。利用编译器的边界检查来实现缓冲区的保护。这个方法使得缓冲区溢出不可能出现,从而完全消除了缓冲区溢出的威胁,但是相对而言代价比较大。但一种间接的方法,这个方法在程序指针失效前进行完整性检查。虽然这种方法不能使得所有的缓冲区溢出失效,但它能阻止绝大多数的缓冲区溢出攻击。然后分析这种保护方法的兼容性和性能优势。5.1 非执行的缓冲区通过使被攻击程序的数据段地址空间不可执行,从而使得攻击者不可能执行被植入被攻击程序输入缓冲区的代码,这种技术被称为非执行的缓冲区技术。在早期的 Unix 系统设计中,只允许程序代码在代码段中执行。但是 Unix 和 MS Window

15、s 系统由于要实现更好的性能和功能,往往在数据段中动态地放入可执行的代码,这也是缓冲区溢出的根源。为了保持程序的兼容性,不可能使得所有程序的数据段不可执行。但是可以设定堆栈数据段不可执行,这样就可以保证程序的兼容性。Linux 和 Solaris都发布了有关这方面的内核补丁。因为几乎没有任何合法的程序会在堆栈中存放代码,这种做法几乎不产生任何兼容性问题,除了在 Linux 中的两个特例,这时可执行的代码必须被放入堆栈中:信号传递Linux 通过向进程堆栈释放代码然后引发中断来执行在堆栈中的代码来实现向进程发送 Unix 信号。非执行 缓冲区 的补丁在发送信号的时候是允许缓冲区可执行的。GCC

16、的在线重用研究发现 gcc 在堆栈区里放置了可执行的代码作为在线重用之用。然而,关闭这个功能并不产生任何问题,只有部分功能似乎不能使用。非执行堆栈的保护可以有效地对付把代码植入自动变量的缓冲区溢出攻击,而对于其它形式的攻击则没有效果。通过引用一个驻留的程序的指针,就可以跳过这种保护措施。其它的攻击可以采用把代码植入堆或者静态数据段中来跳过保护。5.2 编写正确的代码编写正确的代码是一件非常有意义的工作,特别象编写 C 语言那种风格自由而容易出错的程序,这种风格是由于追求性能而忽视正确性的传统引起的。尽管花了很长的时间使得人们知道了如何编写安全的程序,具有安全漏洞的程序依旧出现。因此人们开发了一

17、些工具和技术来帮助经验不足的程序员编写安全正确的程序。最简单的方法就是用 grep 来搜索源代码中容易产生漏洞的库的调用,比如对 strcpy和 sprintf 的调用,这两个函数都没有检查输入参数的长度。事实上,各个版本 C 的标准库均有这样的问题存在。此外,人们还开发了一些高级的查错工具,如 fault injection 等。这些工具的目的在于通过人为随机地产生一些缓冲区溢出来寻找代码的安全漏洞。还有一些静态分析工具用于侦测缓冲区溢出的存在。虽然这些工具帮助程序员开发更安全的程序,但是由于 C 语言的特点,这些工具不可能找出所有的缓冲区溢出漏洞。所以,侦错技术只能用来减少缓冲区溢出的可能

18、,并不能完全地消除它的存在。六、缓冲区溢出攻击相关对策每个堆栈帧都对应一个函数调用。当函数调用发生时,新的堆栈帧被压入堆栈;当函数返回时,相应的堆栈帧从堆栈中弹出。尽管堆栈帧结构的引入为在高级语言中实现函数或过程这样的概念提供了直接的硬件支持,但是由于将函数返回地址这样的重要数据保存在程序员可见的堆栈中,因此也给系统安全带来了极大的隐患。历史上最著名的缓冲区溢出攻击可能要算是 1988 年 11 月 2 日的 Morris Worm 所携带的攻击代码了。这个因特网蠕虫利用了 fingerd 程序的 缓冲区溢出漏洞,给用户带来了很大危害。此后,越来越多的缓冲区溢出漏洞被发现。从 bind、wu-ftpd、telnetd、apache 等常用服务程序,到 Microsoft、Oracle 等软件厂商提供的应用程序,都存在着似乎永远也弥补不完的缓冲区溢出漏洞。根据绿盟科技提供的漏洞报告,2002 年共发现各种操作系统和应用程序的漏洞 1830个,其中缓冲区溢出漏洞有 432 个,占总数的 23.6%. 而 绿盟科技评出的 2002 年严重程度、影响范围最大的十个安全漏洞中,和缓冲区溢出相关的就有 6 个。七、参考文献缓冲区溢出攻击检测、剖析与预防黑客防线 2009 缓冲区溢出攻击与防范专辑影印版安全技术大系:恶意代码分析实战黑客与画家:来自计算机时代的高见

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 经营企划

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报