缓存溢出的介绍与防护_第1页
缓存溢出的介绍与防护_第2页
缓存溢出的介绍与防护_第3页
缓存溢出的介绍与防护_第4页
缓存溢出的介绍与防护_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、缓存溢出的介绍与防护 一、缓存溢出的概念缓存溢出( Buffer Overflow )又称为缓冲区溢出。在这里先了解 一下什么是缓冲区。缓冲区是指一个程序的记忆范围(领域) ,该范围是用来储存一 些数据,如电脑程序信息、 中间计算结果或者输入的参数等,把数据 调入缓冲区之前, 程序应该验证缓冲区有足够的长度以容纳所有这些 调入的数据。 否则数据将溢出缓冲区并覆写在邻近的数据上, 当它运 行时就如同改写了程序。 假如溢出的数据是随意的, 那它就不是有效 的程序代码,当它试图执行这些随意数据时,程序就会失败。另一方 面,假如数据是有效的程序代码, 程序将会按照数据提供者所设定的 要求执行代码和新的

2、功能。 缓冲区溢出是一个非常普遍、 非常危险的 漏洞,在各种操作系统、应用软件中广泛存在。以缓冲区溢出为类型 的安全漏洞是最为常见的一种漏洞, 也因此对缓冲区溢出漏洞的攻击 占了远程网络攻击的绝大多数。缓存溢出就是将一个超过缓冲区长度的字符未置入缓冲区的结 果,而向一个有限空间的缓冲区中置人过长的字符串可能会带来两种 后果,一是过长的字符率覆盖了相邻的存储单元引起程序运行失败, 严重的可导致系统崩溃; 另一种后果是利用这种漏洞可以执行任意指 令甚至可以取得系统特权由此而引发了许多种攻击方法。很多时候, 入侵者甚至可以通过这样的方法来完全控制被入侵的电脑。二、缓存溢出的原理众所周知,c语言是不进

3、行数组的边界检查的。在许多运用c语言实现的应用程序中, 都会假定缓冲区的大小是足够的,其容量肯定大于要拷贝的字符串的长度。 然而事实上并不总是这样, 当程序出错 或者恶意的用户故意输入一过长酌字符串时, 便有许多意想不到的事 情发生,超过的那部分字符将会覆盖与数组相邻的其他变量的空间, 使变量出现不可预料的值。 如果碰巧数组与子程序的返回地址是邻近 时,便有可能由于超出的一部分字符串覆盖了子程序的返回地址, 而 使得子程序执行完毕返回时转向了另一个无法预料的地址, 使程序的 执行流程发生了错误。 甚至,由于应用程序访问了不在进程地址空间 范围的地址, 而使进程发生违例的故障。 这种错误其实是编

