威胁建模:设计和交付更安全的软件(txt+pdf+epub+mobi电子书下载)


发布时间:2020-10-09 07:56:02

点击下载

作者:(美)亚当·斯塔克(Adam Shostack)

出版社:机械工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

威胁建模:设计和交付更安全的软件

威胁建模:设计和交付更安全的软件试读:

前言

一切模型都是错误的,不过有些是有用的。——George Box(20世纪著名统计学家)

在构建软件系统时,人们会遇到很多可以预见的安全威胁,对此,本书描述了一些有用的威胁模型,可以用于消除或减轻这些潜在威胁。

威胁建模,名字本身听起来非常精妙,但其实指的是我们本能都会做的事情。比如,如果让你对自己的房子进行威胁建模,你会开始想房子里都有什么珍贵的人和物:你的家人、传家宝、照片,可能还包括明星签名海报;然后,你会想别人会用什么办法闯进家里,比如通过没有上锁的门,或者开着的窗子;另外,你还会想是什么样的人会来偷东西,比如邻居家调皮的孩子、职业小偷、瘾君子、跟踪狂或是早已盯上你们家珍贵名画的人。

上述所说的这些现实生活中的例子在软件世界里也有相似的实例,不过现在重要的不是如何防范每一个威胁,而是首先你要建立这样的思维方式。如果你的朋友求助于你评估他房屋的安全性,你会伸出援手,但你可能会对自己分析的完整性缺乏信心;如果别人要求你去保障一栋办公建筑的安全,你可能也会头疼,如果要你保障军事设施或监狱的安全就更难了。在这些情况下,只凭直觉是不够的,需要使用相应的工具来解决问题。本书就为读者提供了这样的工具,利用结构化、高效的方法来思考威胁建模技术。

本书讲述了什么是威胁建模,个人、团队、组织机构为什么需要进行威胁建模。这其中的原因包括:威胁建模可以在早期及时发现安全问题,提高对安全需求的理解,以及设计和交付更好的产品。这里通过五个部分来对本书内容进行概要介绍,包括威胁建模定义及其重要意义,哪些读者群适合阅读本书,本书为你提供什么,如何使用本书以及威胁建模技术的最新进展。

什么是威胁建模

日常生活中,大家对威胁建模并不陌生。比如,出于无奈在机场排队时、偷偷溜出家门或去酒吧时都会对威胁进行建模:在机场,即使你没有打算真那么做,但你可能会偷闲思考如何偷偷摸摸带一些东西混过安检;偷偷溜出去的时候,你会担心有人注视着你的行动;当你在高速路上超速时,你可能在建立隐式的威胁模型,其中主要威胁就是警察,你会想他们就潜伏在广告牌后面或天桥下面。另外,公路上的妨碍物(比如穿过马路的鹿或者雨水)都可能出现在你的威胁模型中。

在威胁建模时,通常你会用到两类模型。一类是你所构建的软件或系统模型,一种是威胁模型(可能出错的地方)。你所构建的软件可能是网站、可下载的程序或应用,或者是可以在硬件中传递和交付的软件包,也可能是分布式计算机系统或可能成为“物联网”一部分的“物”。威胁建模是为了看到整片森林,而不是简单的几棵树木。好的模型可以帮助人解决几类或几组攻击,从而构建更安全的产品。

英语中,“threat”一词有很多意思。可以用来形容一个人,比如“奥萨马·本·拉登(Osama bin Laden)对美国来说是个威胁”,也可以形容多个人,如“内部威胁”;另外,还可用来形容一个事件,比如“本周末将面临暴风袭击的威胁”,也可以用来形容缺陷或者受攻击的可能性,比如“你如何应对针对信息保密的威胁?”此外,“威胁”还可以形容病毒和恶意软件,如“这一威胁有三种传播方式”,也可用来形容行为,如“存在操作错误的威胁”。

同样,“威胁建模”也有很多含义。“威胁模型”这个词可用于很多不尽相同有时甚至互不兼容的方面。其中包括:

·作为动词,例如,“你对威胁建模了吗?”这句话的意思是说,对于你所构建的软件或系统,你是否仔细检查分析处理过,以查看软件系统哪里会出现问题?

·作为名词,可表达使用的是什么威胁模型。比如,“我们的威胁模型是拥有机器的人”或说“我们的威胁模型是个专业而坚定的远程攻击者”。

·可以表达如何构建一组理想化的攻击者。

·可以表达威胁分类,比如篡改威胁。

毫无疑问,威胁建模本身有很多含义。所有这些含义在不同语境下都是有用的,而且都是正确的,所以最好不要浪费时间争论它的含义。争论其具体的定义是毫无意义的,唯一的方法就是抛开其定义。本书涵盖威胁建模各方面的技术,涉及大量可操作的具体技术,以帮助设计或者构建更安全的软件。本书还将探讨如何解决以下现实问题:一些技术要比其他的技术更有效,并且一些技术对有特定技术或经验的人使用更有效。

威胁建模是防御的关键。没有威胁建模,就会跟打鼹鼠游戏一样,永无完结。

总而言之,威胁建模就是利用抽象的概念来思考风险。

威胁建模的原因

在当今快速发展的世界里,趋势是精简开发活动,而威胁建模有着重要的存在价值,包括早期发现安全缺陷,理解安全需求,设计和交付更安全的产品等。

早期发现安全缺陷

想象你在建造一座房子,对安全结果的影响你越早决定越重要。由木制墙及大量落地窗构建的房子会比砖石及少量窗户的房子的潜在危险更大,因此要根据房子建在哪里等因素选择一个合理的方案。如果在决定之后再更改,成本通常会很高。当然,作为补救,你可以在窗子上加防盗护栏,但是,若能最初就有一个更合理的设计不是更好吗?这种权衡也可以用于技术当中。威胁建模可以帮你发现设计上的问题,甚至在你一行代码都没写的时候即可发现问题,而此时也是发现这类问题的最佳时机。

理解安全需求

好的威胁模型能帮助你回答“那的确是实际的安全需求吗?”举例来说,系统是否需要保护设备免受他人非法拥有?苹果公司在iPhone手机产品中给出了肯定回答,这显然不同于传统的个人电脑领域。当你发现威胁以及如何处理威胁时,你要明确需求。有了更清晰的需求,你就可以专注于处理相应的安全特性和性能。

