欢迎来到三一文库! | 帮助中心 三一文库31doc.com 一个上传文档投稿赚钱的网站
三一文库
全部分类
  • 幼儿/小学教育>
  • 中学教育>
  • 高等教育>
  • 研究生考试>
  • 外语学习>
  • 资格/认证考试>
  • 论文>
  • IT计算机>
  • 法律/法学>
  • 建筑/环境>
  • 通信/电子>
  • 医学/心理学>
  • ImageVerifierCode 换一换
    首页 三一文库 > 资源分类 > DOCX文档下载
    分享到微信 分享到微博 分享到QQ空间

    软件工程专业缓冲区溢出的保护实践.docx

    • 资源ID:596150       资源大小:24.89KB        全文页数:8页
    • 资源格式: DOCX        下载积分:5
    快捷下载 游客一键下载
    账号登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录 微博登录
    二维码
    微信扫一扫登录
    下载资源需要5
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    软件工程专业缓冲区溢出的保护实践.docx

    1、大学*学院信息平安产品开发实践课程设计报告题目缓冲区溢出的保护学生姓名学号年级指导老师指导老师评阅意见:指导老师评分:提交时间:2007年12月微软用户1:缓冲区溢出的保护(软件工程专业)学生学号指导教师摘要:1999年Bugtraq(一个讨论平安缺陷的邮件列表)进行的一次非正式调查发现,三分之二的参与者认为第一号的缺陷就是缓冲区溢出。从1997年到2007年3月,CERT/CC发出的半数平安警报都基于缓冲区缺陷。面对如此大的威胁,我们需要知道什么是缓冲区溢出,如何防止它们,可以采用哪些最新的自动化工具来防止它们以及为什么这些工具还缺乏够,还有如何在编写程序的程序中防止它们。关键字:缓冲区溢

    2、出;溢出保护;溢出防御DetectionOfBufferOverflowAbstract:FromaninformalinvestigationonBugtraq(amaillistwhichdiscussalimitationonsecurity)in1999,wecanfindthattwo-part,sparticipantsthoughtthattheNo.1limitationisbufferoverflow.From1997toMay,2007,almosthalfthesecurewarningssentbyCERT/CCwerebasedonthelimitationofbuf

    3、fer.Facingsuchahugemenace,weneedtolearnwhatisthebufferoverflow,howtodefendthem,whichkindsofthelatestautomatizationtoolswecanusedforavoidthem,whythesetoolsstillnotenough,andhowtopreventtheminprogramming.Keywords:BufferOverflow,OverflowDetection,OverflowDefense正文1绪论1.1 立题背景缓冲区溢出是当前一些软件存在的最常见的平安隐患之一,通过

    4、提供一个恶意的输入黑客可以改变进程的执行流程,缓冲区溢出能够威胁到整个进程,机器,甚至相关的系统领域。如果运行的进程是在权限比较高的用户下面,比方administrator或者本地的系统帐户(LOCaISystemACCOUnt),那么黑客破坏所导致的损失将会很严重而且将会面临更广泛的潜在危胁。最近时期爆发的一些众所周知的病毒像,红色代码病毒和震荡波蠕虫病毒,都是C/C+代码里存在着缓冲区溢出的结果。1.2 研究内容在几乎所有计算机语言中,不管是新的语言还是旧的语言,使缓冲区溢出的任何尝试通常都会被该语言本身自动检测并阻止(比方通过引发一个异常或根据需要给缓冲区添加更多空间)。但是有两种语言不

    5、是这样:C和C+语言。C和C+语言通常只是让额外的数据乱写到其余内存的任何位置,而这种情况可能被利用从而导致恐怖的结果。更糟糕的是,用C和C+编写正确的代码来始终如一地处理缓冲区溢出则更为困难;很容易就会意外地导致缓冲区溢出。除了C和C+使用得非常广泛外,上述这些可能都是不相关的事实;例如,RedHatLinux7.1中86%的代码行都是用C或C+编写的。因此,大量的代码对这个问题都是脆弱的,因为实现语言无法保护代码防止这个问题。在C和C+语言本身中,这个问题是不容易解决的。该问题基于C语言的根本设计决定(特别是C语言中指针和数组的处理方式)。由于C+是最兼容的C语言超集,它也具有相同的问题。

    6、存在一些能防止这个问题的C/C+兼容版本,但是它们存在极其严重的性能问题。而且一旦改变C语言来防止这个问题,它就不再是C语言了。许多语言(比方Java和C#)在语法上类似C,但它们实际上是不同的语言,将现有C或C+程序改为使用那些语言是一项艰巨的任务。有些语言存在允许缓冲区溢出发生的Qdquo;转义”子句。Ada一般会检测和防止缓冲区溢出(即针对这样的尝试引发一个异常),但是不同的程序可能会禁用这个特性。Ctt一般会检测和防止缓冲区溢出,但是它允许程序员将某些例程定义为“不平安的,而这样的代码可能会导致缓冲区溢出。因此如果您使用那些转义机制,就需要使用C/C+程序所必须使用的相同种

    7、类的保护机制。许多语言都是用C语言来实现的(至少局部是用C语言来实现的),并且用任何语言编写的所有程序本质上都依赖用C或C+编写的库。因此,所有程序都会继承那些问题,所以了解这些问题是很重要的。2.缓冲区溢出的概述2.1 缓冲区溢出的起源内存溢出已经是软件开发历史上存在了近40年的“老大难问题计算机还有由程序共享,随机访问内存(RAM)O为了简化,内存管理WindowsXPSP2有功能控制当前正在使用哪段的RAMo如果启动程序,释放内存分配给程序。该内存被分为三段: 代码段此处存储程序特定执行命令。 数据段此处程序特定数据存储。 堆栈是数据段(一局部)此处存储所有与程序函数。这包括参数、缓冲区

    8、存储本地变量以及,最重要、返回地址。返回地址指定执行函数后,程序将继续从。作为是由用户输入该信息也注册作为变量,一切,发送到堆栈用户类型。不通常,此行为不提出问题。但是,如果因编程错误,超过缓冲区限制堆栈成为容易控制。整个段被指定为本地变量例如,如果攻击者选择适当项对于攻击,可能会覆盖用指令。止匕外,后续返回地址可更改为指向恶意代码。因此,程序不再正常,但盲目执行攻击者的命令。内存的底部内存的顶部buffer1sfpretabc增长-堆栈的顶部堆栈的底部许多计算机处理器,包括所有x86处理器,都支持从高位地址向低位地址“倒增长堆栈。因此,每当一个函数调用另一个函数,更多的数据将被添加到左边(低

    9、位地址),直至系统的堆栈空间耗尽。在这个例子中,当main()调用functionl()时,它将C的值压入堆栈,然后压入b的值,最后压入a的值。之后它压入return(ret)值,这个值在functionl()完成时告诉functionl()返回到main()中的何处。它还把所谓的“已保存的帧指针(savedframepointer,sfp)记录到堆栈上;这并不是必须保存的内容,此处我们不需要理解它。在任何情况下,functionl()在启动以后,它会为bufferl()预留空间,这在图1中显示为具有一个低地址位置。现在假设攻击者发送了超过bufferl()所能处理的数据。接下来会发生什么情况

    10、呢?当然,C和C+程序员不会自动检查这个问题,因此除非程序员明确地阻止它,否则下一个值将进入内存中的“下一个位置。那意味着攻击者能够改写sfp(即已保存的帧指针),然后改写ret(返回地址)。之后,当functionl()完成时,它将“返回一一不过不是返回到main(),而是返回到攻击者想要运行的任何代码。通常攻击者会使用它想要运行的恶意代码来使缓冲区溢出,然后攻击者会更改返回值以指向它们已发送的恶意代码。这意味着攻击者本质上能够在一个操作中完成整个攻击!AlephOn的文章(请参阅参考资料)详细介绍了这样的攻击代码是如何创立的。例如,将一个ASCII0字符压入缓冲区通常是很困难的,而该文介绍

    11、了攻击者一般如何能够解决这个问题。除了smashing-stack和更改返回地址外,还存在利用缓冲区溢出缺陷的其他途径。与改写返回地址不同,攻击者可以SmaShing-stack(使堆栈上的缓冲区溢出),然后改写局部变量以利用缓冲区溢出缺陷。缓冲区根本就不必在堆栈上一一它可以是堆中动态分配的内存(也称为“maHoc或“new区域),或者在某些静态分配的内存中(比方“global”或static”内存)。根本上,如果攻击者能够溢出缓冲区的边界,麻烦或许就会找上你了。然而,最危险的缓冲区溢出攻击就是stack-smashing攻击,因为如果程序对攻击者很脆弱,攻击者获得整个机器的控制权就特别容易2

    12、3.1.在程序的地址空间里安排适当的代码2. 3.1.1殖入法攻击者用被攻击程序的缓冲区来存放攻击代码。攻击者向被攻击的程序输入一个字符串,程序会把这个字符串放到缓冲区里。这个字符串包含的数据是可以在这个被攻击的硬件平台上运行的指令序列。2.3. L2利用已经存在的代码有时候,攻击者想要的代码已经在被攻击的程序中了,攻击者所要做的只是对代码传递一些参数,然后使程序跳转到指定目标。比方,在C语言中,攻击代码要求执行“exec(/bin/sh),而在IibC库中的代码执行“exec(arg),其中arg是指向一个字符串的指针参数,那么攻击者只要把传入的参数指针指向binsh”,就可以调转到Iib

    13、C库中的相应的指令序列。2.3.2.控制程序转移到攻击代码这种方法旨在改变程序的执行流程,使之跳转到攻击代码。最根本方法的就是溢出一个没有边界检查或者其他弱点的缓冲区,这样就扰乱了程序的正常的执行顺序。通过溢出一个缓冲区,攻击者可以用近乎暴力的方法改写相邻的程序空间而直接跳过了系统的检查。2.3.2.1激活纪录(ActivationRecords)每当一个函数调用发生时,调用者会在堆栈中留下一个激活纪录,它包含了函数结束时返回的地址。攻击者通过溢出这些自动变量,使这个返回地址指向攻击代码。通过改变程序的返回地址,当函数调用结束时,程序就跳转到攻击者设定的地址,而不是原先的地址。这类的缓冲区溢出

    14、被称为“stacksmashingattack,是目前常用的缓冲区溢出攻击方式。2.3.2.2函数指针(FunctionPointers)C语言中,VOid(*f)()”声明了一个返回值为VOid函数指针的变量foo。函数指针可以用来定位任何地址空间,所以攻击者只需在任何空间内的函数指针附近找到一个能够溢出的缓冲区,然后溢出这个缓冲区来改变函数指针。在某一时刻,当程序通过函数指针调用函数时,程序的流程就按攻击者的意图实现了!它的一个攻击范例就是在Linux系统下的superprobe程序。2.3.2.3长跳转缓冲区(Longjmpbuffers)在C语言中包含了一个简单的检验/恢复系统,称为s

    15、etjmplongjmpo意思是在检验点设定asetjmp(buffer),用uIongjmp(buffer),来恢复检验点。然而,如果攻击者能够进入缓冲区的空间,那么“Iongjmp(buffer)”实际上是跳转到攻击者的代码。象函数指针一样,Iongjmp缓冲区能够指向任何地方,所以攻击者所要做的就是找到一个可供溢出的缓冲区。一个典型的例子就是PerI5.003,攻击者首先进入用来恢复缓冲区溢出的的Iongjmp缓冲区,然后诱导进入恢复模式,这样就使PerI的解释器跳转到攻击代码上了!3.缓冲区溢出的保护当然,要让程序员不犯常见错误是很难的,而让程序(以及程序员)改为使用另一种语言通常更为

    16、困难。那么为何不让底层系统自动保护程序防止这些问题呢?最起码,防止stack-smashing攻击是一件好事,因为stack-smashing攻击是特别容易做到的。一般来说,更改底层系统以防止常见的平安问题是一个极好的想法,我们在本文后面也会遇到这个主题。事实证明存在许多可用的防御措施,而一些最受欢送的措施可分组为以下类别:3.1基于探测方法(canary)的防御。这包括StackGuard(由Immunix所使用)、ProPolice(由OPenBSD所使用)和Microsoft的/GS选项。非执行的堆栈防御。这包括SolarDesigner的no11-exec补丁(由OPenWan所使用)

    17、和execshield(由RedHat/Fedora所使用)。其他方法。这包括IibSafe(由Mandrake所使用)和堆栈分割方法。遗憾的是,迄今所见的所有方法都具有弱点,因此它们不是万能药,但是它们会提供一些帮助。3.2基于探测方法的防御:研究人员CrispenCowan创立了一个称为StackGuard的有趣方法。Stackguard修改C编译器(gcc),以便将一个“探测值插入到返回地址的前面。“探测仪就像煤矿中的探测仪:它在某个地方出故障时发出警告。在任何函数返回之前,它执行检查以确保探测值没有改变。如果攻击者改写返回地址(作为stack-smashing攻击的一局部),探测仪的值

    18、或许就会改变,系统内就会相应地中止。这是一种有用的方法,不过要注意这种方法无法防止缓冲区溢出改写其他值(攻击者仍然能够利用这些值来攻击系统)。人们也曾扩展这种方法来保护其他值(比方堆上的值)。Stackguard(以及其他防御措施)由Immunix所使用。IBM的stack-smashing保护程序(ssp,起初名为ProPolice)是StackGuard的方法的一种变化形式。像StackGuard一样,ssp使用一个修改正的编译器在函数调用中插入一个探测仪以检测堆栈溢出。然而,它给这种根本的思路添加了一些有趣的变化。它对存储局部变量的位置进行重新排序,并复制函数参数中的指针,以便它们也在任

    19、何数组之前。这样增强了ssp的保护能力;它意味着缓冲区溢出不会修改指针值(否则能够控制指针的攻击者就能使用指针来控制程序保存数据的位置)。默认情况下,它不会检测所有函数,而只是检测确实需要保护的函数(主要是使用字符数组的函数)。从理论上讲,这样会稍微削弱保护能力,但是这种默认行为改良了性能,同时仍然能够防止大多数问题。考虑到实用的因素,它们以独立于体系结构的方式使用gcc来实现它们的方法,从而使其更易于运用。从2003年5月的发布版本开始,广受赞誉的OPenBSD(它重点关注平安性)在他们的整个发行套件中使用了ssp(也称为ProPolice)o3.3非执行的堆栈防御:另一种方法首先使得在堆栈

    20、上执行代码变得不可能。遗憾的是,x86处理器(最常见的处理器)的内存保护机制无法容易地支持这点;通常,如果一个内存页是可读的,它就是可执行的。一个名叫SolarDesigner的开发人员想出了一种内核和处理器机制的聪明组合,为Linux内核创立了一个“非执行的堆栈补丁;有了这个补丁,堆栈上的程序就不再能够像通常的那样在x86上运行。事实证明在有些情况下,可执行程序需要在堆栈上;这包括信号处理和跳板代码(trampoline)处理。trampoline是有时由编译器(比方GNATAda编译器)生成的奇妙结构,用以支持像嵌套子例程之类的结构。SolarDesigner还解决了如何在防止攻击的同时使

    21、这些特殊情况不受影响的问题。Linux中实现这个目的的最初补丁在1998年被LinusTorvalds拒绝,这是因为一个有趣的原因。即使不能将代码放到堆栈上,攻击者也可以利用缓冲区溢出来使程序“返回某个现有的子例程(比方C库中的某个子例程),从而进行攻击。简而言之,仅只是拥有非可执行的堆栈是缺乏够的。一段时间之后,人们又想出了一种防止该问题的新思路:将所有可执行代码转移到一个称为“ASCII保护(ASCIIarmor),区域的内存区。要理解这是如何工作的,就必须知道攻击者通常不能使用一般的缓冲区溢出攻击来插入ASCIINUL字符(0)这个事实。这意味着攻击者会发现,要使一个程序返回包含0的地址

    22、是很困难的。由于这个事实,将所有可执行代码转移到包含0的地址就会使得攻击该程序困难多了。具有这个属性的最大连续内存范围是从0到0x01010100的一组内存地址,因此它们就被命名为ASCII保护区域(还有具有此属性的其他地址,但它们是分散的)。与非可执行的堆栈相结合,这种方法就相当有价值了:非可执行的堆栈阻止攻击者发送可执行代码,而ASCII保护内存使得攻击者难于通过利用现有代码来绕过非可执行堆栈。这样将保护程序代码防止堆栈、缓冲区和函数指针溢出,而且全都不需重新编译。然而,ASCII保护内存并不适用于所有程序;大程序也许无法装入ASCII保护内存区域(因此这种保护是不完美的),而且有时攻击者

    23、能够将0插入目的地址。止匕外,有些实现不支持跳板代码,因此可能必须对需要这种保护的程序禁用该特性。RedHat的IngoMolnar在他的“exec-shield”补丁中实现了这种思想,该补丁由Fedora核心(可从RedHat获得它的免费版本)所使用。最新版本的OpenWallGNU/Linux(OWL)使用了SolarDesigner提供的这种方法的实现(请参阅参考资料以获得指向这些版本的链接)。还有其他许多方法。一种方法就是使标准库对攻击更具抵抗力。LucentTechnologies开发了Libsafe,这是多个标准C库函数的包装,也就是像strcpy()这样的对stack-smash

    24、ing攻击很脆弱的函数。Libsafe是在LGPL下授予许可证的开放源代码软件。那些函数的IibSafe版本执行相关的检查,确保数组改写不会超出堆栈桢。然而,这种方法仅保护那些特定的函数,而不是从总体上防止堆栈溢出缺陷,并且它仅保护堆栈,而不保护堆栈中的局部变量。它们的最初实现使用了LD_PRELOAD,而这可能与其他程序产生冲突。Linux的Mandrake发行套件包括了Iibsafe0借助知识、谨慎和工具,C和C+中的缓冲区溢出缺陷是可以防止的。不过做起来并没有那么容易,特别是在C中。如果使用C和C+来编写平安的程序,您需要真正理解缓冲区溢出和如何防止它们。一种替代方法是使用另一种编程语言,因为如今的几乎其他所有语言都能防止缓冲区溢出。但是使用另一种语言并不会消除所有问题。许多语言依赖C库,并且许多语言还具有关闭该保护特性的机制(为速度而牺牲平安性)。但是即便如此,不管您使用哪种语言,开发人员都可能会犯其他许多错误,从而带来引入缺陷。5.参考文献12 FlashSky,Windows20033 FlashSky,5启明星辰认证平安技术工程师培训6网络信息平安概论9姚奇富,网络平安技术,浙江大学出版社,2006,145页10姚建东,秦军,古志民,两种新的缓冲区溢出攻击原理及防范,2006,5页


    注意事项

    本文(软件工程专业缓冲区溢出的保护实践.docx)为本站会员(极速器)主动上传,三一文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一文库(点击联系客服),我们立即给予删除!




    宁ICP备18001539号-1

    三一文库
    收起
    展开