缓冲区溢出攻击.docx

上传人:太** 文档编号:72754466 上传时间:2023-02-13 格式:DOCX 页数:11 大小:22.28KB
返回 下载 相关 举报
缓冲区溢出攻击.docx_第1页
第1页 / 共11页
缓冲区溢出攻击.docx_第2页
第2页 / 共11页
点击查看更多>>
资源描述

《缓冲区溢出攻击.docx》由会员分享,可在线阅读,更多相关《缓冲区溢出攻击.docx(11页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、缓冲区遹出攻击是采用缓冲区溢出漏洞所进行的攻击行动。缓冲区溢出是一种特别普 遍、特别危急的漏洞,在各种操作系统、应用软件中广泛存在。采用缓冲区溢出攻击,可 以导致程序运行失败、系统关机、重新启动等后果。更为严峻的是,可以采用它执行非授 权指令,甚至可以取得系统特权,进而进行各种非法操作。缓冲区溢出攻击有多种英文名 称:buffer overflow , buffer overrun , smash the stack , trash the stack , scribble the stack z mangle the stack , memory leak , overrun screw ;

2、它们指的都是同一种攻击 手段。第一个缓冲区溢出攻击一Morris蠕虫,发生在二十年前,它曾造成了全世界6000 多台网络服务器瘫痪。L概念缓冲区溢出是指当计算机向缓冲区内填充数据位数时超过了缓冲区本身的容量,溢出 的数据掩盖在合法数据上,抱负的状况是:程序检查数据长度并不允许输入超过缓冲区长 度的字符,但是绝大多数程序都会假设数据长度总是与所安排的储存空间想匹配,这就为 缓冲区溢出埋下隐患。操作系统所使用的缓冲区,又被称为堆栈,在各个操作进程之 间,指令会被临时储存在堆栈当中,堆栈”也会消失缓冲区溢出。2危害在当前网络与分布式系统平安中,被广泛采用的50%以上都是缓冲区溢出,其中最闻 名的例子

3、是1988年采用fingerd漏洞的蠕虫。而缓冲区溢出中,最为危急的是堆栈溢出, 由于入侵者可以采用堆栈溢出,在函数返回时转变返回程序的地址,让其四阵专到任意地址, 带来的危害一种是程序崩溃导致拒绝服务,此夕L种就是用匕转并且执行一段恶意代码,比 如得到shell ,然后为所欲为。数据,这时数据也会溢出存储空间。输入数据通常被存放在一个临时空间内,这个临时存 放空间被称为缓冲区,缓冲区的长度事先已经被程序或者*作系统定义好了。何为缓冲区溢出缓冲区溢出是指当计算机程序向缓冲区内填充的数据位数超过了缓冲区本身的容量。 溢出的数据掩盖在合法数据上。抱负状况是,程序检查数据长度并且不允许输入超过缓冲

4、区长度的字符串。但是绝大多数程序都会假设数据长度总是与所安排的存储空间相匹配, 这就为缓冲区溢出埋下隐患。*作系统所使用的缓冲区又被称为堆栈,在各个*作进程之间, 指令被临时存储在堆栈当中,堆栈也会消失缓冲区溢出。当一个超长的数据进入到缓冲区时,超出部分就会被写入其他缓冲区,其他缓冲区存 放的可能是数据、下一条指令的指针,或者是其他程序的输出内容,这些内容都被掩盖或 者破坏掉。可见一小部分数据或者一套指令的溢出就可能导致一个程序或者*作系统崩溃。溢出根源在于编程缓冲区溢出是由编程错误引起的。假如缓冲区被写满,而程序没有去检查缓冲区边界, 也没有停止接收数据,这时缓冲区溢出就会发生。缓冲区边界检

5、查被认为是不会有收益的 管理支出,计算机资源不够或者内存不足是编程者不编写缓冲区边界检查语句的理由,然 而摩尔定律已经使这一理由失去了存在的基础,但是多数用户仍旧在主要应用中运行十年 甚至二十年前的程序代码。缓冲区溢出之所以泛滥,是由于开放源代码程序的本质打算的。一些编程语言对于缓 冲区溢出是具有免疫力的,例如Perl能够自动调整字节排列的大小,Ada95能够检查和阻 挡缓冲区溢出。但是被广泛使用的C语言却没有建立检测机制。标准C语言具有很多复制 和添加字符串的函数,这使得标准C语言很难进行边界检查。C+略微好一些,但是仍 旧存在缓冲区溢出。一般状况下,掩盖其他数据区的数据是没有意义的,最多造

6、成应用程 序错误,但是,假如输入的数据是经过黑客或者病毒细心设计的,掩盖缓冲区的数据 恰恰是“黑客或者病毒的入侵程序代码,一旦多余字节被编译执行,黑客或者病毒 就有可能为所欲为,猎取系统的掌握权。溢出导致黑客病毒横行缓冲区溢出是病毒编写者和特洛伊木马编写者偏爱使用的一种攻击方法。攻击者或者 病毒擅长在系统当中发觉简洁产生缓冲区溢出之处,运行特殊程序,获得优先级,指示计 算机破坏文件,转变数据,泄露敏感信息,产生后门访问点,感染或者攻击其他计算机。2000年7月,微软Outlook以及Outlook Express被发觉存在漏洞能够使攻击者仅 通过发送邮件就能危及目标主机平安,只要邮件头部程序被

7、运行,就会产生缓冲区溢出, 并且触发恶意代码。2001年8月,“红色代码”采用微软ns漏洞产生缓冲区存溢出,成 为攻击企业网络的“罪魁祸首。2003年1月,Slammer蠕虫采用微软SQL漏洞产生缓 冲区溢出对全球互联网产生冲击。而在近几天,一种名为冲击波的蠕虫病毒采用微软 RPC远程调用存在的缓冲区漏洞对Windows 2000/XP、Windows Server 2003进行攻 击,波及全球网络系统。据CERT平安小组称作系统中超过50%的平安漏洞都是由内 存溢出引起的,其中大多数与微软技术有关,这些与内存溢出相关的平安漏洞正在被越来 越多的蠕虫病毒所采用。缓冲区溢出是目前导致“黑客型病毒

8、横行的主要缘由。从红色代码到Slammer,再到 日前爆发的“冲击波,都是采用缓冲区溢出漏洞的典型。缓冲区溢出是一个编程问题, 防止采用缓冲区溢动身起的攻击,关键在于程序开发者在开发程序时认真检查溢出状况, 不允许数据溢出缓冲区。此外,用户需要常常登录*作系统和应用程序供应商的网站,跟踪 公布的系统漏洞,准时下载补丁程序,弥补系统漏洞。3.缓冲区攻击一.缓冲区溢出的原理通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈, 使程序转而执行其它指令,以达到攻击的目的。造成缓冲区溢出的缘由是程序中没有认真 检查用户输入的参数。例如下面程序:void function(char

9、 *str) char buffer16;strcpy(buffer,str);)上面的strcpy()将直接吧str中的内容copy到buffer中。这样只要str的长度大于 16 ,就会造成buffer的溢出,使程序运行出错。存在象strcpy这样的问题的标准函数还 有 strcat() , sprintf() , vsprintf() , gets() , scanf()等。当然,任凭往缓冲区中填东西造成它溢出一般只会消失分段错误(Segmentation fault),而不能达到攻击的目的。最常见的手段是通过制造缓冲区溢出访程序运行一个用户 shell ,再通过shell执行其它命令。