需求、威胁与防御之间是相互作用的。在威胁建模时,会发现一些威胁不会影响你的业务,这样的威胁可能不值得处理。或者需求可能不完整,威胁处理过程复杂或者处理代价高,这时你就需要做出权衡,是在目前仅解决部分威胁,或者接受(沟通)你无法解决所有威胁的现实。

设计和交付更安全的产品

在构建产品时尽早考虑安全需求和安全设计,能大幅减少重新设计、重构系统,以及经常出现安全漏洞的可能性,这样你就可以从容地交付更安全的产品,最终构建更完善、更快速、更经济、更安全的产品,把更多的精力投入到用户需求的特色功能开发中。

解决其他技术无法解决的问题

威胁建模会发现其他工具无法发现的一系列问题,可能是遗漏错误问题,如远程连接验证错误,而代码分析工具无法发现该类问题。其他问题可能是你在系统设计中所独有的。一般地,开发者在构建新软件时,相应地会引入新的安全威胁。通过抽象的概念模型描述可能出现的错误,可以帮助你发现在其他系统里会出现的相同和相似的问题。

由此可得出结论:威胁建模不应该聚焦于其他人身安全工程和网络安全工程中可发现的问题(除非是在早期,为了避免以后的重复劳动)。举例来说,假如你正在开发一个调用数据库的产品,威胁建模会快速定位SQL注入攻击以及可能会被攻击的注入点。然而如果没有威胁建模,可能在未来遭受攻击时才发现该类威胁。因此,威胁建模应该聚焦其他技术无法发现的问题。

本书目标读者群

本书目标读者是专业技术人员,如软件工程师和系统管理员,以及系统分析师、架构师等,本书也有很多可供信息安全专家阅读的内容。本书不同章节针对的读者有所不同,总体来说,前面一些章节适合大多数读者阅读(或者说除了信息安全领域之外的其他专业领域人员),本书后面章节内容则更多的是面向安全专家。

并非只有信息安全专家、专业人士或爱好者才能阅读此书。本书希望你能通过阅读了解到现实中很多人的兴趣和欲望是跟你不同的。比如,他们可能想要从你那里得到钱财,或者他们有别的目标,比如他们拿你做牺牲品夸大自己或是用你的电脑攻击别人。

本书语言通俗易懂,适合任何会编程或设计程序的人,只是有些时候为了表达更加准确或更加清晰而使用一些术语,本书后面还附有术语表。

本书为你提供什么

通过阅读本书,你能获得丰富的威胁建模技术领域相关知识。你可以将其应用在你的项目中,开发与部署更安全的软件。此外,你将学到如何明确、可度量、合理地权衡安全措施,学到一整套工具以及如何应用。同时,你可能会发现发布的软件中一些看起来很棒、有很好的创意,但实际上却暗藏危机。另外,你将学到阻止你有效威胁建模的原因,以及如何避免这些问题。

通过阅读本书,你将学习威胁建模的输出结果——通常叫做“漏洞”(bug)。业界存有异议:普遍将代码中的问题归为漏洞(bug),将设计中的问题归为缺陷(flaw)。本书并不对其进行详细讨论,因为本书的主要目的是应用威胁建模解决问题,上述争议对本书讨论的内容无益。

不同读者获益不同

本书旨在为不同的技术人员提供有益的帮助,包括从事软件开发人员,以及为满足业务运营或商业目标要求而从事软件安全的技术人员。

为方便起见,本书假设开发人员和运维人员之间有明确的区分。这种区分可以更好理解各自的能力、选择和责任。举例来说,对开发人员来说,改变审计记录(log)或实施一个不同的身份验证系统是“容易”的,而这对运维人员来说就不是一件容易的事情。同样,对运维人员来说,维护日志记录完整、保护电脑安全是“容易”的。如本书中所写,业界流行一种“敏捷运维”(devops)模型。因此,针对开发人员和运维人员的课程会有些调整。同样为了方便起见,本书还假定安全专家与开发人员、运维人员的角色互不交叉。

显然,这就意味着,本书中同样的内容可能给不同人群带来不同的课程。以下具体介绍本书可为每一类读者提供的价值。

软件开发及软件测试人员

软件开发人员(日常工作主要是软件开发)包括软件工程师、质量保障及项目管理人员。如果你是这类人员,那么本书将帮助你在构建软件过程的设计初期发现并解决问题,帮助你交付满足客户需求的更加安全的软件。你将学到简单、有效且有趣的威胁建模方法,以及应用该方法从另一个角度构建软件模型和发现威胁。你将学到如何根据软件开发过程中存在的漏洞发现威胁,如何利用威胁使你的业务需求变得更加清晰。你将学到认证技术、密码学及可用性知识,在这个过程中你将发现攻击和防御之间的对抗有着悠久的历史,你能了解到本书推荐的威胁建模方法是如何发展的。你还将学到如何将威胁建模方法应用到软件开发过程中。

系统架构、运维和管理人员

此类人员的日常工作是集成各个软件组件,搭建有效的业务系统并维持其正常运行,通过这本书将学到在系统设计、软件组件选择、准备部署的过程中如何发现和解决威胁。本书可帮助交付满足商业和客户需求的更加安全的系统。你将学到简单、有效而有趣的威胁建模方法,以及应用该方法从另一个角度描述正在构建或者已经构建的系统。通过本书将学到如何发现系统中存在的安全和隐私威胁,如何应用该方法在操作流程中处理此类威胁,如何对你所面临的威胁权衡选择最优的安全措施,以及如何确保彻底解决这些威胁。通过本书将学到针对不同技术领域,如网络和云系统的威胁,以及针对账户的威胁,了解这些威胁对系统运维是十分重要的。书中还将涉及可用性问题,该内容或许可以让你改变你所在组织机构或者客户对安全的态度。你将学到加密的相关知识,并可以用其来保护系统。这些在书中都会详细介绍。

安全专业人员

如果你从事安全工作,本书主要为你提供两方面内容:首先,威胁建模的结构化方法可大大提高你的工作效率,你将学到为何很多威胁建模过程中最显而易见的部分,其实并没有你想象的那么明显和正确;其次,你会学到如何将安全引入软件开发、操作和发布流程中。

从我个人的经验来说,即使你是安全专业人员,这本书也会给你带来帮助,让你更好地威胁建模。当我在撰写案例研究的附录时,我发现我要查阅附录B及本书有关安全需求的章节,发现并不是只要考虑软件模型就能发现威胁。写给信息安全领域的同僚

