【TechTarget中国原创】缓冲区溢出就像是个给软件安全捣蛋的男孩。围绕缓冲区溢出的讨论一直无所不在的主要原因是:缓冲区溢出是在利用软件时向目标远程注入恶意代码的主要方法。虽然缓冲区溢出的技术在很多地方公布了,这篇文章仍然是必要的。缓冲区溢出攻击已经进化了多年,和其他的攻击手段一样,新的更强大的缓冲区溢出攻击已经出现。即使不为别的,本章也将作为你更细致地掌握缓冲区溢出攻击的基础。
缓冲区溢出 101
缓冲区溢出攻击仍然享有恶意攻击之王的桂冠,并很可能在接下去的几年中一直如此。那些广泛存在的导致缓冲区溢出的漏洞是部分原因。只要这些漏洞存在,他们就将被利用。那些仍使用已经过时的内存管理功能的语言,如C和C++,助长了缓冲区溢出攻击。只要开发商仍然意识不到使用一些常用的数据库功能和系统调用的安全隐患,缓冲区溢出攻击仍将普遍存在。
控制流和内存漏洞可以有多种形式。在谷歌上搜索关键词“缓冲区溢出”会返回176000个结果。显然,曾经神秘难解的技术现在都普及了。然而,大多数攻击者(和维护者)无论对缓冲区溢出以及对他们能造成的破坏都只有最基本的了解。大多数人对安全有点兴趣的人(那些阅读信息安全文件并出席各种安全保障会议和商业活动的人)都知道,缓冲区溢出将允许远程代码注入到系统,然后运行。结果适当蠕虫和其它类型的恶意移动代码有了明确的攻击系统的路径,并留下rootkit等后门。在许多情况下,通过缓冲区溢出进行远程代码注入是可行的,后门也可以很容易地安装。
缓冲区溢出是一种内存使用上的漏洞。这个漏洞是和计算机科学的发展史密切相关的。内存曾经是一种昂贵的资源,因此,内存管理是至关重要的。在一些较旧的系统,如Voyager spacecraft,内存非常珍贵,所以一旦某些部分机器代码已不再需要,它们会马上从内存中被移除,以腾出空间作其他用途。这有力地促成了创建那些自释放的,只运行一次的程序。相反的,现代系统都有大容量的内存,几乎从来不用释放。今天大多数的连接到网络的软件系统都有可恶的内存问题,特别是当直接连接到不可靠的环境,如互联网时。内存已经很便宜,但低效的内存管理的代价是非常昂贵的。对内存的不良使用可能会导致程序内部崩溃(尤其是对控制流的引用),以及拒绝服务问题,甚至缓冲区溢出等这些远程攻击问题。
讽刺的是,虽然业界已经知道如何避免缓冲区溢出问题;但是,这些年来,能够解决这个问题的知识,对阻止网络环境下猖獗的缓冲区溢出问题几乎没有发挥任何作用。事实上,在现有的技术下能够解决这个问题,但从社会学上来说我们还有相当长的路要走。主要问题是,绝大多数的开发商仍然没有意识到这个问题。很可能在未来五到十年的时间,各种类型的缓冲区溢出问题将继续困扰着软件业。
最常见的缓冲区溢出——堆栈溢出——可以很容易地被程序员杜绝。其实一些更高深的内存崩溃的形式,比如堆溢出,才是更难避免的。一句话,在现代内存管理方案的现代编程语言被广泛使用之前,内存利用漏洞还将一直是攻击软件的主要源头。