理解和阻止缓冲区溢出

日期: 2009-09-07 作者:Kurt Seifried翻译:Sean 来源:TechTarget中国 英文

什么是缓冲区溢出   软件是一种典型的以有效的方式操纵数据的书面形式的产品。这些数据可以是文本,图像,视频或声音;但是,就程序而言,本质上它只是一串数据——通常以字节(8位数据)的形式代表某些意义(例如,颜色或文本字符)。许多流行的语言,例如C和C + +,留给程序员很大的自由度——比如让程序员明确申明缓冲区为一定的大小。其结果是,当一个程序员申明一个缓冲区时,非常容易申请一个可能不适合程序后来的指针使用的缓冲区,或者可能会在没有很充分地验证输入时接受超出缓冲区大小的数据。

  当你把超出缓冲区存储范围的数据放入缓冲区时会成为一个问题,因为这些数据后来往往终结在执行代码栈。常常攻击者会通过覆盖……

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

什么是缓冲区溢出

  软件是一种典型的以有效的方式操纵数据的书面形式的产品。这些数据可以是文本,图像,视频或声音;但是,就程序而言,本质上它只是一串数据——通常以字节(8位数据)的形式代表某些意义(例如,颜色或文本字符)。许多流行的语言,例如C和C + +,留给程序员很大的自由度——比如让程序员明确申明缓冲区为一定的大小。其结果是,当一个程序员申明一个缓冲区时,非常容易申请一个可能不适合程序后来的指针使用的缓冲区,或者可能会在没有很充分地验证输入时接受超出缓冲区大小的数据。

  当你把超出缓冲区存储范围的数据放入缓冲区时会成为一个问题,因为这些数据后来往往终结在执行代码栈。常常攻击者会通过覆盖函数的返回值,使他们中断程序流程而运行自定义的代码来实现攻击。即使在有限的空间(不到100个字节的可执行代码)大多数攻击者可以插入足够的代码威胁系统。这是尤其危险的,因为为了访问用户文件和其他敏感的业务,许多应用程序,特别是网络服务程序,以较高的权限运行——因此攻击者的代码也运行在一个很高的权限。

  为了避免缓冲区溢出,程序员在接受数据时必须牢记缓冲区大小,检查所有的输入数据的规模,以确保它不是太大。不幸的是,并不是所有的缓冲区都是可访问或可知的。往往和程序互动的第三方应用程序和库将会在没有充分检查输入数据的情况下调用缓冲区。所有这些都超出了程序员的控制范围。

  防止缓冲区溢出

  现在你知道什么是缓冲区溢出了。但你很可能像我一样,没有足够的时间去审核每一行源代码并重新编译应用程序——前提是您可以访问源代码。幸运的是,有多种软件包和操作系统可用于防止缓冲区溢出。当然,即使这安装了这些软件包,攻击者通常仍然可以执行拒绝这一服务。大多数操作系统可以通过检测缓冲区溢出并停止任何进一步的操作来有效地扼杀攻击。有三个主要的保护方案:修改系统内核(从而保护所有的应用程序);修改编译器或源代码(从而保护某一应用程序,并要求重新编译);增加一个中间设备层(以保护所有的应用程序)。您对源代码的权限和您能修改您的系统的程度将决定您采用哪种方案。

  Windows

  Windows本身没有能力来检测和防止缓冲区溢出。有一个来自SecureWave的叫做SecureStack的第三方软件包可以检测并阻止很多缓冲区溢出,但需要提醒的是它需要一个强劲的CPU才能有效地工作,而且不便宜,每套软件249美元。

  Solaris

  Solaris通过设置不可执行的堆栈而内置了检测和阻止某些种类缓冲区泄露的功能。但是请记住,有些程序依赖可执行的堆栈,设置这样的选项可能破坏这些程序。你可以加入这一行代码来检测和记录缓冲区溢出:

 

set noexec_user_stack_log=1
to /etc/system and reboot. 

  这样可以报告缓冲区溢出。

  加入这一行来阻止缓冲区溢出

  set noexec_user_stack=1
  to /etc/system and reboot. 

  这将会有效的阻止很多缓冲区溢出。

  OpenBSD on Solaris

  OpenBSD的内置了检测和防止某些缓冲区溢出功能。在Sparc平台下的StackGhost有一个硬件上的特性,只允许“cookie”或小块的数据经过XOR处理后才存放到返回地址。它在缓冲区被使用过后马上清空,让其对攻击者不可预测,这就打防止了许多攻击。欲了解更多信息请参阅:stackghost.cerias.purdue.edu/

  Linux -- libsafe

  Libsafe作为操作系统的接口来保护并防止一系列易被攻击的函数受缓冲区溢出的影响,以及避免字符串格式泄露问题。这是特别方便的,因为不需要为了缓冲区溢出而重新编译内核或者应用程序。欲了解更多信息请参阅:www.research.avayalabs.com/project/libsafe/

  Linux -- Openwall内核补丁

  Linux下的Openwall内核补丁需要重新编译内核,而且只适用于较老的2.2.x 内核;幸好,2.4.x的测试补丁已经发布。它增加了一个非可执行堆栈功能——只适用于x86系统——这将防止许多缓冲区溢出。欲了解更多信息请参阅:www.openwall.com/linux/

  Linux -- StackGuard

  StackGuard通过在缓冲区末尾放置一个标志位防止缓冲区溢出;如果这个标志位由于缓冲区溢出而改变,系统就会检测到这个问题并使程序停止。StackGuard 是GCC的增强版。但不幸的是,程序必须重新编译才能得到保护。 www.immunix.org/stackguard.html

翻译

Sean
Sean

相关推荐

  • 是什么导致网络应用中的缓冲区溢出和内存泄露?

    我们所说的在网络应用程序中的内存泄漏和缓冲区溢出是什么意思呢?可以用一个例子恰当地说明如何检测它们吗?Michael Cobb专家为我们详细解答了这一相关问题。

  • 缓冲区溢出防范策略

    软件是一种典型的以有效的方式操纵数据的书面形式的产品。这些数据可以是文本,图像,视频或声音;但是,就程序而言,本质上它只是一串数据——通常以字节(8位数据)的形式代表某些意义(例如,颜色或文本字符)。当一个程序员申明一个缓冲区时,非常容易申请一个可能不适合程序后来的指针使用的缓冲区,或者可能会在没有很充分地验证输入时接受超出缓冲区大小的数据。这就涉及到缓冲区溢出的问题,本手册将围绕这一问题展开讲解。

  • 防止缓冲区溢出攻击的策略

    了解了缓冲区溢出是如何发生的之后,如何防止黑客利用缓冲区溢出攻击并控制你的本地应用程序呢?本文将提供四种解决方案。

  • 缓冲区溢出攻击是如何发生的

    在向目标机器插入代码时会导致严重的缓冲区管理缺陷,黑客是怎样来使这些代码得以执行的?他们能够保证代码被调用吗?本文将为您提供专家为您解决这一困惑。