坦诚地说,这本书不是关于如何设计抽象意义上完美的软件。由于大多数商业或者组织机构使用的软件存在威胁,这是一本实用的书。目前,统治着世界的软件均存在着威胁,我希望通过做出更好的权衡使得这些软件更加安全。这涉及很多方面,其中两个重要方面是:让各位同仁在其专长的技术领域内保持一致安全策略,以及易于使用威胁建模方法。

本书的观点源于我作为系统管理员部署安全技术以及汇总人们遇到的问题时的工作经历,我作为创业企业运营人员如何使安全产品更好满足市场需求的经历,以及我在微软公司威胁建模的工作责任。威胁建模是微软公司软件开发生命周期的一部分工作。在第三个经历中,我和微软公司及其合伙人、客户等几千人讨论我们提出的方法,这些人中包括新入职的开发人员、在安全领域有着几十年工作经验的人、首席安全官、微软公司可信计算团队咨询委员会成员等。我了解到,关于行得通有太多的观点,而对于行不通的观点则寥寥无几。本书旨在让安全领域的同仁相信,开发和运维的过程改进可以帮助我们交付更加安全的软件。一些安全专家可能对此观点持怀疑态度,那么他们应该着重看第二部分、第四部分和第五部分。

如何使用本书

读者应该从书的开头开始阅读。即便你已经知道如何威胁建模,从头开始阅读也是最佳方式,因为书的开头为本书勾勒出了一个整体框架,可帮助你更好地理解后面的内容。

四步框架

本书提出这样一个观点:威胁建模并不能一步完成,而分几步完成,其中每一步完成一个子目标,为了实现这些子目标你需要回答以下问题。

1.你在构建什么?

2.一旦开始构建,哪些可能出错?

3.对于出错的部分该如何处理?

4.你做的分析工作完整吗?

框架的每一步所用的方法都可视为乐高(Lego)积木。在搭积木时,你可以将一块积木与另外一块安装组合起来。在第1章中,你将看到利用数据流图模拟你正在构建的软件,利用STRIDE帮助你思考哪里出错以及如何处理,以及利用核查表帮助你检查是否已经做了完整的分析工作。第2章中,你将看到数据流图是最适当的思考方式。不同的数据流图就像不同的构建模块,可帮助你对构建的软件或系统进行建模。第3章将深入了解STRIDE(一种威胁模型)。在第4章中,你将学习如何使用攻击树替代STRIDE,抛除相似因素之外的所有因素。STRIDE和攻击树是两种不同的构建模块,可以帮助你在构建新的技术时发现出错的地方。

并不是每种方法都能和其他方法结合使用,比如,要让金属积木Erector和木制的Lincoln积木粘合需要强力胶水。将不同威胁建模方法结合使用就会出现一些令人困惑的建议。例如,思考恐怖分子会如何袭击你的资产,不一定会产生很多可操作的问题。而且,即便是连接那些容易契合的模块,做出来的效果可能非常好,也可能非常差。

因此,假设将其当成一个完整的框架,那么构建模块是什么呢?图I-1形象地展示了四步框架。这些步骤是:图I-1 四步框架

1.对你正在构建、部署或修改的软件系统进行建模。

2.利用本书第二部分的模型和方法发现威胁。

3.利用本书第三部分的方法解决威胁。

4.验证上述工作的完备性和有效性(同样在第三部分中)。

这个框架是与软件开发、操作部署相匹配的。实验证明这是一种结构化的威胁建模方法。不用替换整个框架即可更容易地实践。本书几乎所有内容都是经过精挑细选的,因为它们都是基于四步框架的。

本书大致按照这个框架组织章节:

第一部分“入门指南”介绍入门知识。书的开篇(尤其是第1章)是专门为没有什么安全专业知识的人设计的。之后的内容基于在这部分的知识(或者结合自己的经验)设计。在这部分中你将了解威胁建模,以及为新手推荐的方法。你也可以学到软件建模的不同方法,以及为何从这里开始好于其他选择,比如从“攻击者”和“资产”开始。

第二部分“发现威胁”介绍发现威胁方面的知识。这部分内容描述了许多用于发现威胁的技术和工具。这部分内容综述和分析了人们对信息技术进行威胁建模的不同方法,可以让你发现不同技术的利弊。本书已经将这些技术分组,让你既可以从头开始读到尾,也可以挑选特定内容进行阅读。

第三部分“管理和解决威胁”介绍管理和解决威胁方面的内容。这部分内容包括如何处理威胁、管理威胁和用于定位威胁的策略和方法,以及如何做出必要的风险权衡。另外还涉及验证你的威胁确实已经得到解决以及帮助你进行威胁建模的工具。

第四部分“科技和棘手领域的威胁建模”涉及在特定技术领域及其他相关领域威胁建模,在这些领域已经有很多威胁建模及分析实践。这一部分包括网络及云、账户和身份、密码学及尝试自己开展安全需求分析的“需求手册”。

第五部分“再上一层楼”介绍了提升威胁建模能力。这部分内容针对经验丰富的威胁建模人员、安全专家、流程设计师——他们需要考虑如何为特定的组织机构定制威胁建模流程。

附录包括可帮助你快速应用所学的相关信息。其中包括“威胁建模是什么”、“我们的资产是什么”等常见问题解答,以及能帮助你发现威胁的威胁树、攻击者及攻击者角色列表,还有第1章中提到的权限提升游戏的细节,最后是一组威胁建模的详细案例。附录后面附有术语表、参考文献等。

网址:本书的网站是www.threatmodelingbook.com,网站上包含书中提到的一些图表的PDF格式版本,以及勘误表。

本书不包括什么

如今,很多信息安全书籍希望教你如何入侵。他们的目的是告诉你该防范哪些攻击,假设如果你了解了这些攻击,你便可以开始构建你的防御系统了。不过,本书和市面上的大部分书籍不同,因为即便市面上有几百万这样的书,仍旧有很多脆弱的系统被构建和部署。另外,针对各类攻击有各种各样经过斟酌的防御方法。了解如何执行攻击或许是有用的,但更重要的是知道什么时候在哪里会有攻击,以及如何有效地防范攻击。这就是本书编写目的所在。

