目前最常见的安全问题是缓冲区溢出。这个特别的安全问题引发的病毒感染可能比其它原因引发的病毒感染数量的总和还要多。市场上几乎每个应用程序和操作系统都存在黑客可能利用的缓冲区溢出漏洞。这个
问题对于微软Windows来说是如此严重,以至于微软在产品的新版本(例如Windows XP Service Pack 2)中采用了一种完全不同的解决方法。本文的目的是帮助你更清晰地认识缓冲区溢出,并提供了几种用于减少(或者是消除)Visual C++应用
程序缓冲区溢出问题的技术。
导航:
什么是缓冲区溢出
缓冲区溢出证明了一个观点:除非你看着用户与你的应用程序交互操作,否则你根本就不知道用户会向应用
程序输入什么样的数据。
验证数据的范围
编程语言提供的大多数数据范围反映的都是下层硬件的实际情况,而不是现实世界的需要。例如,当你在代码中把某个值定义为Int32的时候,就意味着用户输入的值应该在-2,147,483,648到2,147,483,647之间。
验证数据的长度
有些数据类型不太容易进行快速检查。例如,字符串可以包含任意数量的字符,其数量最多只受到.NET框架组件和机器的限制。当然,很少人真的需要这么长的字符串。通常开发者要求字符串有一个最小和最大的长度范围。
排除非法的字符
黑客经常在输入信息中包含一些额外的非法字符,以了解会发生什么情况。例如,黑客通常会通过添加特定的字符建立脚本。在很多情况下,系统在没有提供任何警告的情况下就会执行脚本,赋予黑客访问系统的权利。
提供高级的用户帮助
很多开发者都不能把帮助与良好的安全性联系到一起,但是良好的帮助的确可以减少用户犯错误来提高安全性。
什么是缓冲区溢出
缓冲区溢出证明了一个观点:除非你看着用户与你的应用程序交互操作,否则你根本就不知道用户会向应用程序输入什么样的数据。这些攻击依赖于一些奇怪的想法:黑客给应用程序提供的输入信息可能超过了缓冲区的长度,结果这些额外的(超出缓冲区长度的)信息覆盖了缓冲区控制之外的内存。在某些情况下,这些内存实际上保存着可执行信息(heap memory overrun,堆存储泛滥),从而使应用程序不运行原始的可执行代码,而是运行黑客的代码;在另外一些情形中,黑客则覆盖了应用
程序的栈页面(stack memory overrun,栈存储泛滥)。
有些黑客甚至于分析你的代码,查找位置以供堆或栈存储泛滥利用。但是在有些情况下,当黑客试图向某个字段输入一些信息,查看发生什么情况的时候,这种利用可能被发现。例如,黑客可能试图输入一段简单的代码,看你的应用程序是否会执行它。不管该黑客是如何发现漏洞的,其结果都是相同的:你的应用程序失去了对黑客代码的控制权--黑客现在可以享受那些曾经是你的应用
程序才能享受的权力了。
很多开发者认为黑客会通过某些秘密的通道来利用他们所建立的
程序,但是很多利用方法是非常简单的--让操作系统显示命令提示符这样的行为在某些情况下就足以获取控制权了。如果系统的安全性稍微有一点松懈,黑客就可以获取服务器的控制权。至少,命令提示符允许黑客探测系统的状况,采用其它的某种方式来获取更多的访问权。黑客不需要在第一次尝试的时候就获得系统的控制权。他们所需要的是获取累积起来的点点滴滴的控制权。
很明显,如果要保证应用程序免受缓冲区泛滥的伤害,你就必须为应用程序提供某种保护措施。控制缓冲区泛滥的最好的方法是检查程序收到的所有输入信息,即使这些信息来自受信任的来源。本文考虑了每个
程序应该执行的四个基本的检查:检查数据范围、验证数据长度、排除非法字符、为用户提供足够的帮助以确保良好的输入。
验证数据的范围
编程语言提供的大多