本书分为五部分,共19章。第一部分(第1~2章)涉及入门知识,介绍威胁建模的策略、软件建模的不同方法,以及威胁建模的方式与方法。第二部分(第3~6章)介绍威胁发现方面的知识,综述和分析人们对信息技术进行威胁建模的不同方法与工具。第三部分(第7~11章)介绍管理和解决威胁方面的内容,包括处理威胁、管理威胁以及可以用于解决威胁的策略和方法。第四部分(第12~16章)介绍在特定技术领域及其他相关领域威胁建模,包括网络及云系统、账户和身份、密码学及用于开启自己的安全需求分析的“需求手册”。第五部分(第17~19章)针对经验丰富的威胁建模人员、安全专家、流程设计师提出如何为特定的组织构建和定制威胁建模流程。附录包括可帮助你快速应用威胁建模的相关信息。
第24届Jolt大奖获奖图书,微软资深安全技术专家撰写,系统且深入阐释威胁建模的工具、方法、原则和最佳实践
深入剖析威胁建模的各种常见问题,包含大量实践案例,能为程序员开发与部署安全软件提供有效指导
一切模型都是错误的,不过有些是有用的。
——George Box(20世纪著名统计学家)
在构建软件系统时,人们会遇到很多可以预见的安全威胁,对此,本书描述了一些有用的威胁模型,可以用于消除或减轻这些潜在威胁。
威胁建模,名字本身听起来非常精妙,但其实指的是我们本能都会做的事情。比如,如果让你对自己的房子进行威胁建模,你会开始想房子里都有什么珍贵的人和物:你的家人、传家宝、照片,可能还包括明星签名海报;然后,你会想别人会用什么办法闯进家里,比如通过没有上锁的门,或者开着的窗子;另外,你还会想是什么样的人会来偷东西,比如邻居家调皮的孩子、职业小偷、瘾君子、跟踪狂或是早已盯上你们家珍贵名画的人。
上述所说的这些现实生活中的例子在软件世界里也有相似的实例,不过现在重要的不是如何防范每一个威胁,而是首先你要建立这样的思维方式。如果你的朋友求助于你评估他房屋的安全性,你会伸出援手,但你可能会对自己分析的完整性缺乏信心;如果别人要求你去保障一栋办公建筑的安全,你可能也会头疼,如果要你保障军事设施或监狱的安全就更难了。在这些情况下,只凭直觉是不够的,需要使用相应的工具来解决问题。本书就为读者提供了这样的工具,利用结构化、高效的方法来思考威胁建模技术。
本书讲述了什么是威胁建模,个人、团队、组织机构为什么需要进行威胁建模。这其中的原因包括:威胁建模可以在早期及时发现安全问题,提高对安全需求的理解,以及设计和交付更好的产品。这里通过五个部分来对本书内容进行概要介绍,包括威胁建模定义及其重要意义,哪些读者群适合阅读本书,本书为你提供什么,如何使用本书以及威胁建模技术的最新进展。
什么是威胁建模
日常生活中,大家对威胁建模并不陌生。比如,出于无奈在机场排队时、偷偷溜出家门或去酒吧时都会对威胁进行建模:在机场,即使你没有打算真那么做,但你可能会偷闲思考如何偷偷摸摸带一些东西混过安检;偷偷溜出去的时候,你会担心有人注视着你的行动;当你在高速路上超速时,你可能在建立隐式的威胁模型,其中主要威胁就是警察,你会想他们就潜伏在广告牌后面或天桥下面。另外,公路上的妨碍物(比如穿过马路的鹿或者雨水)都可能出现在你的威胁模型中。
在威胁建模时,通常你会用到两类模型。一类是你所构建的软件或系统模型,一种是威胁模型(可能出错的地方)。你所构建的软件可能是网站、可下载的程序或应用,或者是可以在硬件中传递和交付的软件包,也可能是分布式计算机系统或可能成为“物联网”一部分的“物”。威胁建模是为了看到整片森林,而不是简单的几棵树木。好的模型可以帮助人解决几类或几组攻击,从而构建更安全的产品。
英语中,“threat”一词有很多意思。可以用来形容一个人,比如“奥萨马·本·拉登(Osama bin Laden)对美国来说是个威胁”,也可以形容多个人,如“内部威胁”;另外,还可用来形容一个事件,比如“本周末将面临暴风袭击的威胁”,也可以用来形容缺陷或者受攻击的可能性,比如“你如何应对针对信息保密的威胁?”此外,“威胁”还可以形容病毒和恶意软件,如“这一威胁有三种传播方式”,也可用来形容行为,如“存在操作错误的威胁”。
同样,“威胁建模”也有很多含义。“威胁模型”这个词可用于很多不尽相同有时甚至互不兼容的方面。其中包括:
作为动词,例如,“你对威胁建模了吗?”这句话的意思是说,对于你所构建的软件或系统,你是否仔细检查分析处理过,以查看软件系统哪里会出现问题?
作为名词,可表达使用的是什么威胁模型。比如,“我们的威胁模型是拥有机器的人”或说“我们的威胁模型是个专业而坚定的远程攻击者”。
可以表达如何构建一组理想化的攻击者。
可以表达威胁分类,比如篡改威胁。
毫无疑问,威胁建模本身有很多含义。所有这些含义在不同语境下都是有用的,而且都是正确的,所以最好不要浪费时间争论它的含义。争论其具体的定义是毫无意义的,唯一的方法就是抛开其定义。本书涵盖威胁建模各方面的技术,涉及大量可操作的具体技术,以帮助设计或者构建更安全的软件。本书还将探讨如何解决以下现实问题:一些技术要比其他的技术更有效,并且一些技术对有特定技术或经验的人使用更有效。
威胁建模是防御的关键。没有威胁建模,就会跟打鼹鼠游戏一样,永无完结。
总而言之,威胁建模就是利用抽象的概念来思考风险。
威胁建模的原因
在当今快速发展的世界里,趋势是精简开发活动,而威胁建模有着重要的存在价值,包括早期发现安全缺陷,理解安全需求,设计和交付更安全的产品等。
早期发现安全缺陷
想象你在建造一座房子,对安全结果的影响你越早决定越重要。由木制墙及大量落地窗构建的房子会比砖石及少量窗户的房子的潜在危险更大,因此要根据房子建在哪里等因素选择一个合理的方案。如果在决定之后再更改,成本通常会很高。当然,作为补救,你可以在窗子上加防盗护栏,但是,若能最初就有一个更合理的设计不是更好吗?这种权衡也可以用于技术当中。威胁建模可以帮你发现设计上的问题,甚至在你一行代码都没写的时候即可发现问题,而此时也是发现这类问题的最佳时机。
理解安全需求
好的威胁模型能帮助你回答“那的确是实际的安全需求吗?”举例来说,系统是否需要保护设备免受他人非法拥有?苹果公司在iPhone手机产品中给出了肯定回答,这显然不同于传统的个人电脑领域。当你发现威胁以及如何处理威胁时,你要明确需求。有了更清晰的需求,你就可以专注于处理相应的安全特性和性能。
需求、威胁与防御之间是相互作用的。在威胁建模时,会发现一些威胁不会影响你的业务,这样的威胁可能不值得处理。或者需求可能不完整,威胁处理过程复杂或者处理代价高,这时你就需要做出权衡,是在目前仅解决部分威胁,或者接受(沟通)你无法解决所有威胁的现实。
设计和交付更安全的产品
在构建产品时尽早考虑安全需求和安全设计,能大幅减少重新设计、重构系统,以及经常出现安全漏洞的可能性,这样你就可以从容地交付更安全的产品,最终构建更完善、更快速、更经济、更安全的产品,把更多的精力投入到用户需求的特色功能开发中。
解决其他技术无法解决的问题
威胁建模会发现其他工具无法发现的一系列问题,可能是遗漏错误问题,如远程连接验证错误,而代码分析工具无法发现该类问题。其他问题可能是你在系统设计中所独有的。一般地,开发者在构建新软件时,相应地会引入新的安全威胁。通过抽象的概念模型描述可能出现的错误,可以帮助你发现在其他系统里会出现的相同和相似的问题。
由此可得出结论:威胁建模不应该聚焦于其他人身安全工程和网络安全工程中可发现的问题(除非是在早期,为了避免以后的重复劳动)。举例来说,假如你正在开发一个调用数据库的产品,威胁建模会快速定位SQL注入攻击以及可能会被攻击的注入点。然而如果没有威胁建模,可能在未来遭受攻击时才发现该类威胁。因此,威胁建模应该聚焦其他技术无法发现的问题。
本书目标读者群
本书目标读者是专业技术人员,如软件工程师和系统管理员,以及系统分析师、架构师等,本书也有很多可供信息安全专家阅读的内容。本书不同章节针对的读者有所不同,总体来说,前面一些章节适合大多数读者阅读(或者说除了信息安全领域之外的其他专业领域人员),本书后面章节内容则更多的是面向安全专家。
并非只有信息安全专家、专业人士或爱好者才能阅读此书。本书希望你能通过阅读了解到现实中很多人的兴趣和欲望是跟你不同的。比如,他们可能想要从你那里得到钱财,或者他们有别的目标,比如他们拿你做牺牲品夸大自己或是用你的电脑攻击别人。
本书语言通俗易懂,适合任何会编程或设计程序的人,只是有些时候为了表达更加准确或更加清晰而使用一些术语,本书后面还附有术语表。
本书为你提供什么
通过阅读本书,你能获得丰富的威胁建模技术领域相关知识。你可以将其应用在你的项目中,开发与部署更安全的软件。此外,你将学到如何明确、可度量、合理地权衡安全措施,学到一整套工具以及如何应用。同时,你可能会发现发布的软件中一些看起来很棒、有很好的创意,但实际上却暗藏危机。另外,你将学到阻止你有效威胁建模的原因,以及如何避免这些问题。
通过阅读本书,你将学习威胁建模的输出结果——通常叫做“漏洞”(bug)。业界存有异议:普遍将代码中的问题归为漏洞(bug),将设计中的问题归为缺陷(flaw)。本书并不对其进行详细讨论,因为本书的主要目的是应用威胁建模解决问题,上述争议对本书讨论的内容无益。
不同读者获益不同
本书旨在为不同的技术人员提供有益的帮助,包括从事软件开发人员,以及为满足业务运营或商业目标要求而从事软件安全的技术人员。
为方便起见,本书假设开发人员和运维人员之间有明确的区分。这种区分可以更好理解各自的能力、选择和责任。举例来说,对开发人员来说,改变审计记录(log)或实施一个不同的身份验证系统是“容易”的,而这对运维人员来说就不是一件容易的事情。同样,对运维人员来说,维护日志记录完整、保护电脑安全是“容易”的。如本书中所写,业界流行一种“敏捷运维”(devops)模型。因此,针对开发人员和运维人员的课程会有些调整。同样为了方便起见,本书还假定安全专家与开发人员、运维人员的角色互不交叉。
显然,这就意味着,本书中同样的内容可能给不同人群带来不同的课程。以下具体介绍本书可为每一类读者提供的价值。
软件开发及软件测试人员
软件开发人员(日常工作主要是软件开发)包括软件工程师、质量保障及项目管理人员。如果你是这类人员,那么本书将帮助你在构建软件过程的设计初期发现并解决问题,帮助你交付满足客户需求的更加安全的软件。你将学到简单、有效且有趣的威胁建模方法,以及应用该方法从另一个角度构建软件模型和发现威胁。你将学到如何根据软件开发过程中存在的漏洞发现威胁,如何利用威胁使你的业务需求变得更加清晰。你将学到认证技术、密码学及可用性知识,在这个过程中你将发现攻击和防御之间的对抗有着悠久的历史,你能了解到本书推荐的威胁建模方法是如何发展的。你还将学到如何将威胁建模方法应用到软件开发过程中。
亚当 · 斯塔克(Adam Shostack),微软资深安全技术专家,微软可信计算项目团队核心管理人员,拥有数十年操作系统管理和产品开发从业经验,工作范围涉及安全开发过程、应用安全、攻击建模等安全领域。除了从事安全开发工作,他还从事针对微软公司员工、合作伙伴及客户的威胁建模培训工作。在加入微软之前,他曾在多家创业企业担任信息安全与隐私执行官,曾协助建立通用漏洞与披露信息库(CVE)、隐私增强技术研讨论坛以及国际金融加密技术协会。此外,他著有多部书籍,也是位高产的博客主和公共演讲者,曾与Andrew Stewart合作出版《The New School of Information Security》。
译者序:威胁建模——网络安全的“银弹”
前言
鸣谢
第一部分 入门指南
第1章 潜心开始威胁建模 3
1.1 学习威胁建模 4
1.1.1 你正在构建什么 4
1.1.2 哪些地方可能会出错 6
1.1.3 解决每个威胁 9
1.1.4 检查你的工作 17
1.2 独立威胁建模 19
1.3 潜心开始威胁建模的检查列表 19
1.4 小结 20
第2章 威胁建模策略 21
2.1 “你的威胁模型是什么样?” 21
2.2 集体研讨 22
2.2.1 集体研讨的变种方法 23
2.2.2 文献检索 24
2.2.3 集体研讨方法的观点 25
2.3 系统的威胁建模方法 25
2.3.1 关注资产 27
2.3.2 关注攻击者 29
2.3.3 关注软件 30
2.4 软件模型 31
2.4.1 图表类型 32
2.4.2 数据流图 32
2.4.3 信任边界 36
2.4.4 图表中包含的内容 37
2.4.5 复杂图 38
2.4.6 图的标签 38
2.4.7 图中的颜色 39
2.4.8 入口点 39
2.4.9 表验证 39
2.5 小结 41
第二部分 发现威胁
第3章 STRIDE方法 45
3.1 理解STRIDE方法及其为何有用 45
3.2 假冒威胁 47
3.2.1 在同一台机器上假冒一个进程或文件 48
3.2.2 假冒一台机器 48
3.2.3 人员假冒 48
3.3 篡改威胁 49
3.3.1 篡改文件 49
3.3.2 篡改内存 49
3.3.3 篡改网络 50
3.4 否认威胁 50
3.4.1 攻击日志 50
3.4.2 否认一种行为 51
3.5 信息泄露威胁 51
3.5.1 进程信息泄露 52
3.5.2 数据存储信息泄露 52
3.5.3 数据流中的信息泄露 52
3.6 拒绝服务威胁 53
3.7 权限提升威胁 53
3.7.1 通过崩溃进程提升权限 53
3.7.2 通过授权失效提升权限 54
3.8 扩展示例:针对Acme-DB的STRIDE威胁 54
3.9 STRIDE变种 56
3.9.1 STRIDE-per-Element 56
3.9.2 STRIDE-per-Interaction 58
3.9.3 DESIST方法 61
3.10 准出条件 61
3.11 小结 62
第4章 攻击树 63
4.1 使用攻击树 63
4.1.1 利用攻击树寻找威胁 64
4.1.2 创建新的攻击树 64
4.2 展现一个攻击树 66
4.2.1 人类可识别的表现形式 66
4.2.2 结构化的表示法 70
4.3 攻击树示例 70
4.4 真实的攻击树 71
4.4.1 诈骗攻击树 71
4.4.2 选举操作评估威胁树 73
4.4.3 思维导图 73
4.5 有关攻击树的观点 75
4.6 小结 75
第5章 攻击库 76
5.1 攻击库属性 76
5.1.1 攻击库及检查列表 77
5.1.2 攻击库与文档检查 78
5.2 CAPEC 78
5.2.1 准出条件 80
5.2.2 有关CAPEC的观点 81
5.3 OWASP前十名 81
5.4 小结 82
第6章 隐私工具 83
6.1 Solove的隐私分类 84
6.2 互联网协议的隐私考虑 85
6.3 隐私影响评估 86
6.4 Nymity Slider和隐私棘轮 86
6.5 语境完整性 88
6.5.1 语境完整性启发式决策 88
6.5.2 扩大的语境完整性启发法 89
6.5.3 有关语境完整性的观点 89
6.6 LINDDUN助记符 90
6.7 小结 91
第三部分 管理和解决威胁
第7章 处理和管理威胁 95
7.1 开始威胁建模项目 95
7.1.1 何时开始威胁建模 95
7.1.2 从哪里开始和(计划)在哪结束 97
7.1.3 从哪里入手 97
7.2 深入分析减缓方法 99
7.2.1 减缓顺序 99
7.2.2 下棋 100
7.2.3 目标优选 100
7.2.4 逃避熊的袭击 100
7.3 利用表格和列表跟踪 101
7.3.1 追踪威胁 101
7.3.2 建立假设 103
7.3.3 外部安全注解 103
7.4 威胁建模的特定场景元素 105
7.4.1 客户/供应商信任边界 105
7.4.2 新技术 105
7.4.3 对API威胁建模 107
7.5 小结 108
第8章 防御策略及技术 109
8.1 减缓威胁的策略及技术 109
8.1.1 认证:减缓欺骗威胁 110
8.1.2 完整性:减缓篡改威胁 111
8.1.3 不可否认性:减缓否认威胁 113
8.1.4 机密性:减缓信息暴露威胁 115
8.1.5 可用性:减缓拒绝服务威胁 117
8.1.6 授权:减缓权限提升威胁 118
8.1.7 策略和技术陷阱 119
8.2 利用模式解决威胁 120
8.2.1 标准部署 120
8.2.2 解决CAPEC威胁 120
8.3 减缓隐私威胁 120
8.3.1 最小化 120
8.3.2 加密 121
8.3.3 遵从性和政策 123
8.4 小结 123
第9章 解决威胁时的权衡 125
9.1 风险管理的经典策略 125
9.1.1 回避风险 126
9.1.2 解决风险 126
9.1.3 接受风险 126
9.1.4 转移风险 126
9.1.5 忽略风险 127
9.2 为风险管理选择减缓措施 127
9.2.1 改变设计 127
9.2.2 应用标准减缓技术 130
9.2.3 设计定制的减缓措施 132
9.2.4 模糊编码不是减缓威胁措施 132
9.3 针对特定威胁的优先级方法 133
9.3.1 简单方法 133
9.3.2 利用错误栏威胁排序 134
9.3.3 成本估算方法 135
9.4 通过接受风险来减缓威胁 138
9.5 减缓策略中的军备竞赛 139
9.6 小结 139
第10章 验证威胁是否已解决 141
10.1 测试威胁减缓 142
10.1.1 测试过程完整性 142
10.1.2 如何测试减缓 142
10.1.3 渗透测试 143
10.2 检查你获取的代码 143
10.2.1 构建软件模型 144
10.2.2 利用软件模型 145
10.3 问答式威胁建模 145
10.3.1 模型/现实一致性 146
10.3.2 任务和过程的完成 146
10.3.3 漏洞检查 146
10.4 解决威胁的过程各方面 147
10.4.1 威胁建模授权测试;测试授权威胁建模 147
10.4.2 验证/转换 147
10.4.3 操作过程中记录假设 148
10.5 表格与列表 148
10.6 小结 150
第11章 威胁建模工具 151
11.1 通用工具 151
11.1.1 白板 151
11.1.2 办公套件 152
11.1.3 漏洞跟踪系统 152
11.2 开放源代码工具 153
11.2.1 TRIKE 153
11.2.2 SeaMonster 153
11.2.3 权限提升纸牌游戏 153
11.3 商业工具 154
11.3.1 Threat Modeler 155
11.3.2 Corporate Threat Modeller 155
11.3.3 SecurITree 155
11.3.4 Little-JIL 155
11.3.5 微软的SDL威胁建模工具 155
11.4 尚不存在的工具 158
11.5 小结 159
第四部分 科技和棘手
领域的威胁建模
第12章 需求手册 163
12.1 为何需要“手册” 163
12.2 需求、威胁、减缓威胁之间相互作用 164
12.3 商业需求 165
12.3.1 优于竞争 165
12.3.2 产业需求 165
12.3.3 场景驱动的需求 166
12.4 防御/检测/响应需求框架 166
12.4.1 防御 166
12.4.2 检测 168
12.4.3 响应 169
12.5 人员/过程/技术作为需求的框架 170
12.5.1 人员 170
12.5.2 过程 170
12.5.3 技术 170
12.6 开发需求与采购需求 171
12.7 合规性驱动的需求 171
12.7.1 云服务安全联盟 171
12.7.2 NISTPublication200 172
12.7.3 支付卡行业数据安全标准 173
12.8 隐私需求 173
12.8.1 公平信息处理条例 173
12.8.2 从设计着手保护隐私 174
12.8.3 身份识别七法则 174
12.8.4 微软开发隐私标准 175
12.9 STRIDE需求 175
12.9.1 认证 176
12.9.2 完整性 177
12.9.3 不可否认性 178
12.9.4 机密性 178
12.9.5 可用性 178
12.9.6 授权 178
12.10 非需求 179
12.10.1 操作非需求 180
12.10.2 警告和提示 180
12.10.3 微软的“十个不变法则” 180
12.11 小结 181
第13章 网络与云威胁 182
13.1 网络威胁 182
13.1.1 网站威胁 182
13.1.2 网络浏览器和插件威胁 183
13.2 云租户威胁 184
13.2.1 内部威胁 184
13.2.2 合租威胁 185
13.2.3 合规性威胁 185
13.2.4 法律威胁 185
13.2.5 电子取证响应威胁 186
13.2.6 各种各样的威胁 186
13.3 云供应者威胁 186
13.3.1 直接来自租户的威胁 186
13.3.2 租户行为导致的威胁 187
13.4 移动威胁 187
13.5 小结 188
第14章 账户与身份识别 189
14.1 账户生命周期 190
14.1.1 创建账户 190
14.1.2 账户维护 192
14.1.3 账户终止 192
14.1.4 账户生命周期检查列表 193
14.2 认证 193
14.2.1 登录 194
14.2.2 登录失败 195
14.2.3 对于“你所拥有的”威胁 197
14.2.4 对“你是谁”的威胁 197
14.2.5 对“你所知道的”威胁 199
14.2.6 认证检查列表 202
14.3 账户恢复 202
14.3.1 时间和账户恢复 203
14.3.2 账户恢复邮件 204
14.3.3 基于知识的认证 204
14.3.4 社会认证 207
14.3.5 账户恢复的攻击者驱动分析 208
14.3.6 多渠道认证 209
14.3.7 账户恢复检查列表 209
14.4 姓名、ID和SSN 210
14.4.1 姓名 210
14.4.2 身份证明文件 212
14.4.3 社保号及其他国家身份识别号 213
14.4.4 身份盗用 215
14.4.5 姓名、ID及SSN检查列表 215
14.5 小结 216
第15章 人类因素与可用性 217
15.1 人的模型 218
15.1.1 应用人的行为模型 218
15.1.2 人的模型认知科学 220
15.1.3 人的启发式模型 223
15.2 软件情景模型 225
15.2.1 对软件进行建模 225
15.2.2 软件模型的图表 227
15.2.3 对电子社会工程攻击的建模 229
15.3 威胁引出技术 229
15.3.1 集体研讨 230
15.3.2 威胁建模的仪式方法 230
15.3.3 仪式分析启发式 230
15.3.4 将可用性融于四步框架 233
15.4 解决人类因素的工具和技术 233
15.4.1 抑制人类因素作用的谬见 233
15.4.2 良好的设计决策模型 234
15.4.3 良好学习环境的设计模型 236
15.5 用户界面工具和技术 237
15.5.1 配置 237
15.5.2 显式警示 238
15.5.3 吸引注意力的模型 239
15.6 测试人类因素 240
15.6.1 良好和恶劣的情景 240
15.6.2 生态有效性 241
15.7 有关可用性与仪式的观点 242
15.8 小结 243
第16章 密码系统威胁 244
16.1 密码原语 245
16.1.1 基本原语 245
16.1.2 隐私原语 248
16.1.3 现代加密原语 248
16.2 典型威胁角色 250
16.3 针对密码系统的攻击 251
16.4 用密码创建 253
16.4.1 做决定 253
16.4.2 准备升级 254
16.4.3 密钥管理 254
16.4.4 解密之前验证 255
16.5 关于密码需要记住的事情 255
16.5.1 使用专业人士设计的密码系统 255
16.5.2 用专业人士创建或测试的密码代码 255
16.5.3 密码不是安全魔尘 256
16.5.4 假设都会公开 256
16.5.5 你仍需要管理密钥 256
16.6 加密系统:Kerckhoffs及其原则 256
16.7 小结 257
第五部分 更上一层楼
第17章 将威胁建模带到你的组织机构中 261
17.1 如何引入威胁建模 262
17.2 谁做什么 264
17.3 在开发生命周期中的威胁建模 270
17.4 克服对威胁建模的反对声音 279
17.5 小结 281
第18章 试验方法 283
18.1 查看缝隙 283
18.2 操作威胁模型 285
18.3 “宽街”分类法 288
18.4 博弈机器学习 293
18.5 对一家企业进行威胁建模 293
18.6 针对威胁建模方法的威胁 294
18.7 如何实验 297
18.8 小结 298
第19章 成功的设计 299
19.1 理解流程 299
19.2 了解参与者 303
19.3 边界对象 304
19.4 “最好”是“好”的敌人 305
19.5 展望未来 306
19.6 小结 308
附录A 有用的工具 309
附录B 威胁树 315
附录C 攻击者列表 349
附录D 权限提升纸牌游戏 365
附录E 案例研究 372
术语表 388