10、假如该程序属于root且有suid权限的话,攻击者就 获得了一个有root权限的shell ,可以对系统进行任意操作了。缓冲区溢出攻击之所以成为一种常见平安攻击手段其缘由在于缓冲区溢出漏洞太普遍 了,并且易于实现。而且,缓冲区溢出成为远程攻击的主要手段其缘由在于缓冲区溢出漏 洞赐予了攻击者他所想要的一切:植入并且执行攻击代码。被植入的攻击代码以肯定的权 限运行有缓冲区溢出漏洞的程序,从而得到被攻击主机的掌握权。在1998年Lincoln试验室用来评估入侵检测的的5种远程攻击中,有2种是缓冲区 溢出。而在1998年CERT的13份建议中,有9份是是与缓冲区溢出有关的,在1999年, 至少有半数的

11、建议是和缓冲区溢出有关的。在Bugtraq的调查中,有2/3的被调查者认为 缓冲区溢出漏洞是一个很严峻的平安问题。缓冲区溢出漏洞和攻击有很多种形式,会在其次节对他们进行描述和分类。相应地防 卫手段也随者攻击方法的不同而不同,将在第四节描述,它的内容包括针对每种攻击类型 的有效的防卫手段。二、缓冲区溢出的漏洞和攻击缓冲区溢出攻击的目的在于扰乱具有某些特权运行的程序的功能,这样可以使得攻击 者取得程序的掌握权,假如该程序具有足够的权限,那么整个主机就被掌握了。一般而言, 攻击者攻击root程序,然后执行类似exec(sh)的执行代码来获得root权限的shell. 为了达到这个目的,攻击者必需达到

