
缓冲区溢出攻击的分析和预防策略部门: 计算机科学班: 网络工程名称: 姚康平学生ID: 3111101157指导老师: Le Dingti时间: 2014-11-29目录1.缓冲区溢出攻击简介... ................................................... ................................................... ................................................... ................................................... .......................…………. 4.缓冲区溢出攻击的危害…………………………..5. 防止缓冲区溢出攻击的方法………………………………6.缓冲区溢出攻击的相关对策…………..... ................................................... ................................................... .................................... 1.缓冲区溢出是指缓冲区溢出当计算机用数据位数填充缓冲区时,容量超出了缓冲区本身的最大字节数,溢出的数据被覆盖在合法数据上. 理想的情况是: 程序将检查数据长度,并且不允许输入超过缓冲区长度的字符. 但是,大多数程序都假定数据长度始终与分配的存储空间匹配,这为缓冲区溢出带来了隐患. 操作系统使用的缓冲区也称为“堆栈”. 在每个操作过程之间,指令将被临时存储在“堆栈”中,并且“堆栈”也将溢出缓冲区. 其次,缓冲区溢出攻击的原理是通过写入超出程序缓冲区长度的缓冲区来使缓冲区溢出,从而破坏程序堆栈,并使程序执行其他指令以达到攻击目的.
缓冲区溢出的原因是用户未仔细检查程序中输入的参数. 例如,以下程序: void function(char * str){char buffer [16]; strcpy(buffer,str);}上面的strcpy()将直接将str的内容复制到缓冲区中. 这样,只要str的长度大于16,就会导致缓冲区溢出,并使程序运行错误. 像strcpy这样有问题的标准函数是strcat(),sprintf(),vsprintf(),gets(),scanf()等. 当然,随机填充缓冲区以使其溢出通常只会导致分段错误(分段故障),无法达到攻击目的. 最常见的方法是通过创建缓冲区溢出使程序运行用户外壳程序,然后通过该外壳程序执行其他命令. 如果程序属于root且具有suid权限,则攻击者将获得具有root权限的shell,并且可以在系统上执行任意操作. 缓冲区溢出攻击成为常见的安全攻击的原因是,缓冲区溢出漏洞过于普遍且易于实现. 此外,缓冲区溢出已成为远程攻击的主要手段,因为缓冲区溢出漏洞为攻击者提供了他想要的一切: 植入并执行攻击代码.

植入的攻击代码运行具有缓冲区溢出漏洞的程序,该程序具有某些权限,以获得对被攻击主机的控制. 在1998年林肯实验室用来评估入侵检测的五种远程攻击中,有两种是缓冲区溢出. 在1998年CERT的13项建议中,有9项与缓冲区溢出有关. 在1999年,至少有一半的建议与缓冲区溢出有关. 在ugtraq调查中,2/3的受访者认为缓冲区溢出漏洞是一个严重的安全问题. 缓冲区溢出漏洞和攻击的形式多种多样,它们将在第2节中进行描述和分类. 相应地,防御方法因攻击方法而异,这将在第4节中进行介绍. 其内容包括有效的防御方法. 每种攻击类型. 3.缓冲区溢出攻击问题缓冲区溢出攻击的目的是破坏以某些特权运行的程序的功能. 这使攻击者可以控制程序. 如果程序具有足够的权限,则将控制整个主机. 太. 一般来说,攻击者攻击根程序,然后执行类似于“ exec(sh)”的执行代码,以获得具有根权限的shell. 为了实现此目标,攻击者必须实现以下两个目标: 3.1在程序的地址空间中安排适当的代码. 3.2通过适当初始化寄存器和内存,让程序跳至入侵者安排的地址空间以执行.
基于这两个目标对缓冲区溢出攻击进行分类. 3.3有两种方法可以在程序的地址空间中排列适当的代码. 有两种方法可以在被攻击程序的地址空间中排列攻击代码: 此字符串放在缓冲区中. 该字符串中包含的数据是可以在被攻击的硬件平台上运行的指令序列. 在这里,攻击者使用被攻击程序的缓冲区来存储攻击代码. 可以在任何位置设置缓冲区: 堆栈(堆栈,自动变量),堆(堆,动态分配的内存区域)和静态数据区域. 2)使用现有代码有时,攻击者想要的代码已经在被攻击程序中,攻击者所需要做的就是将一些参数传递给代码. 例如,攻击代码要求执行“ exec(bin / sh)”,而libc库中的代码执行“ exec(arg)”,其中arg是指向字符串的指针参数,那么攻击者只需要传递参数指针,使其指向“ / bin / sh”. 3.4控制程序转移攻击代码的方法所有这些方法都试图改变程序的执行流程,以使其跳转到攻击代码. 最基本的方法是使缓冲区溢出而没有边界检查或其他弱点,这将破坏程序的正常执行顺序. 通过溢出缓冲区,攻击者可以使用暴力方法重写相邻的程序空间,并直接跳过系统检查.