本书不针对某一特定技术、平台或应用程序编程接口(API)。平台及API影响可能会提供你能使用的安全特征或可以消除一些威胁,但与平台相关联的威胁和消除威胁措施会随着版本不同而改变。本书旨在成为你书架上有用的参考书,比任何技术发布周期都要长久。

当然,本书并不是造就威胁建模大师的灵丹妙药,而是帮助理解你需要知道的信息。所谓熟能生巧,在问题处理过程中不断实践和反馈,你终将成为大师。

威胁建模新课程

经验丰富的安全专家在工作过程中都已经开发了适合自己的威胁建模方法。如果在威胁建模方面你已经有多年的经验,本书将为你提供其他可用的方法。本书还可让你全面地了解一系列结构化的威胁建模方法,以及它们是如何相互关联的。最后,还有一些较深的课程内容值得你们关注。

不止一种威胁建模方法

如果你问一名程序员“哪种编程语言最合适一个新的项目?”你可能会得到很多需要澄清的问题,因为没有哪一种是理想的编程语言。当然,编程语言在处理特定类型任务时都有其优点和缺点。例如,用Perl语言编写文本处理代码比汇编语言(assembler)要容易。Python语言比汇编语言更容易阅读和维护。同样,也有或好或坏的方法来进行威胁建模,这很大程度上取决于当时的实际情况,比如参与人员和人员技能等。

所以,你可以把威胁建模看作编程。编程有很多语言、编程范式(比如敏捷模式或瀑布模式)、编程实践(结对编程或频繁部署),威胁建模也是如此。以前威胁建模的书主要涉及威胁建模方法。本书帮助你了解“不止一种实现方式”,不仅仅是Perl语言适用于威胁建模。

找到威胁的方法就是正确的方法

威胁建模正确的方法就是能够让项目组找到比其他技术更多“好的威胁”(“好的威胁”是可以激发必须去做的工作的威胁)。一个项目组如此,几千个项目组亦如此。而且适用于所有层面的资源,比如时间、专业知识、工具。正确的技术能让一个项目组发现和解决威胁(并且增强信心,正如他们已经在做的)。

很多人会告诉你他们知道“一种最正确的方法”(但这是在威胁建模以外的领域)。应避免这场争论,找到适合自己的方法才是最有效的。

威胁建模犹如版本控制

威胁建模有时被认为是一种专业技能,只有一些人才能做好,这一想法通常阻碍我们。因为,比起专业技能,威胁建模更像是版本控制。这当然不是在诋毁或者轻视威胁建模,而是所有专业的开发者在构建任何复杂度的软件时都需要某种形式的版本控制系统。希望威胁建模能成为如版本控制系统一样的基础组件。

你希望所有专业软件开发者都知道一两种版本控制系统的基本知识,同样,很多系统管理员会用版本控制系统来管理配置文件。很多组织机构只靠一个简单的版本控制方法来应付,从来没聘请专家。如果你在一家大型公司工作,就会知道有全职人员管理构造树(build tree),威胁建模和这个情况类似。通过学习本书,可以假设负责软件和运维的专业人员已经有一些基本的威胁建模经验。

威胁建模也像拉小提琴

当你刚开始学习拉小提琴时,你不会一开始就练习拉那些最美的小提琴曲,首先你需要练习音阶、一些简单的曲子,然后循序渐进到更复杂的音乐。

同样道理,当你开始学习威胁建模时,你得通过练习学习技巧,学习过程中你会遇到很多挑战或挫败感。你要知道,威胁建模是一种技能,你可以在很多方面应用,当然也就需要时间来培养能力了。熟能生巧,如果你想一夜之间就变成专家,那么你肯定会失望的。同样,若是你几年才进行一次威胁建模,那么你就会生疏,这时就需要时间来重新锻炼自己所需的能力。

技巧与技能

继续使用拉小提琴这个例子,大多数有才华的小提琴家不会只练习一首曲子,而是有一整套技能,是与自己领域相关的一系列知识。

当你开始威胁建模时,你需要锻炼技巧和技能——你可以着手一系列威胁范例,想象新的系统可能受到怎样的攻击。攻击列表或者攻击库可以部分代替专家所知的威胁的心理技能,了解相似产品的安全问题也可以帮助你培养威胁技能。长此以往,这些都能帮助你思考新的、不同的威胁。“像攻击者那样思考”是有害的

很多威胁建模书籍劝诫人们“像攻击者那样思考”。对大多数人来说,这就像把自己想象成专业厨师一样难。即使你在家里是做饭好手,但是要当餐厅的主厨会遇到更复杂问题,比如,一家有78个座位的餐厅,每个座位接待两轮客人的话,每天要买多少只鸡?因此,像攻击者那样思考无法帮助大部分人进行威胁建模。

更糟糕的是,结果可能是盲目想象攻击者会怎么想、怎么做,以致你得到了错误的威胁。而要发现威胁,你无须着重攻击者,不过,拟人化或许可以帮你找到解决它们的方法。

攻击、防御与需求之间的相互关系

威胁建模就是为了建立更加安全的软件。当你在使用软件模型及威胁模型来寻找潜在问题时,你会发现一些威胁很难或不可能解决,这时你需要调整需求。这种相互关系很少有人讨论,而这对有效的威胁建模很重要。

有时要防范管理员的问题,有时要考虑你的客户愿意承受什么。“9·11”事件发生后,美国政府多次严肃考虑在民航飞机上禁止带电脑(据报道,电池和大规模炸药在X光机上显示是一样的)。于是,购买昂贵机票的商务舱乘客开始反抗,他们可是让航空公司运转的“金主”。于是政府只好采取其他措施,本书将就这些措施的效力进行评判。

这种相互作用的结果导致一些威胁不能有效缓解。这对很多安全专家来说是痛苦的。(不过,如《黑衣人》中的台词:“生活本来就充满痛苦,殿下。不这么对您说的人一定是在推销什么。”)当你发现违背你的需求的威胁又不能缓解时,基本上可以调整你的需求了。有时,要么操作上缓解威胁,要么顺从使用该系统的人。

基于此,是时候开始潜心威胁建模了!鸣谢

