缓存溢出

江枫思渺然 提交于 2020-02-23 04:47:10

缓存溢出(Buffer overflow),是指在存在缓存溢出安全漏洞的计算机中,攻击者可以用超出常规长度的字符数来填满一个域,通常是内存区地址。在某些情况下,这些过量的字符能够作为“可执行”代码来运行。从而使得攻击者可以不受安全措施的约束来控制被攻击的计算机。

1. 缓存溢出攻击方式

1.1 破坏活动记录

函数调用发生时,调用者会在栈中留下函数的活动记录,包含当前被调函数的参数、返回地址、前栈指针、变量缓存区等值,它们在栈中的存放顺序如图所示。
在这里插入图片描述

由它们在栈中的存放顺序可知,返回地址、栈指针与变量缓存区紧邻,且返回地址指向函数结束后要执行的下一条指令。栈指针指向上一个函数的活动记录,这样攻击者可以利用变量缓存区溢出来修改返回地址值和栈指针,从而改变程序的执行流。

1.2 破坏堆数据

程序运行时,用户用C、C++内存操作库函数如malloc、free等在堆内存空间分配存储和释放删除用户数据,对内存的使用情况如内存块的大小、它前后指向的内存块用一个链接类的数据结构予以记录管理,管理数据同样存放于堆中,且管理数据与用户数据是相邻的。这样,攻击者可以像破坏活动记录一样来溢出堆内存中分配的用户数据空间,从而破坏管理数据。因为堆内存数据中没有指针信息,所以即使破坏了管理数据也不会改变程序的执行流,但它还是会使正常的堆操作出错,导致不可预知的结果。

1.3 更改函数指针

指针在C、C++等程序语言中使用得非常频繁,空指针可以指向任何对象的特性使得指针的使用更加灵活,但同时也需要人们对指针的使用更加谨慎小心,特别是空的函数指针,它可以使程序执行转移到任何地方。攻击者充分利用了指针的这些特性,千方百计地溢出与指针相邻的变量、缓存区,从而修改函数指针指向达到转移程序执行流的目的。

1.4 溢出固定缓存区

C标准库函数中提供了一对长跳转函数setjmp/longjmp来进行程序执行流的非局部跳转,意思是在某一个检查点设置setjmp(buffer),在程序执行过程中用longjmp(buffer)使程序执行流跳到先前设置的检查点。它们跟函数指针有些相似,在给用户提供了方便性的同时也带来了安全隐患,攻击者同样只需找一个与longjmp(buffer)相邻的缓存区并使它溢出,这样就能跳转到攻击者要运行的代码空间。典型的例子有Perl5.003的缓冲区溢出漏洞,攻击者首先进入用来恢复缓冲区溢出的longjmp缓冲区,然后诱导进入恢复模式,这样就使Perl的解释器跳转到攻击代码上了。

2. 防范缓冲区溢出

缓冲区溢出是代码中固有的漏洞,除了在开发阶段要注意编写正确的代码之外,对于用户而言,一般的防范错误为

  1. 关闭端口或服务。管理员应该知道自己的系统上安装了什么,并且哪些服务正在运行
  2. 安装软件厂商的补丁,漏洞一公布,大的厂商就会及时提供补丁
  3. 在防火墙上过滤特殊的流量,无法阻止内部人员的溢出攻击
  4. 自己检查关键的服务程序,看看是否有可怕的漏洞
  5. 以所需要的最小权限运行软件
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!