本书是由软件安全领域的权威专家编著,讲授如何实施软件安全的专著。本书在论述软件安全理论的基础上详细讲解了如何将软件安全付诸实践。书中描述的软件安全最优方法(或者称为接触点)以优秀的软件工程方法为基础,并且在整个软件开发生命周期中都明确地仔细考量安全问题,即认识和理解普通的风险(包括实现缺陷和体系结构瑕疵)、基于安全进行设计,以及对所有的软件工件都进行彻底、客观的风险分析和测试。本书的目的是使接触点方法为你所用。采用本书的方法并不会从根本上改变你的工作方式,但是能够改善现有的软件开发生命周期,并能据此来创建自己的安全的开发生命周期。本书还介绍了知识管理、培训与认知,以及企业级的软件安全计划等方面的内容。
本书适合与软件相关的任何机构的管理人员、商业人员、软件架构人员、软件开发人员、软件测试人员以及安全管理人员阅读,可以作为大学、研究机构和培训机构的计算机安全和软件安全课程的教材和参考书。
第1部分 软件安全基础
第1章 学科定义 2
1.1 安全问题 3
1.1.1 问题的三个方面:为什么问题在不断增加
4
1.1.2 基础科学 9
1.2 软件中的安全问题 11
1.2.1 缺陷和瑕疵还有缺点,哦,天哪! 12
1.2.2 缺点的范围 15
1.2.3 应用程序安全所面临的问题 16
1.2.4 软件安全和操作 20
1.3 解决问题:软件安全的三根支柱 21
1.3.1 支柱之一:应用风险管理 22
1.3.2 支柱之二:软件安全的接触点 23
1.3.3 支柱之三:知识 29
1.4 安全工程的兴起 31
软件安全人人有责 32
第2章 风险管理框架 33
2.1 实际应用风险管理 34
2.2 如何使用本章 35
2.3 活动的五个阶段 35
2.3.1 第一阶段:理解商业环境 36
2.3.2 第二阶段:确定商业和技术风险 37
2.3.3 第三阶段:综合考虑并对风险分级 37
2.3.4 第四阶段:定义降低风险的策略 38
2.3.5 第五阶段:实施修复并进行验证 38
2.3.6 风险的测量与报告 39
2.4 RMF是一种多重循环 39
2.5 应用RMF:KillerAppCo的iWare 1.0 Server
40
2.5.1 理解商业环境 41
2.5.2 确定商业和技术风险 42
2.5.3 综合考虑并对风险分级 52
2.5.4 定义降低风险的策略 55
2.5.5 实施修复并进行验证 57
2.6 测量的重要性 58
2.6.1 测量收益率 58
2.6.2 RMF中的测量和衡量参数 59
2.7 Cigital Workbench 60
2.8 风险管理是软件安全的一种框架 63
第2部分 软件安全的七个接触点
第3章 软件安全接触点简介 66
3.1 概述:七个极好的接触点 68
3.1.1 代码审核(工具) 68
3.1.2 体系结构风险分析 69
3.1.3 渗透测试 69
3.1.4 基于风险的安全测试 70
3.1.5 滥用案例 70
3.1.6 安全需求 70
3.1.7 安全操作 71
3.1.8 外部分析 71
3.1.9 为什么只有七个接触点 71
3.2 黑与白:紧密难分地缠绕在一起的两种思路
72
3.3 向左移动 73
3.4 接触点是最优方法 75
3.5 谁应该实施软件安全 77
建立一个软件安全组 78
3.6 软件安全是一种多学科工作 80
3.7 走向成功的接触点 82
第4章 利用工具进行代码审核 84
4.1 (用工具)尽早发现实现中的缺陷 85
4.2 目标是良好,而不是完美 87
4.3 古老的历史 88
4.4 静态分析的方法 89
4.4.1 规则范围的历史 90
4.4.2 现代规则 92
4.5 进行研究的工具 97
4.6 商业工具供应商 99
4.6.1 商业源代码分析程序 99
4.6.2 源代码分析工具的关键特征 100
4.6.3 应该避免的三种特征 101
4.6.4 Fortify源代码分析套件 102
4.6.5 Fortify知识库 106
4.6.6 使用Fortify 108
4.7 接触点方法:代码审核 108
4.8 利用工具查找安全缺陷 110
第5章 体系结构风险分析 111
5.1 安全风险分析方法中的共同主题 112
5.2 传统风险分析的术语 116
5.3 知识要求 118
5.4 森林级视图的必要性 119
5.5 一个传统的风险计算的例子 122
5.6 传统方法的局限 123
5.7 现代风险分析 124
5.7.1 安全需求 124
5.7.2 一种基本的风险分析方法 126
5.8 接触点方法:体系结构风险分析 130
5.8.1 攻击抵抗力分析 131
5.8.2 不确定性分析 133
5.8.3 弱点分析 134
5.9 风险分析入门 136
5.10 体系结构风险分析是必需的 137
第6章 软件渗透测试 138
6.1 渗透测试的现状 140
6.2 软件渗透测试——一种更好的方法 144
6.2.1 使用工具 144
6.2.2 进行多次测试 147
6.3 在开发过程中应用反馈回来的测试结果 148
6.4 利用渗透测试来评估应用程序的状态 149
6.5 正确的渗透测试是有益的 149
第7章 基于风险的安全测试 151
7.1 安全问题为何与众不同 154
7.2 风险管理与安全测试 155
7.3 如何实现安全测试 156
7.3.1 由谁来测试 156
7.3.2 如何进行测试 157
7.4 考虑(恶意的)输入 164
7.5 摆脱输入 165
7.6 与渗透测试一起交替向前推进 166
第8章 滥用案例 167
8.1 安全并不是一组功能特性 170
8.2 你不能做的事情 171
8.3 创建有用的滥用案例 172
但是根本没有人会这样做! 173
8.4 接触点方法:滥用案例开发 173
8.4.1 创建反需求 175
8.4.2 创建攻击模型 176
8.5 一个滥用案例的例子 177
8.6 滥用案例很有用处 182
第9章 软件安全与安全操作相结合 184
9.1 请别站得离我太近 185
9.2 (软件安全的)万全之策 186
9.3 (立即)一起协同工作 191
9.4 未来如此光明,我必须戴墨镜了 193
第3部分 软件安全的崛起
第10章 企业级的软件安全计划 196
10.1 商业氛围 197
10.2 分步进行 199
10.3 制订一个改进计划 202
10.4 建立一种衡量方法 203
一种分三步进行的企业实施方法 204
10.5 持续不断地改进 205
10.6 商业现货软件(以及现有的软件应用程序)又该怎么办
206
一种企业信息体系结构 207
10.7 采用一种安全的开发生命周期 210
第11章 软件安全知识 211
11.1 经验、专业知识与安全 213
11.2 安全知识:一种统一的观点 214
11.3 安全知识与接触点 218
11.4 美国国土安全部的Build Security In门户网站
220
11.5 知识管理不断发展 223
11.6 现在开始实施软件安全 223
第12章 编码错误分类法 224
12.1 关于简化:七加二或者减二 225
12.1.1 输入确认和表示 226
12.1.2 API滥用 226
12.1.3 安全特征 227
12.1.4 时间和状态 227
12.1.5 错误处理 227
12.1.6 代码质量 228
12.1.7 封装 228
12.1.8 环境 228
12.2 门 229
需要更多门 236
12.3 一个完整的例子 236
12.4 清单、堆和集合 238
12.4.1 对应七界的十九宗罪 241
12.4.2 七界问题与OWASP的十大安全漏洞
242
12.5 (与分类法一起)前进并取得成功 243
第13章 附说明的参考书目和文献 245
13.1 附说明的参考书目:最近发表的作品 245
13.1.1 必读资料:最重要的五篇文献 245
13.1.2 本书中引用过的参考资料 247
13.1.3 引用过的政府出版物和标准出版物 258
13.1.4 其他的重要参考资料 258
13.2 软件安全的难题 264
基础科学:还需继续研究的领域 264
第4部分 附录
附录A Fortify源代码分析套件指南 268
A.1 审核工作台简介 269
A.2 手工审核源代码 271
A.3 确保一个可用的建造环境 272
A.4 运行源代码分析引擎 274
A.5 研究基本的SCA引擎命令行参数 276
A.6 理解原始分析结果 278
A.7 集成一种自动建造过程 280
A.8 使用Audit Workbench 284
A.9 审核开源应用程序 286
附录B ITS4规则 288
附录C 关于风险分析的练习:Smurfware 310
C.1 Smurfware SmurfScanner风险评估案例研究
310
C.2 Smurfware SmurfScanner安全设计 316
附录D 术语表 318
索 引 320
译者有幸参加了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博士所指出的,计算机安全中的首要和关键问题是软件问题。
第三,软件安全问题的根源是软件存在弱点,因此只有改变我们建造软件的方式,才能从根本上保障软件安全。软件安全的概念已经出现了将近十年,但是人们对软件安全的正确认识才刚刚建立起来。提到软件安全,大多数人,包括许多的软件人员,首先想到的都是反病毒程序和防火墙之类的保护程序,或者密码学之类的信息加密技术。到现在为止,我们在软件安全方面的主要精力依然花费在这些方面。但是,人们所津津乐道的这些东西能从根本上解决软件安全问题吗?回答是否定的。有大量的统计数据可以证明,我们现在所广泛采用的方法并不能解决软件安全问题。我用一个例子来说明这个问题。假设有一个程序,其密码验证是用加密算法来实现的,它安装在一个被防火墙保护的系统中,系统中安装了反病毒程序。这个程序仍然不是绝对安全的(其实,许多受到病毒感染或者黑客攻击的程序都具有这种保护)。首先,我们不知道这个程序是否健壮。如果系统中存在一个可能导致缓冲区溢出之类的弱点,一旦黑客发现了这个弱点,并利用它来使系统出现缓冲区溢出,就可能导致缓冲区或其相邻内存单元中的数据的泄漏或者改写,在最糟糕的情形中系统甚至会执行黑客传给它的任何代码!这样的话,无论是防火墙还是加密系统都不能阻止黑客的攻击,因为黑客是用“合法的”手段“诱使”系统被其利用的。其次,没有谁能保证防火墙和反病毒软件是完全可靠的,它们也可能存在缓冲区溢出之类的弱点。实际
在过去的几年中,软件安全已经走过一段很长的路,然而我们其实刚刚走上正轨。软件安全是建造在遭受恶意攻击时依然安全可靠且运行正确的软件的实践方法。软件安全的基本概念已经出现了将近十年,《建造安全的软件》(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章,软件安全的接触点简介,提供了关于接触点的概略介绍,并讨论了一种重要的思想,即应该尽可能早地在软件生命周期中推行安全策略(主要为了省钱),还讨论了谁应该实施软件安全,以及如何组建软件安全小组。
第4章,利用工具来进行代码审核,介绍了最重要的两种软件安全最优方法中的一种。虽然不是所有的软件项目都会有说明书,有些甚至都没有合适的文档要求,但是它们都会产生代码。缺陷(Bug,即代码中简单的实现错误)是造成50%的软件安全问题的原因,因此,在代码级找到并修正对关键的缺陷是非常重要的。自动的代码审核是通过研究黑帽子对软件中已知缺陷和弱点的利用的历史记录而设计的一种白帽子(建设)方法。其基本思想是,在建造安全的软件的过程中,应该避免在代码实现中出现问题。在过去的几年中,对代码进行安全审核已经走过了很长的一段路,而且商用工具现在也已经非常成熟,所有的软件从业者都可以使用它们。第4章描述了如何实际使用这类工具。
第5章中描述的最优方法,即体系结构风险分析,与代码审核同样重要。瑕疵(Flaw,体系结构级和设计级上的问题)是造成剩下的50%的软件安全问题的原因。令人遗憾的是,确定安全瑕疵要比在代码中寻找缺陷困难得多。其中的部分原因是许多的软件项目都只进行过最基本的软件体系结构设计,另一部分原因是因为查找软件安全瑕疵需要专门的知识和经验。体系结构的风险分析也是一种通过研究黑帽子对软件中已知缺点和弱点的利用情况的历史记录而设计的一种白帽子(建设)方法。这种情形下,在建造安全的软件的过程中,我们需要避免设计上的瑕疵。第5章还描述了一种用于风险分析的成熟方法,这是Cigital公司在过去的十多年中研究的成果。
第6章,软件渗透测试,全面介绍了一种非常普通但是却经常被误用的软件安全最优方法。渗透测试常常被简化成这样一种听起来不错的安全方法:雇佣安全顾问来对应用程序进行“各种攻击”,而且他们几乎总是能够发现那么一个严重的漏洞(通常是在网络配置中或者在作为应用程序构件的商业现货软件中)。漏洞得以弥补后,大家都认为不再存在安全问题并且放心地回家去了。开发人员通常都没有学到任何深入的本质知识(因为发现的问题似乎都是实际操作的问题),而且最糟糕的是,他们并没有获得关于完整的软件安全风险的真正理解。渗透测试是一种黑帽子(破坏)方法。最好的渗透测试是
无封面