第1章 潜心开始威胁建模
谁都可以学习威胁建模,更进一步说,每个人都应该学习威胁建模。威胁建模是利用模型来发现安全问题,这意味着通过提取大量细节对安全问题进行全面检查,而不是代码本身。之所以要构建模型,是因为模型能让你在没构建系统之前即可发现问题,以及在问题出现前提早发现问题。最后,威胁模型可以预见可能侵袭你的威胁。
首先,威胁建模是一门实用科学,本章系统地描述其实用性。尽管本书为你提供了很多有价值的定义、理论、观点、有效的方法和技术,但你还是希望能将这些用于实践。因此,本章内容主要从实践经验展开,未涉及大量的理论。
举一个例子,当你开始操作一个乐器,就要通过弹奏乐器培养能力和感觉。起初,可能听上去没那么好,有时还会令人沮丧,但是在练习的过程中,你会逐渐发现越来越轻松。慢慢地开始娴熟。同样,如果你按照书中第一部分到第三部分提出的如何威胁建模的简单四步法练习,你也会练就威胁建模能力。你可能听说过一个老段子:纽约街头音乐人被一个人拦住,问:“我怎么才能进入卡内基音乐厅表演回答当然是“练习、练习、再练习”。这过程中包括遵从、练习、培养对各个步骤的理解。长此以往,你就能理解威胁建模涉及的各种任务和技术是如何结合在一起的。
在本章中,你将找到设计中可能存在的安全缺陷,进而解决它们。你将学习如何通过针对带有后端数据库的简单的 络应用查找缺陷。你将了解哪里有可能会出错,如何解决,以及如何检查。在本章中,你将学会如何玩权限提升游戏,旨在帮助你开始威胁建模。最后,你将有机会实际动手构建自己的威胁模型,本章结尾将为你提供一组检查列表帮助你开始进行威胁建模。
1.1 学习威胁建模
威胁建模重点是解决如下4个问题:
1.你正在构建什么br>2.哪些地方可能会出错br>3.发现错误时应该怎么解决br>4.是否做了完整的分析br>解决这些问题的开始和结束是所有技术人员所熟悉的:在白板上画图、管理漏洞。在这里,本书将介绍多种可以用于思考威胁的新技术。当你在解决问题的过程中遇到困难时,就回过头想想这4个问题。
本章内容旨在帮你解答这些问题。首先,以三层架构 络应用程序为例解答这些问题。之后,你该回顾一下这些步骤,尝试对自有的软件进行威胁建模,可以是你正在构建或部署的软件或者是你正考虑获取的软件。如果你不确定要对什么进行建模,可以使用本章中的一个样本系统或是在附录E中选择。
第二次读本章的时候,你需要有一副权限提升威胁建模游戏纸牌。需要2~4个朋友或同事与你一起玩这个游戏。
首先从构建示意图开始,这是威胁建模涉及的4个主要动作之一,在下一部分内容会涉及。其他3个动作分别是寻找威胁、解决威胁和检查工作。
1.1.1 你正在构建什么
用示意图来回答这个问题是一种好方法。为软件做示意图也有很多种方法,可以先从在白板上画开始,画一画数据流是如何在系统中流动的。在这个例子中,处理对象是一个简单的 络应用程序,包含 络浏览器、Web服务器、业务逻辑和一个数据库(见图1-1)。
有的人甚至占用睡眠时间学习这个内容,十分着迷。但不是所有人都这样,没关系。威胁建模不是非常复杂的科学,从事软件开发的人都能够学会。只不过不是所有人都愿意用睡眠时间
学习。
对很多人来说,识别威胁听起来可能有点吓人,如果你是这样的,不要担心。本部分内容就是帮你慢慢了解威胁识别,记得享受其中的乐趣。一位评论家说:“玩权限提升游戏应该是很有趣的,不要贬低它,我们每周五都玩,很有趣,也很放松,同时还有商业价值。”
游戏之外,你可以通过思考可能出错的地方进一步威胁建模。比如,你怎么知道 络浏览器被你所预期的人使用果有人修改数据库里的数据会怎样信息从一个方框移动到另一个时不用加密不必盯着表、托着下巴苦思这些问题,(我反正没有!)你可以用简单的有助于记忆的STRIDE来识别威胁,这在下一部分会具体介绍。
使用便于记忆的STRIDE方法寻找威胁
STRIDE是个助记符,可以帮助查找不安全的地方。它是几个词或词组的首字母缩写,代表假冒(Spoofing)、篡改(Tampering)、否认(Repudiation)、信息暴露(Information Disclosure)、拒绝服务(Denial of Service)、权限提升(Elevation of Privilege)。
假冒:假装成并非自己真实身份的人或物。
篡改:修改你不应该修改的东西。包括有线 络(或者无线 络)的数据包、磁盘上的信息或者内存中的信息。
否认:宣称自己没做什么事(不管你是否做了还是没做)。
拒绝服务:旨在阻止系统提供正常服务的攻击,包括使系统崩溃、让它变得运行缓慢而且无法使用,或者占满内存。
信息暴露:将信息暴露给没有授权查看这些内容的人。
权限提升:指一个程序或者用户在技术上可以做其本来不能做的事情。
回忆一下之前提到的三种威胁范例:
- 你怎么知道 络浏览器被你所预期的人使用了/li>
- 如果有人修改数据库里的数据会怎样/li>
- 信息从一个方框移动到另一个时不用加密/li>
当你担心可能会有人被假冒时,保证每个人都有独特的用户名和验证方法,传统方法就是设置密码,虽然这种方式存在各种问题,但其很多优点也难以复制。密码相关内容详见第14章。
当访问磁盘文件时,不要用open(file),而应该使用open(/path/to/file)。如果文件敏感,打开后,检查文件说明符中的安全因素(例如完全解析的名字、授权和所有者)。为了避免竞争,要检查文件说明符。如果文件是可执行文件则执行两次(applies doubly),虽然打开后检查可能会比较棘手,这可能帮助确保可执行权限不会被攻击者修改。无论如何,你几乎从来不会想要求执行如下命令:exec./file。
当你担心联 时系统或者计算机会被假冒,你会想用DNSSEC、HTTPS/SSL、IPSec或是组合使用上述协议来保证你连接了安全正确的地方。
解决篡改威胁
表1-2展示篡改的目标、解决篡改的缓解策略以及如何实施这些缓解方法。