分类的基础是攻击者寻求缓冲区溢出的程序空间的类型. 原则上,它可以是任何空间. 实际上,许多缓冲区溢出都使用蛮力方法来寻求更改程序指针. 这些程序之间的区别是程序空间的突破和存储空间的定位. 主要有三种类型: 1). 活动记录(Activation Records)每当发生函数调用时,调用方都会将活动记录留在堆栈中,其中包含函数结束时返回的地址. 攻击者使堆栈中的自动变量溢出,以便返回地址指向攻击代码. 通过更改程序的返回地址,当函数调用结束时,程序跳转到攻击者设置的地址,而不是原始地址. 这种类型的缓冲区溢出称为堆栈溢出攻击(Stack Smashing Attack),是当前最常用的缓冲区溢出攻击. 2)函数指针函数指针可用于定位任何地址空间. 例如: “ void(* foo)()”声明一个函数指针变量foo,返回值为void. 因此,攻击者只需找到一个缓冲区,该缓冲区可以在任何空间的函数指针附近溢出,然后溢出该缓冲区以更改函数指针. 在某个时刻,当程序通过函数指针调用函数时,程序的流就根据攻击者的意图实现了.
其攻击的一个例子是Linux下的superprobe程序. 3),Longjmp缓冲区(Longjmp缓冲区)C语言包含一个简单的验证/恢复系统,称为setjmp / longjmp. 这意味着在检查点设置“ setjmp(缓冲区)”,然后使用“ longjmp(缓冲区)”恢复检查点. 但是,如果攻击者可以进入缓冲区空间,则“ longjmp(缓冲区)”实际上是跳转到攻击者的代码. 像函数指针一样,longjmp缓冲区可以指向任何地方,因此攻击者要做的就是找到一个可能溢出的缓冲区. 一个典型的例子是Perl 5.003的缓冲区溢出漏洞. 攻击者首先进入用于恢复缓冲区溢出的longjmp缓冲区,然后诱使其进入恢复模式,以使Perl解释器跳至攻击代码. 3.5对代码植入和过程控制技术的综合分析最简单,最常见的缓冲区溢出攻击类型是将代码植入和活动记录技术集成在字符串中. 攻击者找到一个可能溢出的自动变量,然后将一个大字符串传递给程序. 缓冲区溢出,并且在更改活动记录时插入了代码. 这是Levy指出的攻击模板.

由于C仅用于为用户和参数创建较小的缓冲区,因此此类漏洞攻击的示例非常常见. 代码嵌入和缓冲区溢出不必一次完成. 攻击者可以将代码放在缓冲区中,缓冲区是不会溢出的. 然后,攻击者通过使另一个缓冲区溢出来转移程序的指针. 此方法通常用于解决可用于溢出的缓冲区不够大(无法放置所有代码)的情况. 如果攻击者尝试使用已经驻留的代码而不是从外部嵌入代码,则通常必须将代码作为参数来调用. 例如,libc中的部分代码段(几乎所有C程序都需要它连接)将执行“ exec(某事)”,其中somthing是参数. 然后,攻击者使用缓冲区溢出来更改程序的参数,然后使用另一个缓冲区溢出来使程序指针指向libc中的特定代码段. 第四,缓冲区溢出攻击可以使用它执行未经授权的指令,甚至可以获取系统特权以执行各种非法操作. 缓冲区溢出攻击有多种英文名称: 缓冲区溢出,缓冲区溢出,粉碎堆栈,废栈缓冲区溢出攻击,乱涂堆栈,破坏堆栈,内存泄漏和溢出螺丝;它们都引用相同的攻击方法.
第一个缓冲区溢出攻击是Morris蠕虫,它发生在20年前,导致瘫痪了全世界6000多台网络服务器. 在当前的网络和分布式系统安全性中,超过50%的广泛使用是缓冲区溢出. 最著名的例子是1988年利用fingerd漏洞的蠕虫. 在缓冲区溢出中,最危险的是堆栈溢出,因为入侵者可以在功能返回时使用堆栈溢出来更改返回程序的地址,并使其跳转到任何地址. 服务,另一种是跳转并执行一段恶意代码,例如获取外壳程序,然后执行所需的任何操作. 5.防止缓冲区溢出攻击的方法缓冲区溢出攻击占远程网络攻击的绝大多数. 这样的攻击可以使匿名Internet用户有机会获得主机的部分或全部控制权. 如果可以有效地消除缓冲区溢出漏洞,则可以缓解很大一部分安全威胁. 当前有四种基本方法可以保护缓冲区免受攻击和缓冲区溢出的影响. 操作系统使缓冲区不可执行,从而防止攻击者植入攻击代码. 强制编写正确代码的方法. 使用编译器的边界检查来保护缓冲区. 这种方法使缓冲区溢出成为不可能,从而完全消除了缓冲区溢出的威胁,但是相对昂贵.

