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

日期: 2009-09-21 作者:Michael Cobb翻译:Sean 来源:TechTarget中国 英文

问:我们所说的在网络应用程序中的内存泄漏和缓冲区溢出是什么意思呢?你可以用一个例子说明如何检测它们吗?   答:这两个问题一直困扰着网络应用程序。缓冲区溢出攻击(如Code Red蠕虫病毒),会导致重要的数据泄露,危及系统的安全。不过,首先让我们来看看内存泄漏,因为这将帮助你理解缓冲区溢出。如果程序员为某种类型的变量动态分配了内存空间,而在程序结束之前又没有释放出这部分空间,此时内存泄露就发生了。

这将使系统可用的内存更少,而重复运行这样内存泄露的程序或函数,则最终会导致系统崩溃或拒绝服务(denial of service)。下面是一个会导致内存泄露的简单的代码示例: int main(int……

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

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

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

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

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

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

问:我们所说的在网络应用程序中的内存泄漏和缓冲区溢出是什么意思呢?你可以用一个例子说明如何检测它们吗?

  答:这两个问题一直困扰着网络应用程序。缓冲区溢出攻击(如Code Red蠕虫病毒),会导致重要的数据泄露,危及系统的安全。不过,首先让我们来看看内存泄漏,因为这将帮助你理解缓冲区溢出。如果程序员为某种类型的变量动态分配了内存空间,而在程序结束之前又没有释放出这部分空间,此时内存泄露就发生了。这将使系统可用的内存更少,而重复运行这样内存泄露的程序或函数,则最终会导致系统崩溃或拒绝服务(denial of service)。下面是一个会导致内存泄露的简单的代码示例:

int main(int argc, char **argv)
{
  char * memoryA = new char[10];
  memoryA [0] = 'A';
  printf("%cn", memoryA [0]);
}

  该程序给数组memoryA 分配了10个字符的存储空间,但该程序最后并没有显式释放这些空间。

  为了防止内存泄漏,当变量不再使用时,程序员应该总是释放所有动态分配的空间。对于简单的应用程序,你可以检查你的代码,以确保每一个新的申请内存的操作都有一个对应的释放操作,或者是采用语言近似配对(language-equivalent pairing)的办法。而对于更复杂的项目,你需要运行可以检测内存错误的应用程序诊断工具,如Purify或LeakTracer。此外,还可以对你的应用程序进行压力测试(stress-test),并监视其内存的消耗情况。

  缓冲区溢出可以导致应用程序或系统的崩溃,甚至还会使黑客攻击系统,并启动未经认可的进程。当程序或进程试图存储超过缓冲区设定大小的数据到缓冲区时,缓冲区溢出就发生了。例如,黑客故意给出一个比分配给它的内存缓冲区大的数据,以表(form)的形式将数据提交到网络应用程序。这种额外的数据可以覆盖邻近的内存,重写其中的任何有效的数据,往往是重写函数结束时的返回地址。通过编写一个新的返回地址,黑客可以欺骗系统去执行自己的代码。

  你应该知道,有些语言比其他语言更易产生缓冲区溢出和其他内存泄漏错误。C和C++没有提供内置的检测,因此不能确保写入到缓冲区内的数据是在该缓冲区的范围内。Windows程序员应该使用微软Visual C++.NET2003提供的strsafe.lib和strsafe.h,从而使用那些能够安全处理字符串的函数库。然而,用Java编写的应用程序并没有真正受到缓冲区溢出和内存泄漏的威胁,因为Java是一种强类型(strongly typed)语言。但是,请注意,当和其它语言编写的服务和库交互时,用Java和其他“安全”语言编写的应用程序仍然可能受缓冲区溢出影响。

  防止缓冲区溢出问题的最好办法是验证所有应用程序收到的输入数据。你甚至可以编写你自己的字符串复制函数,从而可以同时加入数据过滤检测的功能。

翻译

Sean
Sean

相关推荐

  • 查找程序漏洞 阻止缓冲区溢出攻击

    什么是缓冲区溢出,它又是如何工作的?如何防范缓冲区溢出攻击?本文通过研究缓冲区溢出的工作机制揭露其如何展开攻击,并介绍了阻止缓冲区溢出攻击的方式……

  • 缓冲区溢出防范策略

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

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

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

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

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