4、程中经常 会犯到的错误。例如代码:void function(char str)char buffer 16;strcpy(bu:ffer , str);上面的strcpy()将直接把str中的内容copy到buffer中。这样只 要 str 的长度大于 16,就会造成 buffer 的溢出,使程序运行出错。存 在象 strcpy 这样的问题的标准函数还有 strcat(), sprintf() , vsprintf(), gets(), scanf(等。当然,随便往缓冲区中填东西造成它溢出一般只会出现“分段 错误”(Segrnen-tation fault),而不能达到攻击的目的。最常见的手

5、段 是通过制造缓冲区溢出使程序运行一个用户shell,再遁过shell执行其他命令。如果该程序有 root 或者 suid 执行权限的话,攻击者就获得了一个有root权限的shell,可以对系统进行任意操作了在UNIX系统中,使用这一类精心编写的程序可以利用 suid程序 中存在的这种错误, 很轻易地取得系统的超级用户的权限。 当服务程 序在端口提供服务时,缓冲区溢出程序可以轻易地将这个服务关闭, 使得系统的服务在一定的时间内瘫痪,严重的可能使系统立刻宕机, 从而变成一种拒绝服务的攻击。 这种错误不仅是程序员的错误, 系统 本身在实现软件程序的时候出现的这种错误更多。 如今,缓冲区溢出 的错误

6、正源源不断地从 UNIX、Windows、路由器、网关以及其他的网 络设备中被发现, 并构成了对系统安全威胁数量最大、 程度较大的一 类。三、缓存溢出攻击的目的 缓存溢出攻击的目的在于扰乱具有某些特权运行的程序的功能, 这样可以让攻击者取得程序的控制权,如果该程序具有足够的权限, 那么整个主机就被控制了。 为了达到这个目的, 攻击者必须达到如下 两个目标:在程序的地址空间里安排适当的代码; 通过适当的初始化 寄存器和存储器,让程序跳转到安排好的地址空间执行。最简单和常见的缓存溢出攻击类型就是在一个字符串里综合了 代码植入和激活记录。 攻击者定位一个可供溢出的自动变量, 然后向 程序传递一个很大

7、的字符串, 在引发缓存溢出改变激活记录的同时植 入了代码。这个是由 Levy 指出的攻击的模板。因为在习惯上只为用 户和参数升辟很小的缓冲区,因此这种漏洞攻击的实例不在少数。代码植入和缓存溢出不一定要在一次动作内完成。攻击者可以 在一个缓冲区内放置代码,这时不能溢出缓冲区。然后,攻击者通过 溢出另外一个缓冲区来转移程序的指针。 这种方法一般用来解决可供 溢出的缓冲区不够大(不能放下全部的代码)的情况。四、缓存溢出的保护方法 目前有四种基本的方法保护缓冲区免受缓存溢出的攻击和影响。1 编写正确的代码 编写安全的程序代码是解决缓存溢出漏洞的根本办法,必须在 开发中就已经详细考虑过安全问题, 在编写

8、程序过程中杜绝存在缓存 溢出漏洞的一切可能, 才使确保程序的最大化安全。 编定正确的代码 是一件非常耗时琐碎的工作, 但是由于开发人员的懒惰或安全经验不 足,编程语言的不安全(用 C 语言编写的程序很容易出错) ,所以目 前具有安全漏洞的程序依旧出现。人们开发了一些工具和技术来帮助经验不足的程序员编写安全 正确的程序。最简单的方法一是搜源代码中容易产生漏洞的库的调用, 比如对 strcpy 和 sprintf 的调用,这两个函数都没有检查输入参数的长 度。二是使用安全函数库,如 Libsafe 里面封装了若干已知的易受堆 栈溢出方法攻击的库函数, 对于不安全函数调用编程时会自动转到替 代的安全

9、函数上。虽然这些工具可以帮助程序员开发更安全的程序,但是由于 C 语言的特点,这些工具不可能找出所有的缓存溢出漏洞。所以,侦错 技术只能用来减少缓存溢出的可能,并不能完全地消除它的存在。2非执行的缓冲区通过使被攻击程序的数据段地址空间不可执行,从而使得攻击 者不可能执行被植入被攻击程序输入缓冲区的代码, 这种技术称为非 执行的缓冲区技术。UNIX和MS Windows系统为实现更好的性能和功 能,往往在数据段中动态地放人可执行的代码。 为了保持程序的兼容 性不可能使得所有程序的数据段不可执行, 但是用户可以设定堆栈数 据段不可执行, 这样就可以最大限度地保证了程序的兼容性。 非执行 堆栈的保护

10、可以有效地对付把代码植入自动变量的缓冲区溢出攻击, 而对于其他形式的攻击则没有效果。通过引用一个驻留程序的指针, 就可以跳过这种保护措施, 其他的攻击可以把代码植入堆栈或者静态 数据段中来跳过保护。3程序指针完整性检查 程序指针完整性检查和边界检查相似,它在程序指针被引用之 前首先检测到它的改变。 即使一个黑客成功地改变了程序的指针, 由 于系统事先检测到了指针的改变, 这个指针将不会被使用。 与数组边 畀检查相比, 这种方法不能解决所有的缓冲区溢出问题, 不过采用一 些其他的缓冲区溢出方法就可以避免这种检测。 但是这种方法在性能 上有很大的优势,而且兼容性较好。4数组边界检查 黑客可以通过植入代码引起缓冲区溢出,也可以通过一些方法 来扰乱程序的执行流程。 但是可以通过对非执行的缓冲区保护、 数组 边界检查来完全防止缓冲区溢出的产生和攻击。 这样只要数组不能溢 出,溢出攻击也就无从谈起。为了实现数组边界检查,所有的对数组的读写操作都应当被检查以确保对数组的操作在正确的范围内。 最直 接的方法是检查所有的数组操作, 不过这样可能会降低程序的运行效 率。5安装安全补丁 大量的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论