12、如下的两个目标:1 .在程序的地址空间里支配适当的代码。2 .通过适当的初始化寄存器和内存,让程序期踽到入侵者支配的地址空间执行。依据这两个目标来对缓冲区溢出攻击进行分类。在二.1节,将描述攻击代码是如何放 入被攻击程序的地址空间的。在二.2节,将介绍攻击者如何使一个程序的缓冲区溢出,并 且执行转移到攻击代码(这个就是溢出的由来I在二.3节,将综合前两节所争论的代 码支配和掌握程序执行流程的技术。-1在程序的地址空间里支配适当的代码的方法有两种在被攻击程序地址空间里支配攻击代码的方法:植入法:攻击者向被攻击的程序输入一个字符串,程序会把这个字符串放到缓冲区里。这个字 符串包含的资料是可以在这个

13、被攻击的硬彳牛平台上运行的指令序列。在这里,攻击者用被 攻击程序的缓冲区来存放攻击代码。缓冲区可以设在任何地方:堆栈(stack ,自动变量X 堆(he叩,动态安排的内存区)和静态资料区。2、采用已经存在的代码:有时,攻击者想要的代码已经在被攻击的程序中了,攻击者所要做的只是对代码传递 一些参数。比如,攻击代码要求执行exec ( 7bin/sh,而在libc库中的代码执行 exec (arg)”,其中arg使一个指向一个字符串的指针参数,那么攻击者只要把传入的参 数指针改向指向/bin/sh。-2掌握程序转移到攻击代码的方法全部的这些方法都是在寻求转变程序的执行流程,使之翳B转到攻击代码。最

14、基本的就 是溢出一个没有边界检查或者其它弱点的缓冲区,这样就扰乱了程序的正常的执行挨次。通过溢出一个缓冲区,攻击者可以用暴力的方法改写相邻的程序空间而直接跳过了系统的 检查。分类的基准是攻击者所寻求的缓冲区溢出的程序空间类型。原则上是可以任意的空间。 实际上,很多的缓冲区溢出是用暴力的方法来寻求转变程序指针的。这类程序的不同之处 就是程序空间的突破和内存空间的定位不同。主要有以下三种:1、活动纪录(Activation Records ):每当一个函数调用发生时,调用者会在堆栈中留下一个活动纪录,它包含了函数结束 时返回的地址。攻击者通过溢出堆栈中的自动变量,使返回地址指向攻击代码。通过转变

15、程序的返回地址,当函数调用结束时,程序就跳转到攻击者设定的地址,而不是原先的地 址。这类的缓冲区溢出被称为堆栈溢出攻击(Stack Smashing Attack ),是目前最常用的 缓冲区溢出攻击方式。2、函翔旨针(Function Pointers ):函数指针可以用来定位任何I地址空间。例如:void (* foo)()声明白f 返回值为 void的函数指针变量f。所以攻击者只需在可可空间内的函数指针四周找到一个能够溢 出的缓冲区,然后溢出这个缓冲区来转变函数指针。在某一时刻,当程序通过函数指针调 用函数时,程序的流程就按攻击者的意图实现了。它的一个攻击范例就是在Linux系统下 的 s

16、uperprobe 程序。3、长跳转缓冲区(Longjmp buffers ):在C语言中包含了一个简洁的检验/恢复系统,称为setjmp/longjmp.意思是在检验 点设定setjmp(buffer),用longjmp(buffer)来恢复检验点。然而,假如攻击者能 够进入缓冲区的空间,那么Tongjmp(buffer)实际上是将维到攻击者的代码。象函数指 针一样,longjmp缓冲区能够指向任何地方,所以攻击者所要做的就是找到一个可供溢出 的缓冲区。一个典型的例子就是Perl 5.003的缓冲区溢出漏洞;攻击者首先进入用来恢复 缓冲区溢出的的longjmp缓冲区,然后诱导进入恢复模式,这

17、样就使Perl的解释器目娥 到攻击代码上了。3代码植入和流程掌握技术的综合分析最简洁和常见的缓冲区溢出攻击类型就是在一个字符串里综合了代码植入和活动纪录 技术。攻击者定位一个可供溢出的自动变量,然后向程序传递一个很大的字符串,在引发 缓冲区溢出,转变活动纪录的同时植入了代码。这个是由Levy指出的攻击的模板。由于C 在习惯上只为用户和参数开拓很小的缓冲区,因此这种漏洞攻击的实例特别常见。代码植入和缓冲区溢出不肯定要在在一次动作内完成。攻击者可以在一个缓冲区内放 置代码,这是不能溢出的缓冲区。然后,攻击者通过溢出此外一个缓冲区来转移程序的指 针。这种方法T殳用来解决可供溢出的缓冲区不够大(不能放

18、下全部的代码)的状况。假如攻击者试图使用已常常驻的代码而不是从外部植入代码,他们通常必需把代码作 为参数调用。举例来说,在libc(几乎全部的C程序都要它来连接)中的部分代码段会执 行exec(something),其中somthing就是参数。攻击者然后使用缓冲区溢出转变程 序的参数,然后采用另一个缓冲区溢出访程序指针指向libc中的特定的代码段。三、缓冲区溢出攻击的试验分析2000年1月,Cerberus平安小组发布了微软的IIS 4/5存在的一个缓冲区溢出漏洞。 攻击该漏洞,可以使Web服务器崩溃,甚至猎取超级权限执行任意的代码。目前,微软 的IIS 4/5是一种主流的Web服务器程序;

19、因而,该缓冲区溢出漏洞对于网站的平安构成 了极大的威逼;它的描述如下:扫瞄器向IIS提出一个HTTP恳求,在域名(或IP地址)后,加上一个文件名,该文 件名以.htr做后缀。于是US认为客户端正在恳求一个.htr文件,.htr”扩展文件 被映像成ISAPI (Internet Service API)应用程序,IIS会复位向全部针对”.htr资源的 恳求到ISM.DLL程序z ISM.DLL打开这个文件并执行之。扫瞄器提交的恳求中包含的文件名存储在局部变量缓冲区中,若它很长,超过600个 字符时,会导致局部变量缓冲区溢出,掩盖返回地址空间,使IIS崩溃。更进一步,在如图 1所示的2K缓冲区中植

20、入一段细心设计的代码,可以使之以系统超级权限运行。四、缓冲区溢出攻击的防范方法缓冲区溢出攻击占了远程网络攻击的绝大多数,这种攻击可以使得一个匿名的 Internet用户有机会获得一台主机的部分或全部的掌握权。假如能有效地消退缓冲区溢出 的漏洞,则很大一部分的平安威逼可以得到缓解。目前有四种基本的方法爱护缓冲区免受缓冲区溢出的攻击和影响。在四.1中介绍了通 过操作系统使得缓冲区不行执行,从而阻挡攻击者植入攻击代码。在四.2中介绍了强制写 正确的代码的方法。在四.3中介绍了采用编译器的边界检查来实现缓冲区的爱护。这个方 法使得缓冲区溢出不行能消失,从而完全消退了缓冲区溢出的威逼,但是相对而言代价比

21、 较大。在四.4中介绍一种间接的方法,这个方法在程序指针失效前进行完整性检查。虽然 这种方法不能使得全部的缓冲区溢出失效,但它能阻挡绝大多数的缓冲区溢出攻击。然后 在四.5 ,分析这种爱护方法的兼容性和性能优势。四.1非执行的缓冲区通过使被攻击程序的数据段地址空间不行执行,从而使得攻击者不行能执行被植入被 攻击程序输入缓冲区的代码,这种技术被称为非执行的缓冲区技术。在早期的Unix系统设 计中,只允许程序代码在代码段中执行。但是近来的Unix和MS Windows系统由于要实 现更好的性能和功能,往往在数据段中动态地放入可执行的代码,这也是缓冲区溢出的根 源。为了保持程序的兼容性,不行能使得全

22、部程序的数据段不行执行。但是可以设定堆栈数据段不行执行,这样就可以保证程序的兼容性。Linux和Solaris 都发布了有关这方面的内核补丁。由于几乎没有任何合法的程序会在堆栈中存放代码,这 种做法几乎不产生任何兼容性问题,除了在Linux中的两个特例,这时可执行的代码必需 被放入堆栈中:(1)信号传递:Linux通过向进程堆栈释放代码然后引发中断来执行在堆栈中的代码来实现向进程发 送Unix信号。非执行缓冲区的补丁在发送信号的时候是允许缓冲区可执行的。(2 ) GCC的在线重用:争论发觉gcc在堆栈区里放置了可执行的代码作为在线重用之用。然而,关闭这个功 能并不产生任何问题,只有部分功能好像

23、不能使用。非执行堆栈的爱护可以有效地应付把代码植入自动变量的缓冲区溢出攻击,而对于其 它形式的攻击则没有效果。通过引用一个驻留的程序的指针,就可以跳过这种爱护措施。 其它的攻击可以采纳把代码植入堆或者静态数据段中来跳过爱护。四.2编写正确的代码编写正确的代码是T牛特别有意义的工作,特殊象编写C语言那种风格自由而简洁出 错的程序,这种风格是由于追求性能而忽视正确性的传统引起的。尽管花了很长的时间使 得人们知道了如何编写平安的程序,具有平安漏洞的程序照旧消失。因此人们开发了一些 工具和技术来关心阅历不足的程序员编写平安正确的程序。最简洁的方法就是用grep来搜寻源代码中简洁产生漏洞的库的调用,比如

24、对strcpy 和sprintf的调用,这两个函数都没有检查输入参数的长度。事实上,各个版本C的标准 库均有这样的问题存在。此外,人们还开发了一些高级的查错工具,如fault injection等。这些工具的目的在 于通过人为随机地产生一些缓冲区溢出来查找代码的平安漏洞。还有一些静态分析工具用 于侦测缓冲区溢出的存在。虽然这些工具关心程序员开发更平安的程序,但是由于C语言的特点,这些工具不行 能找出全部的缓冲区溢出漏洞。所以,侦错技术只能用来削减缓冲区溢出的可能,并不能 完全地消退它的存在。假如把一加仑的水注入容量为一品脱的容量中,水会四处冒出,这时你就会充分理解 溢出的含义。同样的道理,在计算机内部,假如你向一个容量有限的内存空间里存储过度

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 应用文书 > 解决方案

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com