软件安全:使安全成为软件开发必需的部分
基本信息
- 作者: (美)Gary McGraw [作译者介绍]
- 译者: 周长发 马颖华
- 丛书名: 安全技术大系
- 出版社:电子工业出版社
- ISBN:9787121058899
- 上架时间:2008-4-29
- 出版日期:2008 年4月
- 开本:16开
- 页码:332
- 版次:1-1
- 所属分类:
计算机 > 安全 > 综合
计算机 > 软件工程及软件方法学 > 软件质量、软件测试及维护
编辑推荐
软件安全领域的顶级权威Gary McGraw又一力作!.
7种软件安全接触点改变软件开发的方式,让安全成为软件开发的“核心DNA”!...
内容简介回到顶部↑
本书是由软件安全领域的权威专家编著,讲授如何实施软件安全的专著。本书在论述软件安全理论的基础上详细讲解了如何将软件安全付诸实践。书中描述的软件安全最优方法(或者称为接触点)以优秀的软件工程方法为基础,并且在整个软件开发生命周期中都明确地仔细考量安全问题,即认识和理解普通的风险(包括实现缺陷和体系结构瑕疵)、基于安全进行设计,以及对所有的软件工件都进行彻底、客观的风险分析和测试。本书的目的是使接触点方法为你所用。采用本书的方法并不会从根本上改变你的工作方式,但是能够改善现有的软件开发生命周期,并能据此来创建自己的安全的开发生命周期。本书还介绍了知识管理、培训与认知,以及企业级的软件安全计划等方面的内容。
本书适合与软件相关的任何机构的管理人员、商业人员、软件架构人员、软件开发人员、软件测试人员以及安全管理人员阅读,可以作为大学、研究机构和培训机构的计算机安全和软件安全课程的教材和参考书。
本书适合与软件相关的任何机构的管理人员、商业人员、软件架构人员、软件开发人员、软件测试人员以及安全管理人员阅读,可以作为大学、研究机构和培训机构的计算机安全和软件安全课程的教材和参考书。
作译者回到顶部↑
本书提供作译者介绍
Gary McGraw,博士,Cigital公司的首席技术官和董事会成员。他也是软件安全领域的世界级权威,与人合著了5部最畅销的安全方面的著作:与rootkit.com的Greg Hoglund合著《利用软件的弱点》(Exploiting Software;Addison-Wesley出版社,2004);与John Viega合著《建造安全的软件》(Building Secure Software;Addison-Wesley出版社,2001);与普林斯顿大学的Ed Felten教授合著《Java的安全性:有害的小程序、漏洞和解决方法》(Java Security: Hostile Applets,Holes,and Antidotes;Wiley出版社,1996)。
<< 查看详细
<< 查看详细
目录回到顶部↑
第1部分 软件安全基础
第1章 学科定义
1.1 安全问题
1.2 软件中的安全问题
1.3 解决问题:软件安全的三根支柱
1.4 安全工程的兴起软件安全人人有责
第2章 风险管理框架
2.1 实际应用风险管理
2.2 如何使用本章
2.3 活动的五个阶段
2.4 rmf是一种多重循环
2.5 应用rmf:killerappco的iware 1.0 server
2.6 测量的重要性
2.7 cigital workbench
2.8 风险管理是软件安全的一种框架
第2部分 软件安全的七个接触点
第3章 软件安全接触点简介
3.1 概述:七个极好的接触点
3.2 黑与白:紧密难分地缠绕在一起的两种思路
3.3 向左移动
第1章 学科定义
1.1 安全问题
1.2 软件中的安全问题
1.3 解决问题:软件安全的三根支柱
1.4 安全工程的兴起软件安全人人有责
第2章 风险管理框架
2.1 实际应用风险管理
2.2 如何使用本章
2.3 活动的五个阶段
2.4 rmf是一种多重循环
2.5 应用rmf:killerappco的iware 1.0 server
2.6 测量的重要性
2.7 cigital workbench
2.8 风险管理是软件安全的一种框架
第2部分 软件安全的七个接触点
第3章 软件安全接触点简介
3.1 概述:七个极好的接触点
3.2 黑与白:紧密难分地缠绕在一起的两种思路
3.3 向左移动
译者序回到顶部↑
译者有幸参加了2006年3月在美国加州Santa Clara举行的SD West开发大会。会议第三天的主题演讲(keynote)是著名的安全权威Bruce Schneier的题为“What Works, What Doesn't, and Why”的演讲。但是,演讲开始时出现在讲台上的并不是大胡子的Bruce Schneier,而是一位胖胖的先生。他风趣地说,大家好,我是Bruce Schneier,引得全场大笑。这位先生做了大约20分钟的关于“软件安全”的介绍,博得全场热烈的掌声。接着,Bruce Schneier上台,他说,大家好,我是Gary McGraw,又是一次全场大笑。然后,Bruce Schneier说,感谢Gary McGraw关于软件安全的精彩演讲,他的演讲主题与此密切相关。这是译者第一次见到软件安全领域的权威Gary McGraw博士。Gary McGraw博士在演讲中阐述了解决软件安全问题的“使安全成为必需的组成部分”的观点和名为“接触点”的一套最优方法。他的演讲给我留下了深刻的印象。因此,我修改了我的听课日程安排,选听了Gary McGraw博士的题为“Building Security In”的技术课程。正是从这个课程中,我了解到了Gary McGraw博士的新书“Software Security: Building Security In”的主要内容。我认为这本书是至今为止关于实施和保障软件安全的最全面、最实用的书籍,如果能在国内出版,肯定会给我国的软件安全带来极大的促进作用。于是,我将这本书推荐给了电子工业出版社的郭立女士。郭立女士慧眼识金,迅速与这本书的出版社Addison Wesley Professional联系并获得了本书的中文版权,这是本书中文版得以迅速出版的基础。.
SD West开发大会是美国最负盛名的软件开发技术大会之一。本次大会中,至少有四分之一的技术讲座以软件安全为主题。这有力地说明了美国软件业界目前对软件安全的重视程度。那么,什么是软件安全呢?Gary McGraw认为,软件安全就是使软件在受到恶意攻击的情形下依然能够继续正确运行的工程化软件思想。译者认为需要从如下的四个方面来理解这个定义。
首先,软件安全是计算机安全的一个分支。现代社会中,我们生活所需的一切似乎都离不开计算机系统,我们的电力、供水、交通、通讯、金融等等,都依赖于计算机系统的安全运行。但是,计算机系统并不安全,它潜伏着严重的不安全性、脆弱性和危险性。如何保障计算机系统的安全就成为我们这个时代的一个根本问题,计算机安全这门学科也因此应运而生,并成为近二十年来最热门的学科之一。计算机安全的研究范畴包括硬件安全、软件安全、数据安全、运行安全和网络安全。
其次,软件安全是计算机安全的关键。由于病毒主要是通过网络传播,而黑客主要是通过网络来进行攻击,因此,多年来人们一直认为网络安全是计算机安全的主要问题。但是在网络安全上的巨大投入却没有从根本上解决计算机安全问题。经过多年的研究,人们逐步认识到软件是计算机安全的大问题:软件的不稳定导致系统崩溃和数据丢失、病毒攻击的是软件的缺陷、黑客利用的是软件的弱点、机密和隐私的泄漏是因为软件存在漏洞……总之,危害计算机安全的绝大部分因素都与软件相关。正如Gary McGraw博士所指出的,计算机安全中的首要和关键问题是软件问题。
第三,软件安全问题的根源是软件存在弱点,因此只有改变我们建造软件的方式,才能从根本上保障软件安全。软件安全的概念已经出现了将近十年,但是人们对软件安全的正确认识才刚刚建立起来。提到软件安全,大多数人,包括许多的软件人员,首先想到的都是反病毒程序和防火墙之类的保护程序,或者密码学之类的信息加密技术。到现在为止,我们在软件安全方面的主要精力依然花费在这些方面。但是,人们所津津乐道的这些东西能从根本上解决软件安全问题吗?回答是否定的。有大量的统计数据可以证明,我们现在所广泛采用的方法并不能解决软件安全问题。我用一个例子来说明这个问题。假设有一个程序,其密码验证是用加密算法来实现的,它安装在一个被防火墙保护的系统中,系统中安装了反病毒程序。这个程序仍然不是绝对安全的(其实,许多受到病毒感染或者黑客攻击的程序都具有这种保护)。首先,我们不知道这个程序是否健壮。如果系统中存在一个可能导致缓冲区溢出之类的弱点,一旦黑客发现了这个弱点,并利用它来使系统出现缓冲区溢出,就可能导致缓冲区或其相邻内存单元中的数据的泄漏或者改写,在最糟糕的情形中系统甚至会执行黑客传给它的任何代码!这样的话,无论是防火墙还是加密系统都不能阻止黑客的攻击,因为黑客是用“合法的”手段“诱使”系统被其利用的。其次,没有谁能保证防火墙和反病毒软件是完全可靠的,它们也可能存在缓冲区溢出之类的弱点。实际上,黑客现在正在攻击防火墙和反病毒程序之类的保护程序,完全可能通过他们内部存在的这类弱点来攻击我们的系统。我们已经有了许多的防火墙、反病毒软件之类的保护程序,但是,病毒和黑客依旧猖獗——只要打开任何一份IT报纸或者杂志都能找到这类报道。问题的根源是什么呢?Gary McGraw博士指出,问题的根源就是我们所依赖的软件存在太多的安全弱点,而不断增加的软件复杂性和可扩展性更是火上浇油般地助长了这种情形。因此,解决软件安全问题的根本方法就是改善我们建造软件的方式,以建造健壮的软件,使其在遭受恶意攻击时依然能够安全可靠和正确运行。..
最后,我们需要用工程化的方法来实施软件安全。Gary McGraw博士在本书中全面、详细地介绍了这种方法。本书的副标题“使安全成为必需的组成部分”点出了实施软件安全的工程化方法的总纲,即在整个软件开发生命周期中都要确保将安全作为软件的一个有机组成部分。支持这个总纲的三根支柱是应用风险管理、软件安全的接触点和知识。风险管理是一种战略性方法,即将追踪和减轻风险作为一种贯穿整个生命周期的指导方针。接触点,即在软件开发生命周期中保障软件安全的一套最优方法,是一种战术性方法。Gary McGraw博士总结出了七个接触点,即代码审核、体系结构风险分析、渗透测试、基于风险的安全测试、滥用案例、安全需求和安全操作。无论你采用什么样的软件开发方法学,你都可以将这些接触点应用到你的开发生命周期中,而不需要完全改变你的软件开发生命周期。这些接触点从“黑帽子”(攻击和破解)和“白帽子”(防御和保护)两个方面综合地考察软件开发中可能出现的问题,结合了它们的开发生命周期就成为“安全的”开发生命周期。“安全的”开发生命周期能够在每一个开发阶段上尽可能地避免和消除漏洞,同时又保留了你熟悉的工作方式。软件安全的第三根支柱是知识,包括收集、压缩和共享能用于为软件安全方法提供坚实基础的安全知识。由于软件安全是一门新的学科,及时总结知识,并用知识来教育所有相关的人员,对确保软件安全是至关重要的。在整个开发生命周期中综合应用这些方法,就能从设计、编码和测试等各个层面上消除软件中的安全弱点,从制度上、方法上最大限度地保障软件安全。
本书是关于软件安全的最新、最全面和最实用的权威著作。作者提出的“使安全成为软件开发必需的组成部分(Build Security In, BSI)”的理念已经得到业界和政府机构的广泛认同。美国国土安全部下属的国家网络安全处(NCSD)特别建立了一个关于BSI的门户网站(http://buildsecurityin.us-cert.gov/portal/),并与美国国家标准与技术研究所(NIST)、国际标准化组织(ISO)以及电气电子工程师协会(IEEE)一起共同维护这个网站。
本书不仅从理论上阐述了软件安全问题的根源,更重要的是指出了一种解决软件安全问题的实用方法。正如美国国家科学基金会ACCURATE中心主任约翰霍普金斯大学教授Avi Rubin所指出的,“如果你的生意依赖软件(又有谁的生意不依赖软件呢),就应该买这本书,并将它张贴在餐厅的前面上。” 软件安全人人有责,与软件相关的任何机构的管理人员、商业人员、软件架构人员、软件开发人员、软件测试人员以及安全管理人员都应该具备软件安全的意识和知识,而阅读本书就是使他们快速装备自己的最好方法。现在越来越多的大学、研究机构和培训机构都设置了计算机安全和软件安全课程,本书也是这类课程的理想教材和参考书。
翻译这样一本里程碑式的名著,对译者是一种荣幸,也是一种挑战。作者的语言非常生动和生活化,为了帮助读者阅读,译者对一些较难理解的语句加了一些注释,在书中标记为“译注”,而原书中的注释标记为“原注”。译者虽尽力而为,但是由于水平所限,翻译中肯定存在不准确甚至错误之处,恳请读者方家批评指正。
本书中文版得以出版,需要感谢许多的人。感谢郭立女士对译者的信任。感谢责任编辑许艳小姐,她认真地审阅了原稿,指出了原稿中许多的错误、细心地改正了许多译者“脑是笔非”的笔误。感谢电子工业出版社博文视点资讯有限公司所有为本书中文版的出版付出努力的人。...
周长发
2007年1月
SD West开发大会是美国最负盛名的软件开发技术大会之一。本次大会中,至少有四分之一的技术讲座以软件安全为主题。这有力地说明了美国软件业界目前对软件安全的重视程度。那么,什么是软件安全呢?Gary McGraw认为,软件安全就是使软件在受到恶意攻击的情形下依然能够继续正确运行的工程化软件思想。译者认为需要从如下的四个方面来理解这个定义。
首先,软件安全是计算机安全的一个分支。现代社会中,我们生活所需的一切似乎都离不开计算机系统,我们的电力、供水、交通、通讯、金融等等,都依赖于计算机系统的安全运行。但是,计算机系统并不安全,它潜伏着严重的不安全性、脆弱性和危险性。如何保障计算机系统的安全就成为我们这个时代的一个根本问题,计算机安全这门学科也因此应运而生,并成为近二十年来最热门的学科之一。计算机安全的研究范畴包括硬件安全、软件安全、数据安全、运行安全和网络安全。
其次,软件安全是计算机安全的关键。由于病毒主要是通过网络传播,而黑客主要是通过网络来进行攻击,因此,多年来人们一直认为网络安全是计算机安全的主要问题。但是在网络安全上的巨大投入却没有从根本上解决计算机安全问题。经过多年的研究,人们逐步认识到软件是计算机安全的大问题:软件的不稳定导致系统崩溃和数据丢失、病毒攻击的是软件的缺陷、黑客利用的是软件的弱点、机密和隐私的泄漏是因为软件存在漏洞……总之,危害计算机安全的绝大部分因素都与软件相关。正如Gary McGraw博士所指出的,计算机安全中的首要和关键问题是软件问题。
第三,软件安全问题的根源是软件存在弱点,因此只有改变我们建造软件的方式,才能从根本上保障软件安全。软件安全的概念已经出现了将近十年,但是人们对软件安全的正确认识才刚刚建立起来。提到软件安全,大多数人,包括许多的软件人员,首先想到的都是反病毒程序和防火墙之类的保护程序,或者密码学之类的信息加密技术。到现在为止,我们在软件安全方面的主要精力依然花费在这些方面。但是,人们所津津乐道的这些东西能从根本上解决软件安全问题吗?回答是否定的。有大量的统计数据可以证明,我们现在所广泛采用的方法并不能解决软件安全问题。我用一个例子来说明这个问题。假设有一个程序,其密码验证是用加密算法来实现的,它安装在一个被防火墙保护的系统中,系统中安装了反病毒程序。这个程序仍然不是绝对安全的(其实,许多受到病毒感染或者黑客攻击的程序都具有这种保护)。首先,我们不知道这个程序是否健壮。如果系统中存在一个可能导致缓冲区溢出之类的弱点,一旦黑客发现了这个弱点,并利用它来使系统出现缓冲区溢出,就可能导致缓冲区或其相邻内存单元中的数据的泄漏或者改写,在最糟糕的情形中系统甚至会执行黑客传给它的任何代码!这样的话,无论是防火墙还是加密系统都不能阻止黑客的攻击,因为黑客是用“合法的”手段“诱使”系统被其利用的。其次,没有谁能保证防火墙和反病毒软件是完全可靠的,它们也可能存在缓冲区溢出之类的弱点。实际上,黑客现在正在攻击防火墙和反病毒程序之类的保护程序,完全可能通过他们内部存在的这类弱点来攻击我们的系统。我们已经有了许多的防火墙、反病毒软件之类的保护程序,但是,病毒和黑客依旧猖獗——只要打开任何一份IT报纸或者杂志都能找到这类报道。问题的根源是什么呢?Gary McGraw博士指出,问题的根源就是我们所依赖的软件存在太多的安全弱点,而不断增加的软件复杂性和可扩展性更是火上浇油般地助长了这种情形。因此,解决软件安全问题的根本方法就是改善我们建造软件的方式,以建造健壮的软件,使其在遭受恶意攻击时依然能够安全可靠和正确运行。..
最后,我们需要用工程化的方法来实施软件安全。Gary McGraw博士在本书中全面、详细地介绍了这种方法。本书的副标题“使安全成为必需的组成部分”点出了实施软件安全的工程化方法的总纲,即在整个软件开发生命周期中都要确保将安全作为软件的一个有机组成部分。支持这个总纲的三根支柱是应用风险管理、软件安全的接触点和知识。风险管理是一种战略性方法,即将追踪和减轻风险作为一种贯穿整个生命周期的指导方针。接触点,即在软件开发生命周期中保障软件安全的一套最优方法,是一种战术性方法。Gary McGraw博士总结出了七个接触点,即代码审核、体系结构风险分析、渗透测试、基于风险的安全测试、滥用案例、安全需求和安全操作。无论你采用什么样的软件开发方法学,你都可以将这些接触点应用到你的开发生命周期中,而不需要完全改变你的软件开发生命周期。这些接触点从“黑帽子”(攻击和破解)和“白帽子”(防御和保护)两个方面综合地考察软件开发中可能出现的问题,结合了它们的开发生命周期就成为“安全的”开发生命周期。“安全的”开发生命周期能够在每一个开发阶段上尽可能地避免和消除漏洞,同时又保留了你熟悉的工作方式。软件安全的第三根支柱是知识,包括收集、压缩和共享能用于为软件安全方法提供坚实基础的安全知识。由于软件安全是一门新的学科,及时总结知识,并用知识来教育所有相关的人员,对确保软件安全是至关重要的。在整个开发生命周期中综合应用这些方法,就能从设计、编码和测试等各个层面上消除软件中的安全弱点,从制度上、方法上最大限度地保障软件安全。
本书是关于软件安全的最新、最全面和最实用的权威著作。作者提出的“使安全成为软件开发必需的组成部分(Build Security In, BSI)”的理念已经得到业界和政府机构的广泛认同。美国国土安全部下属的国家网络安全处(NCSD)特别建立了一个关于BSI的门户网站(http://buildsecurityin.us-cert.gov/portal/),并与美国国家标准与技术研究所(NIST)、国际标准化组织(ISO)以及电气电子工程师协会(IEEE)一起共同维护这个网站。
本书不仅从理论上阐述了软件安全问题的根源,更重要的是指出了一种解决软件安全问题的实用方法。正如美国国家科学基金会ACCURATE中心主任约翰霍普金斯大学教授Avi Rubin所指出的,“如果你的生意依赖软件(又有谁的生意不依赖软件呢),就应该买这本书,并将它张贴在餐厅的前面上。” 软件安全人人有责,与软件相关的任何机构的管理人员、商业人员、软件架构人员、软件开发人员、软件测试人员以及安全管理人员都应该具备软件安全的意识和知识,而阅读本书就是使他们快速装备自己的最好方法。现在越来越多的大学、研究机构和培训机构都设置了计算机安全和软件安全课程,本书也是这类课程的理想教材和参考书。
翻译这样一本里程碑式的名著,对译者是一种荣幸,也是一种挑战。作者的语言非常生动和生活化,为了帮助读者阅读,译者对一些较难理解的语句加了一些注释,在书中标记为“译注”,而原书中的注释标记为“原注”。译者虽尽力而为,但是由于水平所限,翻译中肯定存在不准确甚至错误之处,恳请读者方家批评指正。
本书中文版得以出版,需要感谢许多的人。感谢郭立女士对译者的信任。感谢责任编辑许艳小姐,她认真地审阅了原稿,指出了原稿中许多的错误、细心地改正了许多译者“脑是笔非”的笔误。感谢电子工业出版社博文视点资讯有限公司所有为本书中文版的出版付出努力的人。...
周长发
2007年1月
前言回到顶部↑
在过去的几年中,软件安全已经走过一段很长的路,然而我们其实刚刚走上正轨。软件安全是建造在遭受恶意攻击时依然安全可靠且运行正确的软件的实践方法。软件安全的基本概念已经出现了将近十年,《建造安全的软件》(Building Secure Software,BSS,Viega and McGraw,2001)和《利用软件的弱点》(Exploiting Software, ES,Hoglund and McGraw 2004)最早描述了相关的概念。本书承接在此之前出版的几本书的内容,详细描述了如何在实践中实现软件安全。.
每当涉及安全问题时,许多优秀的设计人员、工程师和架构师都会误入歧途。在写完《Java的安全性》(Java Security,McGraw and Felten,1996)及其后续的《保障Java的安全》(Securing Java,McGraw and Felten ,1999)之后,我开始思考其中的原因:是什么使安全成为软件的一个大问题呢?如果你想建造安全的软件,应该怎样做呢?这些问题加上John Viega的坚持不懈的努力就产生了《建造安全的软件》一书。
《建造安全的软件》,白帽子(white hat) 书,似乎触发了一场革命。曾经完全地依赖防火墙、入侵检测和反病毒机制维护系统安全的人员,开始理解使用优秀的软件的必要性,并接受这种观念。BSS为软件安全领域的蓬勃发展提供了一个条理清晰并具有洞察力的哲学基础。
《利用软件的弱点》,黑帽子(black hat) 书,提供了一种必要的平衡,教人如何破解软件,并说明了恶意的黑客是如何编写攻击程序的。ES的目的是为了对软件安全进行一种实地检查,让好人来实施真正的攻击,并发明和传播真正有效的解决方法。从某种意义来说,这两本书的内容互为镜像。
《软件安全》将软件安全的两个方面——攻击与防御、利用与设计、破解与建造——统一在一起,成为一个整体。正如阴与阳一样,软件安全需要一种精细的平衡。
本书为谁而写
《软件安全》是一本说明“如何实施”软件安全的书籍。在大多数机构中,没有人专门负责软件安全,但是,实际上,软件安全人人有责。希望本书将有助于解释,对于软件安全为什么要这样做和应该做些什么。
本书所针对的主要读者是软件安全专业人士。如果你的工作是分析软件的安全问题,那么你将会发现本书中讲述了许多能即时应用的思想和方法。软件安全专业人士应该在整个软件生命周期中尽量地使用每一种最优方法(本书叫做“接触点”,touchpoint),遵循风险管理框架,并应用软件安全知识。如果你是一个软件安全人员,我认为你应该通读全书。
随着计算机安全的发展,安全分析的工作变得越来越复杂。软件安全专业人士可以从第1、2和9章中获得不少帮助。第1章是关于软件安全的讨论,证明关注软件安全是非常必要的。作为一种行动哲学,第2章的风险管理框架直接应用于计算机安全,而与软件无关。第9章是特别为那些可能不需要过多地了解软件的计算机安全专业人士编写的。实践证明,为了增强和支持软件安全,软件安全的实际操作人员还有许多事情要做。我们需要你的帮助。
软件开发人员和架构人员总是乐于学习新知识。希望软件安全的课程也能在许多开发公司找到市场。软件人员可能从第4章和第5章描述的代码审核和体系结构风险分析,以及第12章描述的代码错误分类中获得最大的益处。当然,本书描述的所有最优方法都可以供那些进行实际工作的人直接使用(第二部分)。因此,他们从第二部分的每一章中都可以有所收获。如果你是一个程序员,而且曾经想为软件安全做些什么而不是袖手旁观,那么本书将给你带来一些具体的方法,还应该注意,第二部分的每一章都包括一部分称为程序员之角的内容,这是专门为开发人员编写的。
我们这些痴迷电脑的人(geek③)对安全的了解并没有达到我们所应该达到的程度,商务人员和技术经理们可能会对此感到奇怪。商务领导者将从本书的第一部分中受益,虽然它可能会让他们的睡眠不那么安稳。商务主管人员当然应该考虑风险管理,正如第2章所描述的,将风险管理框架放在合适的位置是非常有价值的(并且可以产生有用的衡量方法,可供采用)。第10章也是很有价值的,特别是对于想知道如何进行部门改革以生产优秀、可靠和安全的软件的高层经理。
学术界人士和研究人员可能将最赞赏第12章,虽然我肯定会被某些教授烤成脆土豆片④。对于刚开始进行研究工作的科学家来说,第13章中附加说明的参考资料是非常有用的。我希望每一个接触点方法都提出了足够多的未决问题,并能据此产生一些研究项目。
本书讲什么
本书提出了一种在实际中实施软件安全的清晰而详细的方法。本书介绍了前瞻性的设计方法以及如何在风险管理基础上进行细致的抵御攻击性程序的测试,将它们融合在一起,详细解释了如何适当地处理软件导致的安全风险。
本书分为三个部分。第一部分,软件安全基础,介绍软件安全领域的最新进展。读过《建造安全的软件》和《利用软件的弱点》的读者将在这部分中发现一些熟悉的内容,尽管更新了一些处理问题的方法。
第1章,学科定义,首先深入地描述了计算机安全问题,并解释了为什么软件内部存在的问题是其被破解的根源。有些人可能早已知道这一点,但是三位一体的问题——互连性、可扩展性和复杂性——对软件的影响比过去任何时候都要深刻。软件无处不在,并且是商业和社会的生命力。软件安全涉及各种软件,包括在你的电话、汽车和洗衣机中的软件(更不用说你的计算机中的软件和基于网络的应用程序)。由于这个原因,应用程序安全和软件安全之间存在重大的差别。本书讨论使所有软件正常运行的方法,并阐述了如何根据现代安全要求来实施这些方法。第1章中最重要的内容就是介绍软件安全的三大支柱:应用风险管理、软件安全最优方法(接触点),以及知识。这三大支柱中的每一个对于软件安全来说都是必不可少的。..
第2章,风险管理框架,阐述了笔者对风险管理的基本观点,以及如何实施。在计算机安全中,风险管理常常都只是挂在嘴边。我们都知道应该做,但是却没有人说过应该如何做。第2章改变了这种情形,提出了一种持续的风险管理框架,包括确定风险、综合风险、对风险分级,以及在整个软件开发过程中追踪风险。只有通过实施风险管理并分析关键业务信息可能产生的影响,才能开始使软件安全得到它在业务中所应该得到的关注。
本书的第二部分,软件安全的七个接触点,主要论述了软件安全的最优方法。接触点是软件安全的三大支柱之一。获得软件安全可能并不容易,但是它也不应该成为一种负担。为了回避关于过程的门户之见⑤,在这一部分笔者以已经完成的软件工件为基础描述了一组易管理的接触点并继续讨论软件安全的内容。当开始使安全成为必需的组成部分时,你不必采用全部的七个接触点(虽然强烈推荐这样做)。本书封二所印的图形按照有效性和重要性排序展示了这七个接触点。设计这些接触点的目的是为了弥补方法的状态和实践的状态之间的差距——只有通过普遍地采用最优方法才能实现这一点。
接触点是一种破坏活动和建设活动的混合体。破坏活动(destructive activities)是关于攻击、利用弱点和破解软件的方法,用黑帽子(进攻)来表示。建设活动(constructive activities)是关于设计、抵御和功能的方法,用白帽子(防御)来表示。这两种帽子都是必需的。
第3章,软件安全的接触点简介,提供了关于接触点的概略介绍,并讨论了一种重要的思想,即应该尽可能早地在软件生命周期中推行安全策略(主要为了省钱),还讨论了谁应该实施软件安全,以及如何组建软件安全小组。
每当涉及安全问题时,许多优秀的设计人员、工程师和架构师都会误入歧途。在写完《Java的安全性》(Java Security,McGraw and Felten,1996)及其后续的《保障Java的安全》(Securing Java,McGraw and Felten ,1999)之后,我开始思考其中的原因:是什么使安全成为软件的一个大问题呢?如果你想建造安全的软件,应该怎样做呢?这些问题加上John Viega的坚持不懈的努力就产生了《建造安全的软件》一书。
《建造安全的软件》,白帽子(white hat) 书,似乎触发了一场革命。曾经完全地依赖防火墙、入侵检测和反病毒机制维护系统安全的人员,开始理解使用优秀的软件的必要性,并接受这种观念。BSS为软件安全领域的蓬勃发展提供了一个条理清晰并具有洞察力的哲学基础。
《利用软件的弱点》,黑帽子(black hat) 书,提供了一种必要的平衡,教人如何破解软件,并说明了恶意的黑客是如何编写攻击程序的。ES的目的是为了对软件安全进行一种实地检查,让好人来实施真正的攻击,并发明和传播真正有效的解决方法。从某种意义来说,这两本书的内容互为镜像。
《软件安全》将软件安全的两个方面——攻击与防御、利用与设计、破解与建造——统一在一起,成为一个整体。正如阴与阳一样,软件安全需要一种精细的平衡。
本书为谁而写
《软件安全》是一本说明“如何实施”软件安全的书籍。在大多数机构中,没有人专门负责软件安全,但是,实际上,软件安全人人有责。希望本书将有助于解释,对于软件安全为什么要这样做和应该做些什么。
本书所针对的主要读者是软件安全专业人士。如果你的工作是分析软件的安全问题,那么你将会发现本书中讲述了许多能即时应用的思想和方法。软件安全专业人士应该在整个软件生命周期中尽量地使用每一种最优方法(本书叫做“接触点”,touchpoint),遵循风险管理框架,并应用软件安全知识。如果你是一个软件安全人员,我认为你应该通读全书。
随着计算机安全的发展,安全分析的工作变得越来越复杂。软件安全专业人士可以从第1、2和9章中获得不少帮助。第1章是关于软件安全的讨论,证明关注软件安全是非常必要的。作为一种行动哲学,第2章的风险管理框架直接应用于计算机安全,而与软件无关。第9章是特别为那些可能不需要过多地了解软件的计算机安全专业人士编写的。实践证明,为了增强和支持软件安全,软件安全的实际操作人员还有许多事情要做。我们需要你的帮助。
软件开发人员和架构人员总是乐于学习新知识。希望软件安全的课程也能在许多开发公司找到市场。软件人员可能从第4章和第5章描述的代码审核和体系结构风险分析,以及第12章描述的代码错误分类中获得最大的益处。当然,本书描述的所有最优方法都可以供那些进行实际工作的人直接使用(第二部分)。因此,他们从第二部分的每一章中都可以有所收获。如果你是一个程序员,而且曾经想为软件安全做些什么而不是袖手旁观,那么本书将给你带来一些具体的方法,还应该注意,第二部分的每一章都包括一部分称为程序员之角的内容,这是专门为开发人员编写的。
我们这些痴迷电脑的人(geek③)对安全的了解并没有达到我们所应该达到的程度,商务人员和技术经理们可能会对此感到奇怪。商务领导者将从本书的第一部分中受益,虽然它可能会让他们的睡眠不那么安稳。商务主管人员当然应该考虑风险管理,正如第2章所描述的,将风险管理框架放在合适的位置是非常有价值的(并且可以产生有用的衡量方法,可供采用)。第10章也是很有价值的,特别是对于想知道如何进行部门改革以生产优秀、可靠和安全的软件的高层经理。
学术界人士和研究人员可能将最赞赏第12章,虽然我肯定会被某些教授烤成脆土豆片④。对于刚开始进行研究工作的科学家来说,第13章中附加说明的参考资料是非常有用的。我希望每一个接触点方法都提出了足够多的未决问题,并能据此产生一些研究项目。
本书讲什么
本书提出了一种在实际中实施软件安全的清晰而详细的方法。本书介绍了前瞻性的设计方法以及如何在风险管理基础上进行细致的抵御攻击性程序的测试,将它们融合在一起,详细解释了如何适当地处理软件导致的安全风险。
本书分为三个部分。第一部分,软件安全基础,介绍软件安全领域的最新进展。读过《建造安全的软件》和《利用软件的弱点》的读者将在这部分中发现一些熟悉的内容,尽管更新了一些处理问题的方法。
第1章,学科定义,首先深入地描述了计算机安全问题,并解释了为什么软件内部存在的问题是其被破解的根源。有些人可能早已知道这一点,但是三位一体的问题——互连性、可扩展性和复杂性——对软件的影响比过去任何时候都要深刻。软件无处不在,并且是商业和社会的生命力。软件安全涉及各种软件,包括在你的电话、汽车和洗衣机中的软件(更不用说你的计算机中的软件和基于网络的应用程序)。由于这个原因,应用程序安全和软件安全之间存在重大的差别。本书讨论使所有软件正常运行的方法,并阐述了如何根据现代安全要求来实施这些方法。第1章中最重要的内容就是介绍软件安全的三大支柱:应用风险管理、软件安全最优方法(接触点),以及知识。这三大支柱中的每一个对于软件安全来说都是必不可少的。..
第2章,风险管理框架,阐述了笔者对风险管理的基本观点,以及如何实施。在计算机安全中,风险管理常常都只是挂在嘴边。我们都知道应该做,但是却没有人说过应该如何做。第2章改变了这种情形,提出了一种持续的风险管理框架,包括确定风险、综合风险、对风险分级,以及在整个软件开发过程中追踪风险。只有通过实施风险管理并分析关键业务信息可能产生的影响,才能开始使软件安全得到它在业务中所应该得到的关注。
本书的第二部分,软件安全的七个接触点,主要论述了软件安全的最优方法。接触点是软件安全的三大支柱之一。获得软件安全可能并不容易,但是它也不应该成为一种负担。为了回避关于过程的门户之见⑤,在这一部分笔者以已经完成的软件工件为基础描述了一组易管理的接触点并继续讨论软件安全的内容。当开始使安全成为必需的组成部分时,你不必采用全部的七个接触点(虽然强烈推荐这样做)。本书封二所印的图形按照有效性和重要性排序展示了这七个接触点。设计这些接触点的目的是为了弥补方法的状态和实践的状态之间的差距——只有通过普遍地采用最优方法才能实现这一点。
接触点是一种破坏活动和建设活动的混合体。破坏活动(destructive activities)是关于攻击、利用弱点和破解软件的方法,用黑帽子(进攻)来表示。建设活动(constructive activities)是关于设计、抵御和功能的方法,用白帽子(防御)来表示。这两种帽子都是必需的。
第3章,软件安全的接触点简介,提供了关于接触点的概略介绍,并讨论了一种重要的思想,即应该尽可能早地在软件生命周期中推行安全策略(主要为了省钱),还讨论了谁应该实施软件安全,以及如何组建软件安全小组。
序言回到顶部↑
批评软件很容易,编写软件却很难。软件越大,就越是如此。这就像说话一样——言多必失。你说得越多,听众就越容易发现批评的内容,而且他们产生误解的可能性也就越大。简短可能是智慧的灵魂,但是智慧却肯定是简短的灵魂。.
而事实上,我们的软件的确非常的絮叨可厌、代码混乱、设计不当、冗长乏味并且未经仔细推敲。软件就像我们的语言一样很容易被曲解,这令人惊讶吗?我们的软件,就像我们的语言一样,会“被骗子歪曲成制造陷阱的工具(twisted by knaves to make a trap for fools )”,这令人惊讶吗?不,这并不令人惊讶,但是,就像依赖语言一样,我们现在凡事都依赖软件。软件是如此重要,没有软件,甚至世界上的人口可能不会像现在这么多——软件用于交通管理,用于商业金融交易,用于记录和存储信息,用于翻译,用于运输,用于电源变压。换句话说,这些无可争辩的证据说明,我们必须让软件正确运行,同样地,无可争辩的证据也说明,让软件正确运行的目标现在不可能、将来也不可能会自然地实现。
McGraw博士提醒我们,破坏一种东西比设计一种不能被破坏的东西要容易得多。我个人更喜欢Sam Rayburn的朴实说法,即“任何一匹驴子都能踢翻谷仓,但是只有好木匠才能建造谷仓。”安全的软件的精确定义是,能够抵御有知觉的对手的软件。这正是人们特别关注安全的软件的原因。以质位变换命题的形式来解析这个定义:如果一个产品不存在有知觉的对手,那么它就没有安全需求。检查这一命题的最佳方法就是研究产品失败的原因——如果你的产品因为一些愚蠢的用户(“嘿,看看这个问题!”)、阿尔法粒子或者没有充电的电池而不能正常运行,那么它就不存在安全问题。假如一个快乐的傻瓜发现,在你的产品的某些输入域中输入5000个小写的a之后,他就能够成为超级用户,并且因此而导致你的产品不能正常运行,那么,即使这个傻瓜可能不具备完全的知觉能力,但是你的产品仍然存在安全需求。
这里并不存在一条泾渭分明的界线,而只有相对的差别。根据定义,在设计安全的软件时应该考虑到软件可能出现的问题。即使对手全身心地期待这样的问题出现,安全的软件也能够避免。在设计安全的软件时,应充分研究失败案例与成功案例,甚至研究失败案例还应更多。安全的软件的设计者和实现者都会预想存在一个具有思考能力的对手。
正如McGraw博士在这本书中反复强调的,只有专心致志地对待安全问题,才能烘焙出安全的产品。小时候每当我用“我不是有意这样做的,爸爸。”作为做错事的借口时,父亲总会斥责我。他总是尖锐地反问,“可是,你是有意不这样做的吗?”他这样说是为了使我成为一个更完美的人。由于工作原因,我每天都阅读关于弱点的报告。这些报告中的每一个都说,“我不是有意这样做的,爸爸。”有时,他们甚至会说,“我没有这样做,要是我做了,也不是有意的。无论如何,你没有注意到这一点,因此,如果你不希望即将发生的事故成为你的过错,就必须安装这个小小的补丁。难道我不是一个好人吗?”我真想大声质问,“你是有意不这样做的吗?”但是,最诚实的回答也不过是“我曾想有意不这样做。”..
安全专家太少,我们总是听不到足够多的意见。优秀的安全专业人才很难找到,而且对他们的需求的增长速度要快于提供的速度。当亟需安全专业人才却找不到时,你该怎么办呢?你可以将所缺乏的专业知识转化为一种处理方法,让其他的人都遵循这种方法,但是这种方法必须具备如下的特征:能够加强严谨的思维方式,避免让不怀好意的人有机可乘,并且可以充分地衡量这种方法以了解它的有效性。如果不全部采用完整的方法,只采用其中的一部分也能够从中受益,那这种方法就更好。当然,最好采用完整的方法,但是,使用任何方法所得的回报都是逐渐减少的,基于这种限制,部分努力就能得到部分价值是一件好事。McGraw博士认为他自己并不完全是设计这种方法的人,但是他所做的工作与我上面所要求的完全一致。
一个好主意,就是你一听到它就会说,“对,就是这样。”在本书中,你将发现许多这样令人交口称赞的好主意——你会情不自禁地说,“对,就是这样。”例如,代码审核是可以训练并改善软件安全的最有力的工具。再如,如果不认真地研究软件在故意的滥用时可能出现的问题,就不可能知道软件在经受挑战时需要进行多少战斗。当然,只有使用这种方法,才能得到它所带来的益处。缓冲区溢出一直是最常见的攻击手段,而且多年前我们就已经知道应该如何避免它,因此,仅仅知道如何做显然是不够的。
你可能会问,“凭什么说Cigital的方法比XYZ的方法好呢?”对此,有一种非常自然的反应:这个问题值得探讨。使用现有方法仅仅得到了很有限的效果,其中肯定出了某些问题。这些“问题”要么是因为缺乏技术,要么是因为缺乏训练。如果是缺乏技术,专家们就有责任与其他人共享有效的经验。可能存在许多可行的方法,但是本书证明至少有一种方法是有效的。本书出版后,今后继续出现的任何失败的原因都必须被归结为缺乏训练。我们很快就能知道足够多的信息。
如果读者偏好用数据说明问题(即使在一篇序中),这里就有三个数据:每4个小时就会出现一种新的Windows病毒;可能有15%的台式机都运行着或多或少地存在问题的软件;嵌入式系统的数量要超过台式机一到两个数量级,而且它们几乎是不可升级的。本书存在的目的就是为了证明其中的内容是有用的。
我所做的研究使我相信,采用最好的软件安全方法的公司和采用最差的软件安全方法的公司之间的差距正在不断增加;我推测每12个月这种不对称性(用最好和最差的缺陷密度之比来表示)就会增加一倍。如果你像我和McGraw博士一样相信,安全是可靠性的子集,那么只需要借用有效的微积分方法就能得出这样的结论:一个包含5个系统组件的商业应用程序,每一个组件有98%的正常运行时间,那么可以预期这个程序每天将有2.5个小时不能正常运行。
安全与软件之间的关系就像突变与自然选择一样,但是它们之间还是有一个极端重要的区别:你可以借助软件安全来控制你的生存优势。如果这种说法对你有吸引力,你就应该使用(至少)一些McGraw/Cigital的程序。这样做不轻松,也不好玩,但是,正如美军突击队手册所说的:
渴望舒适和态度消极是对生存危害最大的两种常见因素。
现在该是你采取行动的时候了。...
Dan Geer
2005年9月17日
于麻省剑桥市
而事实上,我们的软件的确非常的絮叨可厌、代码混乱、设计不当、冗长乏味并且未经仔细推敲。软件就像我们的语言一样很容易被曲解,这令人惊讶吗?我们的软件,就像我们的语言一样,会“被骗子歪曲成制造陷阱的工具(twisted by knaves to make a trap for fools )”,这令人惊讶吗?不,这并不令人惊讶,但是,就像依赖语言一样,我们现在凡事都依赖软件。软件是如此重要,没有软件,甚至世界上的人口可能不会像现在这么多——软件用于交通管理,用于商业金融交易,用于记录和存储信息,用于翻译,用于运输,用于电源变压。换句话说,这些无可争辩的证据说明,我们必须让软件正确运行,同样地,无可争辩的证据也说明,让软件正确运行的目标现在不可能、将来也不可能会自然地实现。
McGraw博士提醒我们,破坏一种东西比设计一种不能被破坏的东西要容易得多。我个人更喜欢Sam Rayburn的朴实说法,即“任何一匹驴子都能踢翻谷仓,但是只有好木匠才能建造谷仓。”安全的软件的精确定义是,能够抵御有知觉的对手的软件。这正是人们特别关注安全的软件的原因。以质位变换命题的形式来解析这个定义:如果一个产品不存在有知觉的对手,那么它就没有安全需求。检查这一命题的最佳方法就是研究产品失败的原因——如果你的产品因为一些愚蠢的用户(“嘿,看看这个问题!”)、阿尔法粒子或者没有充电的电池而不能正常运行,那么它就不存在安全问题。假如一个快乐的傻瓜发现,在你的产品的某些输入域中输入5000个小写的a之后,他就能够成为超级用户,并且因此而导致你的产品不能正常运行,那么,即使这个傻瓜可能不具备完全的知觉能力,但是你的产品仍然存在安全需求。
这里并不存在一条泾渭分明的界线,而只有相对的差别。根据定义,在设计安全的软件时应该考虑到软件可能出现的问题。即使对手全身心地期待这样的问题出现,安全的软件也能够避免。在设计安全的软件时,应充分研究失败案例与成功案例,甚至研究失败案例还应更多。安全的软件的设计者和实现者都会预想存在一个具有思考能力的对手。
正如McGraw博士在这本书中反复强调的,只有专心致志地对待安全问题,才能烘焙出安全的产品。小时候每当我用“我不是有意这样做的,爸爸。”作为做错事的借口时,父亲总会斥责我。他总是尖锐地反问,“可是,你是有意不这样做的吗?”他这样说是为了使我成为一个更完美的人。由于工作原因,我每天都阅读关于弱点的报告。这些报告中的每一个都说,“我不是有意这样做的,爸爸。”有时,他们甚至会说,“我没有这样做,要是我做了,也不是有意的。无论如何,你没有注意到这一点,因此,如果你不希望即将发生的事故成为你的过错,就必须安装这个小小的补丁。难道我不是一个好人吗?”我真想大声质问,“你是有意不这样做的吗?”但是,最诚实的回答也不过是“我曾想有意不这样做。”..
安全专家太少,我们总是听不到足够多的意见。优秀的安全专业人才很难找到,而且对他们的需求的增长速度要快于提供的速度。当亟需安全专业人才却找不到时,你该怎么办呢?你可以将所缺乏的专业知识转化为一种处理方法,让其他的人都遵循这种方法,但是这种方法必须具备如下的特征:能够加强严谨的思维方式,避免让不怀好意的人有机可乘,并且可以充分地衡量这种方法以了解它的有效性。如果不全部采用完整的方法,只采用其中的一部分也能够从中受益,那这种方法就更好。当然,最好采用完整的方法,但是,使用任何方法所得的回报都是逐渐减少的,基于这种限制,部分努力就能得到部分价值是一件好事。McGraw博士认为他自己并不完全是设计这种方法的人,但是他所做的工作与我上面所要求的完全一致。
一个好主意,就是你一听到它就会说,“对,就是这样。”在本书中,你将发现许多这样令人交口称赞的好主意——你会情不自禁地说,“对,就是这样。”例如,代码审核是可以训练并改善软件安全的最有力的工具。再如,如果不认真地研究软件在故意的滥用时可能出现的问题,就不可能知道软件在经受挑战时需要进行多少战斗。当然,只有使用这种方法,才能得到它所带来的益处。缓冲区溢出一直是最常见的攻击手段,而且多年前我们就已经知道应该如何避免它,因此,仅仅知道如何做显然是不够的。
你可能会问,“凭什么说Cigital的方法比XYZ的方法好呢?”对此,有一种非常自然的反应:这个问题值得探讨。使用现有方法仅仅得到了很有限的效果,其中肯定出了某些问题。这些“问题”要么是因为缺乏技术,要么是因为缺乏训练。如果是缺乏技术,专家们就有责任与其他人共享有效的经验。可能存在许多可行的方法,但是本书证明至少有一种方法是有效的。本书出版后,今后继续出现的任何失败的原因都必须被归结为缺乏训练。我们很快就能知道足够多的信息。
如果读者偏好用数据说明问题(即使在一篇序中),这里就有三个数据:每4个小时就会出现一种新的Windows病毒;可能有15%的台式机都运行着或多或少地存在问题的软件;嵌入式系统的数量要超过台式机一到两个数量级,而且它们几乎是不可升级的。本书存在的目的就是为了证明其中的内容是有用的。
我所做的研究使我相信,采用最好的软件安全方法的公司和采用最差的软件安全方法的公司之间的差距正在不断增加;我推测每12个月这种不对称性(用最好和最差的缺陷密度之比来表示)就会增加一倍。如果你像我和McGraw博士一样相信,安全是可靠性的子集,那么只需要借用有效的微积分方法就能得出这样的结论:一个包含5个系统组件的商业应用程序,每一个组件有98%的正常运行时间,那么可以预期这个程序每天将有2.5个小时不能正常运行。
安全与软件之间的关系就像突变与自然选择一样,但是它们之间还是有一个极端重要的区别:你可以借助软件安全来控制你的生存优势。如果这种说法对你有吸引力,你就应该使用(至少)一些McGraw/Cigital的程序。这样做不轻松,也不好玩,但是,正如美军突击队手册所说的:
渴望舒适和态度消极是对生存危害最大的两种常见因素。
现在该是你采取行动的时候了。...
Dan Geer
2005年9月17日
于麻省剑桥市
媒体评论回到顶部↑
“我讨厌充满了愚蠢的安全漏洞的软件。如果你要编写一款我将来可能会使用的软件,那你就需要阅读并理解这本书。”
“Gary的书告诉了我们早就应该知道的知识:在你开发软件时,最好使安全成为必需的组成部分,而且,他还说明了如何使安全成为必需的组成部分。”
——Marcus J. Ranum
防火墙的发明人Tenable Security公司首席科学家
“对于软件安全来说,最难缠的就是实现细节。本书解决了其中的细节问题。”
——Bruce Schneier Counterpane公司的CTO和创建人
“Gary的书告诉了我们早就应该知道的知识:在你开发软件时,最好使安全成为必需的组成部分,而且,他还说明了如何使安全成为必需的组成部分。”
——Marcus J. Ranum
防火墙的发明人Tenable Security公司首席科学家
“对于软件安全来说,最难缠的就是实现细节。本书解决了其中的细节问题。”
——Bruce Schneier Counterpane公司的CTO和创建人

点击看大图
加载中...