首先,感谢微软公司及其他公司与我分享威胁建模经验的所有工程师,他们给我提出了很多有建设性的意见和反馈。感谢Eric Bidstrup和Steve Lipner的支持,我才有机会与大家有这么多开放、直接的对话。还记得我进微软的第一天,他们支持我可以“暂时沉湎于威胁建模问题”,只是没想到“暂时”会是这么长一段时间。近8年时间里有许多可交付的成果,如今,如果他们要问我“怎样才能获得更好的威胁模型”,这本书是我对这个问题最完整的答案。

还要感谢Ellen Cram Kowalczyk,她是一位伟大的管理者和导师,没有她的帮助,我无法完成这本书。在缺乏威胁建模资料方面,她给予了我很大的帮助,并且从最初的安全推广(security push)到推出SDL,她为我提供了很多威胁建模的历史资料。感谢Ellen和Steve Lipner给予我宝贵的帮助,让我获得使用微软文档的授权。“权限提升游戏”很大程度上要感谢Jacqueline Beauchere,正是因为她没有对“威胁黑桃”这个丑陋的原型失去信心,而且慷慨相助,才使其得以完善和普及。

若不是当初Chris Peterson给我机会为Windows团队构建威胁模型工具,SDL威胁建模工具今天不会存在。Ivan Medvedev、Patrick McCuller、Meng Li和Larry Osterman构建了该工具的最初版本。感谢Windows团队以及微软的工程师在工具测试阶段为我提供错误报告及改进建议。还有那些曾经提醒我们威胁建模的准确性是至关重要的人们,我对他们表示衷心感谢。如果没有这个工具,我在威胁建模领域的经历和见识都会大大缩水。

感谢微软的Larry Osterman、Douglas。MacIver、Eric Douglas、Michael Howard、Bob Fruth为本书贡献了自己的宝贵时间,分享他们在威胁建模方面的经验。多年来,Window Snyder的思维方式和视野从我工作之初就一直影响着我,这对我来说是无价的。当你知道自己做到了……嗯,本书也就基本完成使命了。

Rob Reeder是可用安全(usable security)领域的一位伟大的导师,正是基于我们多年的合作,才总结完成了第15章的内容。对于可用安全领域,我不仅要感谢Lorrie Cranor对我的大力帮助,还要感谢可用隐私与安全研讨会(Symposium on Usable Privacy and Security)给我的主题演讲机会,促使我思考如何设计可用的安全建议,这些思考贯穿全书。

感谢Andy Stiengrubel、Don Ankney和Russ McRee在威胁建模操作以及环境改变时如何转变策略(trade-off)方面给予的重要指导,这些内容体现在书中很多章节里。感谢Alec Yasinac、Harold Pardue和Jeff Landry百忙之中愿意抽时间与我分享他们在攻击树领域方面的经验,正是有了这些经验,书中第4章和第17章的内容才更加丰富。在攻击树方面,Joseph Lorenzo Hall也给予了宝贵帮助。Wendy Nather一直坚持资产和攻击者是威胁建模的重要因素,同样在如何解决威胁建模中资产和攻击者矛盾方面提供了很多有益的帮助。感谢Rob Sama从一个注册会计师(CPA)的视角检查了本书所列举的Acme财务案例,纠正了我的一些错误。感谢Dave Awksmith慷慨地允许我将其威胁扮演的角色纳入附录中。在本书前面一些章节中,Jason Nehrboss给了我很有益的反馈和意见,非常感谢他。

另外,我还要感谢Jacob Appelbaum、Crispin Cowan、Dana Epp(多年来,他在本书和工具上都给予我很多帮助)、Jeremi Gosney、Yoshi Kohno、David LeBlanc、Marsh Ray、Nick Mathewson、Tamara McBride、Russ McRee、Talhah Mir、David Mortman、Alec Muffet、Ben Rothke、Andrew Stewar以及Bryan Sullivan,他们在诸多方面提供了有益的反馈意见。

书中难免存在问题或错误,以上这些曾经帮助过我的人对此不负有责任。“我自己”(基于以上那么多人的帮助还这样说感觉有些奇怪)独自完成这部书,让我怀念曾经和Andrew Stewart合作完成著作《The New School of Information Security》的日子。尤其在有人把那本书的功劳完全归于我时,我非常想借此机会公开表达对他的怀念之情。

如果不是Bruce Schneier愿意为我介绍执行主编Carol Long,Carol愿意编辑整理这本书,此书也不会成为现在的样子。优秀的项目编辑Victoria Swider给我提了一些好的反馈意见及建议。在该项目即将结束时,Tom Dinse开始接手大量开放性任务,在时间紧迫的情况下,最终取得圆满结果。

最后,也是最重要的,感谢你,Terri,感谢你的爱、帮助和支持,此外,你还要忍受我经常说“快好了”。——Adam Shostack  第一部分入门指南

·第1章 潜心开始威胁建模

·第2章 威胁建模策略

本部分内容主要帮助入门读者了解威胁建模,读者无须具备威胁建模或安全方面知识即可无障碍地阅读。本部分内容着重讲述威胁建模所需的关键技能,为威胁建模入门者提供方法论。

第一部分利用玩具类比的方法介绍威胁建模方法。就像供孩子玩耍的模型有很多一样,威胁建模也有很多种方法。要组装飞机或者轮船,需要精确的模型零部件,这些部件精确度高,同时灵活性差,当然也有很多构建模块系统,比如Lincoln Logs、Erector Sets和Lego Blocks,这些组件的灵活性比较高,不过代价就是可能没有你组装飞机时所需的精确的螺旋桨模型。

威胁模型中,集中在攻击者、资产或软件的技术有很多,与Lincoln Logs、Erector Sets和Lego Blocks相似,每个都强大且灵活,也有优点和缺点,要将它们组装成好看的东西会比较棘手。

第一部分包括以下章节。

·第1章提供入门读者所需的一切,重点讨论4个问题:

·你在构建什么?

·哪里可能出错?

·出错的部分该怎么办?

·你做了充分的分析吗?

这些并非只适用于如何开始威胁建模,它们是四步框架的核心,也是本书的核心。

·第2章提供了威胁建模的诸多方法。其中很多是“显而易见”的方法,比如思考攻击者或者你想保护的资产。这些都将一一分析,并且找到它们或许不能如你所希望的那样好用的原因。这些也将与其他一些方法做对比,着重在软件方面。你最值得期待的便是软件专业人士对软件的了解,这也很合理,所以第2章最重要的部分就是软件模型。威胁建模时,软件模型是两个应该关注的模型之一。第1章潜心开始威胁建模

