我们通常期望计算机可以按照我们的指示去执行任务,在现实生活中,我们通过使用软件来完成这些期望。目前计算机及其软件都变得非常的复杂,从我们点击鼠标到看到期望的结果这一过程中,可能经过了多层软件。为了充分利用计算机平台的能力,我们通常要依赖于这些软件层自身执行的正确性。
对于这些软件层来说,每一层都可能出现问题,软件运行的结果并不是作者所需要的,或者至少不是计算机操作者需要的。这些漏洞为我们的系统引入了一定的不确定因素,随之而来的是重大的安全漏洞。这些漏洞有些比较简单,比如软件或系统崩溃(可用于拒绝服务攻击),或者缓冲区溢出(攻击者可以以此来替换应用程序的代码,从而执行任意的命令)。
只要在软件系统中出现了由于漏洞而导致的不确定性,一些如何保护系统的观点就只能成为空想。我们可以部署防火墙、使用内核级的技术来阻止缓冲区溢出,通常也可以使用权宜之计,但是通过这种方式并不能改变基础设施的安全状况。只有提高软件的质量,同时减少相关的漏洞,才可以在安全方面取得一定的成绩。
在当今的开发环境中,要彻底消除软件中存在的漏洞是不可能的,从安全的角度来说,软件开发方面实在有太多的安全隐患,即使从事这项工作的专业人员也并不能保证认识到所有的漏洞,更别提掌握这些漏洞了。
如果我们打算在消除安全漏洞方面有所进展,那么,当开发小组谈到实际的约束条件时,我们就需要帮助他们尽量简单地定位他们软件中存在的安全问题。关于软件安全有好几本很好的书,包括本书作者编写过的一些书,但是我认为在实际中应该消除所有的复杂性,只是为开发小组提供一个小的容易记忆的关键点集合,从而提高其软件的安全性。这意味着在提高软件安全性方面,我们要花费少量的精力来定位大多数的常见问题,而不是去提供一种完美但却不切实际的方案。
当我在国土安全部工作的时候,我请John Viega将19个编程“漏洞”总结成一个列表。最开始的列表仅仅帮助我们了解一些漏洞信息,也就是向大家暴露可能成为安全漏洞的一些信息,但是这个列表操作性不是很强。本书具有较强的操作性,它提供了一份对于开发人员来说至关重要的安全漏洞的简单列表,以便他们能够有意识地去注意这些漏洞,同时还提供了如何防止这些漏洞的方法。另外,本书还将告诉您如何去发现这些问题(通过代码审查或者软件测试)。这些技术和方法都极具针对性,同时,作者还提供了一份“要”和“不要”的检查列表。本书作者做了大量的工作,希望能够用一种简单独立的方式来定位目前困扰我们的最常见的安全问题。我希望软件开发社团可以阅读本书,并利用本书中的方法来消除我们目前所使用的软件中存在的大量不确定性因素和安全威胁。
Amit Yoran
美国国土安全部国家网络安全局前局长
Great Falls, Virginia
2005年5月21日