9.2.3  威胁建模的过程

9.2.3 威胁建模的过程

威胁建模不应当是一次性的过程,而应是在信息系统设计的早期阶段启动、贯穿于整个软件开发生命周期的一个迭代过程。首先,一次威胁建模不可能识别所有的威胁;其次,由于应用程序很少是静态的,它需要不断增强其功能并作出调整以适应不断变化的商业需求,因此,随着应用程序的发展,应当重复执行威胁建模过程。

威胁建模的5个主要步骤如图9-3所示。应该通过重复执行步骤2至5来逐步完善威胁建模结果。

978-7-111-51949-2-Part03-3.jpg

图9-3 重复执行的威胁建模过程[92]

1.确定安全目标

目标清晰有助于将注意力集中在威胁建模活动上,以及确定后续步骤要做多少工作。威胁建模的最终目标是保护应用程序的安全。因此首先要识别出应用程序中需要保护的对象,即有价值的资产。需要保护的资产范围从绝密数据(例如客户或订单数据库)到网页或网站不等。

2.创建应用程序概述

逐条列出应用程序的重要特征和参与者有助于在步骤4中确定相关威胁。创建应用程序概述的目标是介绍应用程序的功能、应用程序的体系结构、物理部署配置以及构成解决方案的技术。研发人员应当在应用程序的设计或实现中不断查找潜在的安全漏洞。

首先,识别应用程序的功能以及应用程序如何使用并访问资产。

其次,创建高水平的体系结构图表,用于说明应用程序的物理部署特性和应用程序及其子系统的组成和结构。根据系统的复杂性,可能需要创建附加图表,以着重说明不同部分。例如,一个图表用于构造中级应用程序服务器的体系结构模型,另一个图表用于构造与外部系统交互作用的模型。

最后,识别用于实现解决方案的特定技术。这有助于在后期关注特定技术的威胁。还有助于确定使用正确的和最恰当的缓解技术。最可能识别的技术包括:ASP.NET、Web服务、企业服务、Microsoft.NET远程和ADO.NET。另外,还要识别应用程序将调用的任何未处理的代码。

3.分解应用程序

全面了解应用程序的结构可以更容易地发现更相关、更具体的威胁。对应用程序了解得越深入,就越容易发现威胁。分解应用程序步骤如下:

(1)识别信任边界 对于每个子系统,考虑是否信任上游数据流或用户输入,如果不信任,考虑如何对数据流和输入进行验证并授权。必须确保将所有入口点保护在特定的信任边界内,并确保充分验证通过信任边界的所有数据的有效性。

(2)识别数据流 通过分析各个子系统之间的数据流来反复分解应用程序。越过信任边界的数据流是至关重要的,因为越过了自己的信任边界的代码应当假定数据是恶意的并执行数据有效性的完全验证。数据流图(DFD)和顺序图有助于对系统进行正式的分解,如图9-4所示。

978-7-111-51949-2-Part03-4.jpg

图9-4 某Web应用程序的DFD图

(3)识别入口点 应用程序的入口点同时提供了攻击的入口点。对于每个入口点,应能够确定提供授权和验证级别的安全措施的类型。逻辑应用程序入口点包括网页提供的用户界面、Web服务提供的服务界面、服务组件和.NET远程组件以及提供异步入口点的消息队列。物理或平台入口点包括端口和Sockets。

(4)识别特权代码 特权代码用于访问特定类型的安全资源,并执行其他特权操作。访问特权代码必须被授予相应的权限。必须确保特权代码包含的资源和操作不会暴露在危险环境下。

(5)说明安全配置文件 识别用于输入有效性、验证、授权、配置管理的设计和实现方法,以及应用程序最容易受安全漏洞影响的其他领域,为应用程序创建一个安全配置文件。

4.确定威胁

使用步骤2和3中的详细信息来确定与您的应用程序方案和上下文相关的威胁,包括网络威胁、主机威胁和应用程序威胁。

识别和确定威胁有两种方法。

(1)使用STRIDE来识别威胁 STRIDE建模方法由微软公司提出,属于微软安全生命周期(SDL)的一部分。该方法通过审查系统设计或架构来发现或纠正设计级的安全问题。STRIDE是6种威胁类型的英文首字母缩写,分别是:欺骗标识(Spoo fing identity)、篡改数据(Tempering with data)、可抵赖(Repudiation)、信息泄露(Infor-mation disclosure)、拒绝服务(Denial of service)、权限提升(Elevation privilege)[3]

使用STRIDE方法考虑多种威胁种类(例如数据欺骗、篡改和拒绝服务),对有关应用程序的体系结构和设计的每个方面提出质疑。例如,攻击者是否可以骗取某种身份以访问服务器和Web应用程序?某人是否可以篡改网络或存储中的数据?某人是否可以拒绝服务?

(2)使用分类威胁列表 通过此方法,按照网络、主机和应用程序进行分类的常见威胁列表,排查是否已经识别出所有安全漏洞。

5.确定漏洞

检查应用程序的各层以确定与威胁有关的弱点。要证明应用程序的威胁,就要描述出受到威胁的目标,威胁的攻击技术和解决威胁所需的对策,形成威胁列表。根据威胁发生的可能性和造成危害的严重程度对威胁造成的风险进行排序。研发人员应该最先解决代表最大风险的威胁,然后解决其他威胁。