谁都可以学习威胁建模,更进一步说,每个人都应该学习威胁建模。威胁建模是利用模型来发现安全问题,这意味着通过提取大量细节对安全问题进行全面检查,而不是代码本身。之所以要构建模型,是因为模型能让你在没构建系统之前即可发现问题,以及在问题出现前提早发现问题。最后,威胁模型可以预见可能侵袭你的威胁。

首先,威胁建模是一门实用科学,本章系统地描述其实用性。尽管本书为你提供了很多有价值的定义、理论、观点、有效的方法和技术,但你还是希望能将这些用于实践。因此,本章内容主要从实践经验展开,未涉及大量的理论。

举一个例子,当你开始操作一个乐器,就要通过弹奏乐器培养能力和感觉。起初,可能听上去没那么好,有时还会令人沮丧,但是在练习的过程中,你会逐渐发现越来越轻松。慢慢地开始娴熟。同样,如果你按照书中第一部分到第三部分提出的如何威胁建模的简单四步法练习,你也会练就威胁建模能力。你可能听说过一个老段子:纽约街头音乐人被一个人拦住,问:“我怎么才能进入卡内基音乐厅表演?”回答当然是“练习、练习、再练习”。这过程中包括遵从、练习、培养对各个步骤的理解。长此以往,你就能理解威胁建模涉及的各种任务和技术是如何结合在一起的。

在本章中,你将找到设计中可能存在的安全缺陷,进而解决它们。你将学习如何通过针对带有后端数据库的简单的网络应用查找缺陷。你将了解哪里有可能会出错,如何解决,以及如何检查。在本章中,你将学会如何玩权限提升游戏,旨在帮助你开始威胁建模。最后,你将有机会实际动手构建自己的威胁模型,本章结尾将为你提供一组检查列表帮助你开始进行威胁建模。1.1 学习威胁建模

威胁建模重点是解决如下4个问题:

1.你正在构建什么?

2.哪些地方可能会出错?

3.发现错误时应该怎么解决?

4.是否做了完整的分析?

解决这些问题的开始和结束是所有技术人员所熟悉的:在白板上画图、管理漏洞。在这里,本书将介绍多种可以用于思考威胁的新技术。当你在解决问题的过程中遇到困难时,就回过头想想这4个问题。

本章内容旨在帮你解答这些问题。首先,以三层架构网络应用程序为例解答这些问题。之后,你该回顾一下这些步骤,尝试对自有的软件进行威胁建模,可以是你正在构建或部署的软件或者是你正考虑获取的软件。如果你不确定要对什么进行建模,可以使用本章中的一个样本系统或是在附录E中选择。

第二次读本章的时候,你需要有一副权限提升威胁建模游戏纸牌。本游戏使用纸牌形式,你可以在http://www.microsoft.com/security/sdl/adopt/eop.aspx这个网址免费下载。需要2~4个朋友或同事与你一起玩这个游戏。

首先从构建示意图开始,这是威胁建模涉及的4个主要动作之一,在下一部分内容会涉及。其他3个动作分别是寻找威胁、解决威胁和检查工作。1.1.1 你正在构建什么

用示意图来回答这个问题是一种好方法。为软件做示意图也有很多种方法,可以先从在白板上画开始,画一画数据流是如何在系统中流动的。在这个例子中,处理对象是一个简单的网络应用程序,包含网络浏览器、Web服务器、业务逻辑和一个数据库(见图1-1)。图1-1 示意图

在这里,一些人会开始思考有什么问题。例如,你怎么知道网络浏览器由你所预期的人使用?如果有人修改数据库里的数据会怎样?从一个方框移动到另一个方框时不需要信息加密吗?你可能愿意花时间想一想这里可能出错的细节,因为这些问题会引领你问:“这是经过允许的吗?”如果你能多考虑一些“谁控制什么”,你就能构建出比现有更好的模型。这是针对整个互联网还是针对内部网络?数据库是在线上站点还是在网络提供者?

对于这个例子,首先假定你正在创建一个互联网站点,用的是虚拟Acme存储系统(在这里我用了具体的产品,但是我会弄错一些细节,某些人——当然不是你,会纠缠于这些,就不会关注威胁建模内容了,我们此后就称为Acme,假设按照我说的方式进行工作,多谢,你们懂的)。

用添加边界的方式表达谁控制着什么是改进示意图的简便方法。你可以很容易发现跨越那些边界的威胁可能是非常重要的,可能是识别威胁的最佳位置。这些边界称为信任边界,无论在什么地方由不同的人控制不同的事,你就该画上边界。以下列出一些不错的示例:

·账户(UNIX系统的用户名UID,Windows系统的安全识别符SIDS)

·网络接口

·不同的物理计算机

·虚拟计算机

·组织机构边界

·你可以拥有不同权限的几乎所有地方信任边界与攻击面

你可能会遇到的相近概念是攻击面。例如,船的外壳是经受鱼雷打击的攻击面。受到攻击时,船的侧面会比这艘船的船头攻击面要大。这只船会有内部“信任”界面,比如隔水舱、船长的保险箱。暴露很多接口的系统呈现的攻击面大于暴露很少API或其他接口的系统的攻击面。网络防火墙是有用的边界,因为它们可以减少外部攻击者的攻击面。然而,就像船长的保险箱,在防火墙以内还有信任边界。信任边界和攻击面是对同一事物的非常相似的概念。攻击面是一个信任界面,是攻击者可以发动袭击的方向。很多人认为这两者可互换。本书主要使用“信任边界”。

在你的示意图中,用边框来画信任边界(见表1-2),用标签(比如企业数据中心)放在边框处显示每个信任边界里有些什么。图1-2 在示意图基础上加入信任边界

随着示意图中的内容越来越多,越来越复杂,就会越容易错过某一部分,或者对数据流中的标签感到困惑。因此,给每个程序、数据流、数据存储标上序号会更有帮助,如图1-3。(因为每个信任边界有个与众不同的名字,所以这些就没必要标序号了。)图1-3 在示意图基础上加入序号和信任边界

至于示意图的形式,你可以选择适合你的程序的:可以是白板示意图和手机照片,可以是Visio、OmniGraffle或其他绘图程序。你应该想到威胁建模示意图是开发流程的一部分,因此需要将它们和其他一起保存在代码控制中。

