您好, 访客   登录/注册

浅析缓冲区溢出漏洞的研究与发展

来源:用户上传      作者: 景娟娟 张建利 闫小瑞

  【摘要】缓冲区溢出(buffer overflow)是一种非常普遍、非常危险的漏洞,在各个操作系统、应用软件中广泛的存在。目前,缓冲区溢出漏洞已经成为一个针对软件的严重安全威胁。在溢出后攻击者通常可以获取到目标主机的最高权限,从而对目标主机发起各种各样的攻击。本文主要分析了缓冲区溢出漏洞的概念、原理,从几个方面分析和研究了目前常见的集中针对缓冲区溢出漏洞的检测的方法。最后对缓冲区溢出的未来研究热点进行阐述。
  【关键词】缓冲区溢出;堆栈溢出;边界检查;异常分析
  1.引言
  缓冲区溢出漏洞在近些年来已经成为影响系统安全的最常见的漏洞之一,根据微软公司2010年发布的106项危险漏洞,有2/3以上的危险漏洞与缓冲区溢出漏洞有关。在目前已经确认的软件漏洞中,缓冲区溢出漏洞约占到20%[1]。在ICAT 2003-9-12号公布的10大漏洞排名中居于榜首的仍然是缓冲区溢出漏洞;从CERT公布的截止2005年为止的统计数据中可以看书,缓冲区溢出攻击的问题正在扩大化。
  一次成功的缓冲区溢出攻击可以篡改控制流相关的数据,如返回地址值、调用函数的EBP、函数指针和GOT表等,以此改变进程的控制流,从而使系统执行攻击者所提供的恶意代码,造成严重的安全危机。因此,对于缓冲区溢出攻击的及时检测与防御具有较强的现实意义。
  2.缓冲区溢出攻击的原理
  缓冲区溢出攻击是指攻击者利用程序中存在的漏洞,向缓冲区中存入超过设计时定义的数据量,从而覆盖缓冲区相邻存储单元中的数据,使得程序在执行跳转执行攻击者所指定的代码。缓冲区溢出攻击需要由三部分组成:
  (1)代码植入:将攻击代码(shellcode)植入到目标程序中。
  (2)溢出攻击:通过输入特殊的字符串作为参数来达到缓冲区溢出,而且溢出后的返回地址指向攻击代码的起始地址。
  (3)系统劫持:通过运行攻击代码劫持并且控制系统。
  总的来说,缓冲区溢出攻击可以分为两种模式:一是通过对缓冲区的溢出直接篡改EBP和EIP等关键数据;二是通过缓冲区的溢出修改指针变量等,间接篡改EBP和EIP等关键数据。下面介绍几种典型的缓冲区溢出攻击的案例。
  2.1 篡改函数的返回地址
  篡改函数返回地址的原理是攻击者利用程序漏洞在缓冲区加入恶意代码,使得缓冲区溢出并且篡改高地址的函数返回地址,使其指向缓冲区中加入的任意代码起始地址,从而使得程序执行完并返回时定位到恶意代码中并执行。
  2.2 篡改调用函数的EBP值
  篡改调用函数的EBP值指的是攻击者通过在栈中伪造调用函数的EBP及返回地址的栈帧,修改调用函数的EBP使其指向缓冲区中伪造的栈帧。当函数正常返回时,首先弹出EBP,再将其值赋予栈指针ESP,使得ESP指向EBP处,然后弹起函数的返回地址值。当程序受到攻击时,EBP被篡改,ESP将指向缓冲区中伪造的栈帧,弹出的函数返回地址将是伪造的栈帧中的数据,即攻击者设定的地址。最终达到重定位控制的意图,执行攻击所制定的代码。
  2.3 通过指针间接篡改函数的返回地址
  若攻击者不能直接篡改函数的返回地址和EBP,那么可以利用此种攻击模式来篡改栈中的内容。这种攻击模式需要满足下面三个条件:(1)在栈帧中,调用函数的EBP与可溢出的缓冲区之间存在指针变量。(2)函数中有对指针变量赋值的语句。(3)存在可以覆盖指针的操作,例如strcpy()。
  3.缓冲区溢出攻击的检测
  目前针对缓冲区溢出攻击的检测方面,国内外已经有了相对丰富的研究内容。国外的研究主要从防御的角度进行,国内主要针对缓冲区溢出的检测作为突破口进行研究。总的来说,收集了国内外的相关研究内容,对缓冲区溢出的检测研究工作可以分为以下几个大类:
  3.1 基于目标代码的检测分析
  基于目标代码的分析主要是通过一系列的工具进行的。这种检测方法主要是通过反汇编工具对目标代码进行反汇编,然后通过文章[2]所介绍的Fuzz工具对目标代码进行黑盒分析。但是此类工具无法给出准确的执行时间,往往会使得执行时间过长而造成效率的低下。并且此方法并没有进一步的后续研究。
  3.2 基于源代码的检测分析
  此种检测方法是目前研究最多的一个分支。这种方法主要是要获取源代码并且对代码进行分析,从而得到针对缓冲区溢出检测的相关信息。目前针对源代码的检测按照检测手段又分为静态检测和动态检测两种。
  (1)静态检测方法。此种方法主要有David Evans[3]开发的LCLint工具和Yichen Xie[4]开发的ARCHER检测工具两种。LCLint将C源代码文件和一系列的LCL语言编写的规范作为输入数据,然后通过自动检测源文件和规范文件之间的不同,输出警告信息。ARCHER工具主要是首先对源代码进行语法分析,将语法生成抽象树,然后利用工具构造相应的程序流程控制图,然后再进行路径分析从而达到检测的目的。静态检测方法的主要目的是在软件的开发过程中发现漏洞并且阻止溢出,从而具有广泛的应用前景和市场。
  (2)动态检测方法。此种方法主要是首先进行反汇编得到目标代码,然后使用一些基于源代码静态检测技术进行处理。这种方法通过在源代码文件中引入一系列的assert之类的语句,跟踪内存中的缓冲区,从而在程序运行阶段加以判断是否发生攻击。
  3.3 基于硬件的检测分析
  基于硬件的检测的研究方法主要是对处理器进行改造,例如AMD Athlon-64芯片已经可以阻止缓冲区溢出的攻击。自从AMD Athlon-64芯片诞生,以及Intel的跟进研究,使得基于硬件的方法称为目前以及今后研究的热点。
  3.4 基于操作系统的检测分析   基于操作系统的检测主要是由Nebenzahl等人提出的一种针对windows系统的堆栈防御技术而开发的一个windows溢出免疫DLL。Shaozili提出一种基于操作系统内核的内存边界保护方法。基于操作系统的解决方案是目前正在形成的研究热点。
  4.缓冲区溢出漏洞检测的未来发展
  从现有的文献资料的整理和总结后可以得出目前缓冲区溢出攻击检测的研究现状所具有的几个特点:
  (1)基于源代码的静态检测技术是目前的一种主流研究方向。这主要得益于相关研究技术的积累。同时,也是随着开放源代码系统的推广以及windows平台上系统软件源代码的渐渐开放所形成的。
  (2)总体发展趋势是从软件走向硬件,从单机制走向多机制结合的趋势。自从AMD Athlon-64芯片的推出后,以及Intel芯片的跟进,使得研究者们认识到芯片级的解决方案的应用前景。目前单依赖芯片也很难去彻底解决堆栈溢出问题。
  (3)基于目标代码检测的技术研究还处在起步阶段,这方面的研究也是对基于源代码检测技术的一个技术上的补充,可以作为一个备用的研究手段。
  (4)基于操作系统的解决方案会成为下一步的研究焦点。众所周知,计算机系统安全问题从一定层面上讲并不仅仅是溢出问题,还有例如恶意代码攻击、安全审计等问题,都是计算机系统所面临的安全问题,而这些问题都可以由操作系统进一步的一体化解决,而在编译层和硬件层往往不具有这种功能。
  参考文献
  [1]Forst J C.Osipov V,Bballa N,et al.Buffer overflow attacks:detect,exploit,prevent[M].Rockland:Syngress Press,2005.
  [2]Cowan C,et al.StackGuard:Automatic Detection and Prevention of buffer-overrun Attacks.In:proceedings of the 7thUSENIX Security Symposium.January,1998.
  [3]Evans D,Guttag J,Homing J,Tan Y M.LCLint:A Tool for Using Specifications of Software Engineering.December,1994.
  [4]Xie Yichen.Chou A.Engler D.ARCHER:Using Symbolic,Pathsensitive Analysis to Detect Memory Access Errors.ESES/FSE’03.Helsinki.Finland.Sepetember,2003.
转载注明来源:https://www.xzbu.com/8/view-4644918.htm