但是是间接方法,该方法在程序指针失败之前执行完整性检查. 尽管此方法不能使所有缓冲区溢出失效,但可以防止大多数缓冲区溢出攻击. 然后分析这种保护方法的兼容性和性能优势. 5.1非执行缓冲区使攻击者的数据段地址空间不可执行,从而使攻击者无法执行植入到被攻击程序的输入缓冲区中的代码. 该技术称为非执行缓冲技术. . 在早期的Unix系统设计中,仅允许程序代码在代码段中执行. 但是缓冲区溢出攻击,由于性能和功能更好,Unix和MS Windows系统倾向于将可执行代码动态地放入数据段中,这也是缓冲区溢出的根源. 为了保持程序的兼容性,不可能使程序的所有数据段都无法执行. 但是可以设置为堆栈数据段不可执行,从而可以保证程序的兼容性. Linux和Solaris在这方面都发布了内核补丁. 因为几乎没有合法程序将代码存储在堆栈上,所以这种方法不会引起任何兼容性问题. 除Linux中的两种特殊情况外,此时必须将可执行代码放入堆栈中: ⑴信号传输Linux通过将代码释放到进程堆栈,然后触发中断以执行堆栈中的代码,向进程发送Unix信号.
非执行缓冲区的补丁允许在发送信号时执行缓冲区. CCGCC的重用研究发现,gcc将可执行代码放置在堆栈区域中以进行重用. 但是,关闭此功能不会引起任何问题,只有某些功能似乎不可用. 非执行堆栈保护可以有效地处理将代码嵌入自动变量中的缓冲区溢出攻击,但对其他形式的攻击没有影响. 通过引用驻留程序的指针,可以跳过此保护. 其他攻击可以使用嵌入在堆或静态数据段中的代码来跳过保护. 5.2编写正确的代码编写正确的代码是一项非常有意义的任务,尤其是像编写自由且容易出错的C样式程序一样. 这种风格是由在追求性能时忽略正确性的传统引起的. 尽管人们花了很长时间才知道如何编写安全程序,但是仍然出现了带有安全漏洞的程序. 因此,人们开发了一些工具和技术来帮助没有经验的程序员编写安全正确的程序. 最简单的方法是使用grep搜索对源代码中易受攻击的库的调用,例如对strcpy和sprintf的调用. 这两个函数都不检查输入参数的长度. 实际上,C标准库的所有版本都有这样的问题. 此外,人们还开发了一些高级故障排除工具,例如故障注入.
这些工具的目的是通过人为地随机生成一些缓冲区溢出来在代码中查找安全漏洞. 还有一些静态分析工具可用于检测缓冲区溢出的存在. 尽管这些工具可以帮助程序员开发更安全的程序,但是由于C语言的特性,这些工具无法找到所有缓冲区溢出漏洞. 因此,错误检测技术只能用于减少缓冲区溢出的可能性,而不能完全消除其存在. 第六,与缓冲区溢出攻击有关的对策每个堆栈帧对应一个函数调用. 发生函数调用时,新的堆栈框架被压入堆栈;函数返回时,将从堆栈中弹出相应的堆栈帧. 尽管堆栈框架结构的引入为实现高级语言中的功能或过程之类的概念提供了直接的硬件支持,但是由于重要的数据(例如函数返回地址)存储在程序员可以看到的堆栈上,因此它还为系统提供了安全带存在巨大的隐患. 历史上最著名的缓冲区溢出攻击可能是Morris Worm于1988年11月2日携带的攻击代码. 此Internet蠕虫利用了Fingerd程序的缓冲区溢出漏洞,对用户造成了极大的伤害. 从那时起,越来越多的缓冲区溢出漏洞被发现. 从绑定,wu-ftpd,telnetd和apache等常见服务程序,到Microsoft和Oracle等软件供应商提供的应用程序,似乎都无法弥补缓冲区溢出漏洞.
根据绿盟科技提供的漏洞报告,2002年在各种操作系统和应用程序中共发现1830个漏洞,其中432个缓冲区溢出漏洞占总数的23.6%. 在2002年具有最高严重性和最大影响的十个安全漏洞中,有六个与缓冲区溢出有关. 7.参考资料“缓冲区溢出攻击的检测,分析和预防”,“ Hacker防线2009缓冲区溢出攻击和预防相册”,“安全技术部: 恶意代码分析战斗”的影印本“黑客和画家: 从计算机时始”高视“
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-222954-1.html
额
找过期商品吧
也许是之前中国放出去的