有了示意图,你很自然会问,这是正确的吗?到目前为止,有个简单的答案:我们假设它是正确的。本章后面会提供一些小窍门和检查表,还有一部分内容关于更新示意图,不过,在这一阶段,你已经有了足够好的图表来开始识别威胁,这就是你买这本书的价值所在。所以我们开始出发吧。1.1.2 哪些地方可能会出错

有了示意图,你就可以开始寻找可能出错的地方。这很有趣,所以我将这转化到一个名为权限提升的游戏上。附录D中有更多有关游戏的内容,那里分析了每一张牌,第11章包含了该游戏的历史及设计理念。不过,现在通过一些简单的指示你就可以开始玩了。如果你还没开始,可以到http://www.microsoft.com/security/sdl/adopt/eop.aspx下载纸牌,彩色打印,裁剪成单张卡片,然后洗牌,分发给朋友一起玩。注意 一些人不适应在工作的时候玩游戏,还有一些人开始玩新游戏的时候可能会带着恐惧心理,尤其是看到很长、很复杂的游戏说明的时候。不过,权限提升游戏说明不多,可以试试。如何玩权限提升游戏

权限提升游戏旨在帮助你威胁建模。图1-4中显示一张纸牌,跟玩普通纸牌一样,纸牌的左上角会有数字,纸牌上半部还有威胁实例的文字介绍。只要根据提示玩即可。

1.洗牌(可选)。

2.首轮拿到3篡改牌的人先出(在这样的纸牌游戏中,一轮也可以称为“一把”或“一手”)。

3.每一轮这样玩:

A.从先出牌的人开始沿着顺时针方向出牌,每人出一张牌。

B.出牌时,说出是什么牌,并尝试决定它能否影响你们正在制作示意图的系统。如果能联系起来,写下来,得一分,然后下一个人继续。

C.每个人都出了一张牌后,牌最大的人赢得本轮,本轮赢者在下轮先出。

4.所有牌都出完,游戏结束,得到分数最高的人赢得整个游戏。

5.如果你们是在对正在构建的系统进行威胁建模,那么把你们发现的任何漏洞都归档。图1-4 一张权限提升游戏纸牌

有的人甚至占用睡眠时间学习这个内容,十分着迷。但不是所有人都这样,没关系。威胁建模不是非常复杂的科学,从事软件开发的人都能够学会。只不过不是所有人都愿意用睡眠时间学习。

对很多人来说,识别威胁听起来可能有点吓人,如果你是这样的,不要担心。本部分内容就是帮你慢慢了解威胁识别,记得享受其中的乐趣。一位评论家说:“玩权限提升游戏应该是很有趣的,不要贬低它,我们每周五都玩,很有趣,也很放松,同时还有商业价值。”

游戏之外,你可以通过思考可能出错的地方进一步威胁建模。比如,你怎么知道网络浏览器被你所预期的人使用?如果有人修改数据库里的数据会怎样?信息从一个方框移动到另一个时不用加密?你不必盯着表、托着下巴苦思这些问题,(我反正没有!)你可以用简单的有助于记忆的STRIDE来识别威胁,这在下一部分会具体介绍。使用便于记忆的STRIDE方法寻找威胁

STRIDE是个助记符,可以帮助查找不安全的地方。它是几个词或词组的首字母缩写,代表假冒(Spoofing)、篡改(Tampering)、否认(Repudiation)、信息暴露(Information Disclosure)、拒绝服务(Denial of Service)、权限提升(Elevation of Privilege)。

·假冒:假装成并非自己真实身份的人或物。

·篡改:修改你不应该修改的东西。包括有线网络(或者无线网络)的数据包、磁盘上的信息或者内存中的信息。

·否认:宣称自己没做什么事(不管你是否做了还是没做)。

·拒绝服务:旨在阻止系统提供正常服务的攻击,包括使系统崩溃、让它变得运行缓慢而且无法使用,或者占满内存。

·信息暴露:将信息暴露给没有授权查看这些内容的人。

·权限提升:指一个程序或者用户在技术上可以做其本来不能做的事情。

回忆一下之前提到的三种威胁范例:

·你怎么知道网络浏览器被你所预期的人使用了?

·如果有人修改数据库里的数据会怎样?

·信息从一个方框移动到另一个时不用加密?

这些都是假冒、篡改和信息暴露的例子。使用STRIDE可帮助你检查图表,选出威胁范例。再加上一些安全知识和适当的技术手段,你就能更快、更可靠地找到重要的威胁。如果你在开发软件时保证了威胁模型开发和威胁记录,将大大提升软件的安全性。

既然有了STRIDE工具,再查看一下你的图表,寻找更多威胁,这次运用这个助记符。列出遇到的威胁及图表中其会影响到的因素(总体来说,软件、数据流或是存储会受影响,而非信任边界)。以下显示每一类威胁的例子。

·假冒:有人会假装成其他用户,因此你需要有验证用户身份的方式;有人还会假装成你的网站,所以你必须使用加密套接字协议层(SSL)证书,而且保证所有页面使用单一的域名(帮助部分用户通过URL网址来确认自己是不是访问了正确的网站地址)。还有人可能在你的网站放置深层的链接,比如logout.html或placeorder.aspx。在采取相应措施前要检查Referrer引用字段。这并不是应对跨站请求伪造(Cross Site Request Forgery,CSRF)攻击的全部解决办法,只不过是一个开始。

·篡改:有人可能会篡改Acme后端的数据。有人可能会对数据中心之间的数据流数据进行篡改。程序员可能会未经测试即替换网络前端的执行代码,将它们上传到暂存区域。一个愤怒的程序员可能添加优惠码“PayBobMore”,将所有商品以八折优惠出售。

·否认:之前的那些操作到底操作了什么内容。有系统审计记录吗?正确的信息被有效地记录了吗?这些记录能防止篡改吗?

·信息暴露:如果Acme读取你的数据库会发生什么?任何人都能连接到数据库、读取或者写信息吗?

·拒绝服务:如果1000个客户同时点击一个网站会怎样?Acme出故障了会怎样?

·权限提升:可能网络前端是用户唯一应该访问的地方,是什么在强制执行呢?是什么阻止他们与业务逻辑服务器直接连接或者上传新代码?如果有防火墙,它是否配置正确?是什么控制着访问你的Acme的数据库,或者如果有Acme员工犯了错误,甚至想编辑你的文件呢?

以上提到的可能情况不是每个威胁入侵表现的完整列表。第3章中会介绍更多内容。不过,本节内容足以让你入门,基于图1-2所示的简单图表,主要关注你可能需要研究的内容。还记得前文提到的弹奏乐器的类比吧。如果你刚学弹钢琴的时候就学习拉威尔的《夜之加帕斯》(被认为是最难的钢琴曲之一),那你可就要抓狂了。识别威胁窍门

不论你是用权限提升游戏还是STRIDE,抑或是两者皆用来识别威胁,下面这些都要牢记在心,它们可以帮助你走对路,找出哪里出错了。

·从外部实体开始:如果你不知道从哪里开始入手,那么就从外部实体或是驱动活动的事件开始。当然,也有很多其他的有效途径:你可能从网络浏览器开始寻找假冒,以及篡改等。也可能从业务逻辑开始,可能该组件的主要开发人员也同在一个房间内。不管你选择从哪里开始,以及满足一定级别的组织机构。你也可以按照图表中的“STRIDE次序”(“STRIDE order”)进行。如果没有一定的组织机构,很难说你何时已经完成,不过,小心不要加入太多结构,否则会限制创造性。

·不要因为不是你目前要找的威胁而忽略任何一个威胁。你可能在查看别的项目类别时发现一些威胁,记下来再返回解决。比如,你可能会在寻找假冒威胁的时候想着信息暴露威胁:“会有人连接到我们的数据库吗”,如果是这样就太棒了。非常不错。出现一些冗余可能是比较乏味,但是可以避免遗漏。如果你发现自己在考虑“没有授权的人连接数据库读取信息”是假冒还是信息暴露,答案是谁关心啊?记录下来,继续下一项。STRIDE是引导你发现威胁的工具,不是让你给你所发现的威胁进行分类;不管怎么说,这是令人厌烦的分类问题。(意思是说,有很多安全问题都可以争论到底属于哪类。用严格的分类标准去比较、对比,就像给生命分类,有没有脊椎?有的话,那就是脊椎动物。)

·关注可能的威胁:在发现威胁过程中,你可能会遇到一些这样的威胁——某人可能在芯片厂植入了后门,或者有人可能雇用了我们的守卫人员插入了硬件按键记录器、窃取了你所有密码口令,这是真实存在的可能情况,但是相比使用漏洞攻击尚未安装补丁的漏洞,或者假冒使用人安装软件,上面情况是不太可能发生的。另外还有怎么解决威胁的问题,这会在下一部分中介绍。1.1.3 解决每个威胁

现在,你应该有一个数量可观的威胁列表,或者有多个威胁列表。威胁建模的下一步就是仔细检查列表,解决每一个威胁。对于每个威胁,有四种应对措施:缓解、清除、转移、接受。下面的列表中对这几种方法做了大致介绍,接着在后续的“哪里会出错”部分,你可以学到如何解决STRIDE列表中每个特定的威胁。在第8章和第9章中,会有解决这些威胁的策略和技术的更多细节。

·减缓威胁:采取措施让别人更难利用这个威胁。控制登入的时候需要提供密码可以减缓假冒威胁。添加复杂的或者有时间限制的密码控制,可以减小密码被猜到或者被盗后可用的概率。

·清除威胁:通常可以通过清除功能来实现。如果有个威胁,某人可能通过访问/admin/URL来访问网站的管理功能,你可以通过设密码或者其他身份认证技术来缓解,但是,这个威胁仍然存在。你可以利用/j8e8vg21euwq/这样的URL,使其增加被访问的难度,但是威胁依然存在。为了清除威胁,可以通过移除界面接口,仅通过命令行进行管理操作(不同的命令行登录方式也会存在威胁,远离HTTP使得威胁更易通过控制攻击面来减缓。两种威胁都可在完整的威胁模型中发现)。

·转移威胁:让别人或者别的东西来处理威胁。比如,你可以将认证威胁转移到操作系统或者从信任边界转移到防火墙。你也可以将威胁转移到客户,比如,可以通过要求他们点击很多难懂的对话框,之后才可以做他们想做的。这当然不是个很好的解决办法,但是有时人们知道能促成安全权衡。比如,他们可能知道他们只是连上了咖啡馆的无线网络。如果你认为这个人有安全意识,你应该帮助她做决定。第15章会介绍更多内容。

·接受威胁是解决威胁的最后选择。对大多数组织来说,在大多数时间内不值得用搜查进出大楼的每个员工来牺牲他们的尊严和工作满意度。(然而,钻矿和一些政府机构会选择不同的方法。)同样,阻止某人在主板插入后门的代价是很高的,因此在这些时候,你可能会选择接受威胁。而且,一旦你接受了,就不该再为之担心。有时,担心就表示你没有完全接受威胁,或者说接受威胁是不合适的。

表1-1列出的策略举例说明了解决威胁的方法。你的首选方法应该是缓解威胁。总体来说,缓解是最容易的,也是对客户来说最好的选择。(可能看上去接受威胁更容易,但久而久之你会发现缓解是更容易的。)缓解威胁是份辛苦活,不要认为这些例子就是全部。解决每个威胁经常会有其他有效方法,有时在选择解决威胁的方法上要做出权衡。解决假冒威胁

表1-1展示了假冒的目标、解决假冒的减缓策略以及如何实施这些缓解方法。表1-1 解决假冒威胁

·当你担心可能会有人被假冒时,保证每个人都有独特的用户名和验证方法,传统方法就是设置密码,虽然这种方式存在各种问题,但其很多优点也难以复制。密码相关内容详见第14章。

·当访问磁盘文件时,不要用open(file),而应该使用open(/path/to/file)。如果文件敏感,打开后,检查文件说明符中的安全因素(例如完全解析的名字、授权和所有者)。为了避免竞争,要检查文件说明符。如果文件是可执行文件则执行两次(applies doubly),虽然打开后检查可能会比较棘手,这可能帮助确保可执行权限不会被攻击者修改。无论如何,你几乎从来不会想要求执行如下命令:exec./file。

·当你担心联网时系统或者计算机会被假冒,你会想用DNSSEC、HTTPS/SSL、IPSec或是组合使用上述协议来保证你连接了安全正确的地方。解决篡改威胁

表1-2展示篡改的目标、解决篡改的缓解策略以及如何实施这些缓解方法。表1-2 解决篡改威胁

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载