UML软件工程组织

威胁建模
来源:www.microsoft.com
本页内容
本模块内容 本模块内容
目标 目标
适用范围 适用范围
如何使用本模块 如何使用本模块
开始操作之前 开始操作之前
威胁建模原理 威胁建模原理
步骤 1:识别资产 步骤 1:识别资产
步骤 2:创建体系结构概述 步骤 2:创建体系结构概述
步骤 3:分解应用程序 步骤 3:分解应用程序
步骤 4:识别威胁 步骤 4:识别威胁
步骤 5:证明威胁 步骤 5:证明威胁
步骤 6:评估威胁 步骤 6:评估威胁
接下来要做什么? 接下来要做什么?
小结 小结

本模块内容

威胁建模使您可以对最可能影响系统的威胁进行系统地识别和评估。

威胁建模具有一种结构化方法,与在未准确知晓每个功能所要致力解决的威胁的情况下无计划地应用安全保护功能相比,使用此方法更节约成本、更有效。

阅读完本模块并将威胁建模方法学应用到 Web 应用程序后,您将能够基于对应用程序漏洞的充分理解而对现存的威胁进行识别和评估。通过此信息,您可以从代表最强大风险的威胁开始,按照逻辑顺序使用相应的对策来解决现存的威胁。

当 Web 应用程序暴露在非安全环境(例如 Internet、Intranet 和 Extranet)中时,没有一种方法可以确保系统的绝对安全。唯一可能的解决方案是承认威胁的存在,然后减少或处理相关的危险。威胁建模使您可以作出分析,并关注相关问题的资源,从而使投资回收最大化。

目标

使用本模块可以实现:

创建威胁模型。

学习如何评估威胁并使用 DREAD 模型。

分解应用程序体系结构,并发现其漏洞。

识别并证明与应用程序相关的威胁。

适用范围

Web 应用程序

如何使用本模块

本模块概述了识别并记录应用程序所面临的威胁的一般过程。为了充分理解本模块内容,请:

建立威胁建模的过程。如果尚未建立这样的过程,请使用本模块作为您在您的组织中介绍威胁建模的起点。如果已经建立了一个过程,也可以将此模块作为对比参考。

使用本指南中的其他模块,可以熟悉最常见的威胁。有关发生在网络、主机和应用程序层的常见威胁的概述,请参阅模块 2 威胁和对策。

有关对网络造成的更多特定威胁,请参阅模块 15 保护您的网络 中的“威胁和对策”。

有关对于 Web 服务器、应用程序服务器和数据库服务器的更多特定威胁,请参阅模块 16 保护 Web 服务器、模块 17 确保应用程序服务器的安全 和模块 18 保证数据库服务器的安全。

有关对组件、ASP.NET、服务组件、远程组件、Web 服务和数据访问的更多特定威胁,请参阅模块 7 构建安全的程序集中的“威胁和对策”、模块 10 构建安全的 ASP.NET 网页和控件、模块 11 构建安全服务型组件、模块 12 构建安全的 Web Services、模块 13 构建安全的远程组件和模块 14 构建安全的数据访问。

开发威胁模型。先构造一个威胁模型,然后在必要时开发它。它是一项不断进行的工作。安全威胁在演进,您的应用程序也要不断发展。拥有可以识别已知威胁以及如何解决(或尚未解决)这些威胁的文档,就可以帮助您控制应用程序的安全。

开始操作之前

启动威胁建模过程之前,需要充分理解以下基本术语:

资产。具有价值的资源,例如数据库或文件系统中的数据。系统资源。

威胁。潜在的、恶意的或可能损害资产并危及资产安全的事件。

漏洞。可能带来威胁的系统功能或某些方面的弱点。漏洞可能存在于网络、主机或应用程序层。

攻击(或非法利用)。某人或某事件所做的、会对资产造成损害的操作。它可以是某个人实施某个威胁或利用某个漏洞。

对策。解决威胁并降低风险的一种安全措施。

让我们拿一所房子进行类推:房子中的珠宝相当于资产,窃贼相当于攻击者。门是房子的一种功能,而打开的门就代表一种安全漏洞。窃贼可以利用打开的门进入房子,并盗窃珠宝。也就是说,攻击者利用安全漏洞访问资产。此例中相应的对策是将门关闭并锁上。

威胁建模原理

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

过程

图 3.1 显示了威胁建模过程,您可以通过 6 个阶段完成此过程。

注意:下面的过程布局可以用于当前正在开发的应用程序和现有的应用程序。

威胁建模过程概述

图 3.1
威胁建模过程概述

1.

识别资产。
识别系统必须进行保护的有价值的资产。

2.

创建体系结构概述。
使用简单的图表可以将应用程序的体系结构记录在文档中,包括子系统、信任边界和数据流。

3.

分解应用程序。
分解应用程序的体系结构(包括基础网络和主机构造设计),以创建应用程序的安全配置文件。安全配置文件旨在发现应用程序的设计、实现或部署配置中的安全漏洞。

4.

识别威胁。
始终记住攻击者的目标、了解应用程序的体系结构和潜在的安全漏洞、识别可能影响应用程序的威胁。

5.

用文档记录威胁。
使用定义了一组核心属性以捕获每个威胁的常用威胁模板,将每个威胁记录在文档中。

6.

评估威胁。
对威胁进行评估,以便对威胁进行优先级排列,并首先致力于解决最明显的威胁。这些威胁代表最强大的风险。评估过程对威胁的可能性进行评估,以防止发生攻击而带来的损害。将威胁造成的风险与因此带来的成本降低进行比较时,您可能发现无需对某些威胁采取任何措施。

输出

威胁建模过程的输出是一份提供给项目组各个成员的文档。它使这些成员可以清楚地理解需要解决的威胁问题以及如何解决威胁问题。威胁模型由应用程序体系结构的定义和用于应用程序脚本的威胁列表组成,如图 3.2 所示。

威胁模型的组件

图 3.2
威胁模型的组件

步骤 1:识别资产

识别需要保护的资产。需要保护的资产范围从绝密数据(例如客户或订单数据库)到网页或网站不等。

步骤 2:创建体系结构概述

此步骤的目标是介绍应用程序的功能、应用程序的体系结构、物理部署配置以及构成解决方案的技术。您应当在应用程序的设计或实现中不断查找潜在的安全漏洞。

在该步骤中,需要执行以下任务:

识别应用程序的功能。

创建体系结构图表。

识别技术。

识别应用程序的功能

识别应用程序的功能以及应用程序如何使用并访问资产。文档使用案例来帮助您和其他人理解如何使用应用程序,还可以帮助您避免应用程序被错误地使用。使用案例可以将应用程序的功能放在具体环境中考虑。

此处列出了用于某个自助员工人力资源应用程序的一些样例使用案例:

员工将查看财务数据。

员工将更新个人数据。

经理将查看员工详细资料。

在上述案例中,您需要了解违反商业规则的含义。例如,假设某个员工试图修改其他用户的个人详细资料,则根据已定义的应用程序的要求,不应当授予他或她访问这些资料的权限。

创建体系结构图表

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

样例应用程序体系结构图表

图 3.3
样例应用程序体系结构图表

首先绘制一张草图,用于说明应用程序及其子系统的组成和结构以及应用程序的部署特性。然后,通过添加有关信任边界、验证和验证机制的详细信息来完善此图,并注明何时需要这些信息(通常在步骤 3 中分解应用程序时)。

识别技术

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

使用类似于下面的表 3.1 来说明这些技术。

表 3.1 实现技术

技术/平台

实现详细信息

Microsoft Windows Advanced Server 2000 上的 Microsoft SQL Server

包括登录、数据库用户、用户定义的数据库功能、表、存储的过程、查看、约束和触发器。

Microsoft .NET Framework

用于表单身份验证。

安全的 Sockets Layer (SSL)

用于加密 HTTP 通信。

步骤 3:分解应用程序

在此步骤中,您将应用程序分解,以便基于安全漏洞的传统领域,创建应用程序的安全配置文件。您还将识别信任边界、数据流、入口点和特权代码。对应用程序了解得越深入,就越容易发现威胁。图 3.4 显示了分解过程的各个目标。

应用程序分解的目标

图 3.4 应用程序分解的目标

在该步骤中,需要执行以下任务:

识别信任边界。

识别数据流。

识别入口点。

识别特权代码。

说明安全配置文件。

识别信任边界

识别包含应用程序的每个有形资产的边界。这些资产由应用程序设计确定。对于每个子系统,请考虑是否信任上游数据流或用户输入,如果不信任,请考虑如何对数据流和输入进行验证并授权。同时请考虑是否信任呼叫代码,如果不信任,请考虑如何对呼叫代码进行验证并授权。您必须能够确保相应的安全措施可以将所有入口点保护在特定的信任边界内,并确保容器入口点可以充分验证通过信任边界的所有数据的有效性。

从分析来自代码透视的信任边界开始。代表一种信任边界形式的程序集是一个很好的起点。哪些集合信任哪些其他集合?特定程序集是否信任其呼叫的代码?或者程序集是否使用代码访问安全来为呼叫代码授权?

同时请考虑服务器信任关系。某个特定服务器是否信任上游服务器对最终用户进行验证并授权?或者服务器是否为自己提供安全保护服务?另外,服务器是否信任上游服务器传输格式正确的数据?

例如,在图 3.3 中,Web 应用程序通过使用一个固定的信任身份(此案例中为 ASPNET Web 应用程序过程账户)来访问数据库服务器。在此脚本中,数据库服务器信任应用程序服务器对呼叫者进行验证和授权,并代表被授权的用户仅转发有效的请求数据。

注意:在 .NET 框架应用程序中,程序集将定义最小的信任单元。无论何时数据越过程序集边界(根据定义,它包括应用程序域、进程或设备边界),容器入口点应验证其输入数据的有效性。

识别数据流

简单的方法是从最高级别开始,然后通过分析各个子系统之间的数据流来反复分解应用程序。例如,先分析 Web 应用程序和企业服务应用程序之间的数据流,然后再分析各个服务组件之间的数据流。

越过信任边界的数据流是至关重要的,因为越过了自己的信任边界的代码应当假定数据是恶意的并执行数据有效性的完全验证。

注意:数据流图表 (DFD) 和顺序图表有助于对系统进行正式的分解。数据流图表 (DFD) 是数据流、数据存储以及源数据和目标数据之间关系的图形表示法。顺序图表显示了一组对象如何按照事件的排序进行通力合作。

识别入口点

应用程序的入口点同时提供了攻击的入口点。入口点可能包括用于侦听 HTTP 请求的前端 Web 应用程序。此入口点本来是要暴露给客户端。其他入口点(例如,由跨越应用程序各个层的子组件所暴露的内部入口点)的存在仅用于支持与其他组件之间的内部通信。但是,您应知道这些入口点的位置,以及它们接收的输入的类型,以防止攻击者试图绕过应用程序的前门而直接攻击内部的入口点。

对于每个入口点,您应当能够确定提供授权和验证级别的安全措施的类型。

逻辑应用程序入口点包括网页提供的用户界面、Web 服务提供的服务界面、服务组件和 .NET 远程组件以及提供异步入口点的消息队列。物理或平台入口点包括端口和 Sockets。

识别特权代码

特权代码用于访问特定类型的安全资源,并执行其他特权操作。安全资源类型包括 DNS 服务器、目录服务器、环境变量、事件日志、文件系统、消息队列、性能计数器、打印机、注册表、Sockets 和 Web 服务。安全操作包括无人管理的代码呼叫、映像、序列化、代码访问安全权限和代码访问安全策略的处理(包括证据)。

代码访问安全策略必须授予特权代码相应的代码访问安全权限。特权代码必须确保其包含的资源和操作不会暴露给不受信任的和潜在的恶意的代码。.NET 框架代码访问安全性通过执行堆栈通道来验证授予给呼叫代码的权限。但是,有时有必要覆盖此操作,不执行完全的堆栈过程。例如,当您想限制特权代码或隔离特权代码时。这样操作将开放您的代码以引诱攻击,在攻击中,恶意的代码将通过受信任的中间代码来呼叫您的代码。

无论何时您覆盖由代码访问安全提供的缺省的安全操作时,请谨慎,并采取相应的安全措施。有关查看安全漏洞代码的详细信息,请参阅模块 21 代码审查。有关代码访问安全性的详细信息,请参阅模块 8 代码访问安全的实践 和模块 9 ASP.NET 代码访问安全性。

说明安全配置文件

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

下表显示了对应用程序的设计和实现的每个方面进行分析时要询问的问题的种类。要查看程序体系结构和设计的详细信息,请参阅模块 5 体系结构和设计审查。

表 3.2创建安全配置文件

类别

考虑

输入有效性

所有输入数据是否均有效?
攻击者是否可以向应用程序植入命令或恶意的数据?
数据越过独立的信任边界时是否验证数据的有效性?
是否信任数据库中的数据?

验证

通过网络传送证书是否安全?
是否使用了严格的账户策略?
是否强制使用严格的密码?
是否使用证书?
是否为用户密码启用密码验证器?

授权

在应用程序的入口点使用何种安全措施?
如何在数据库中强制授权?
是否采用了深度防范策略?
是否拒绝安全验证并仅允许基于成功的证书确认后的访问?

配置管理

应用程序支持何种管理界面?
怎样对其进行保护?
怎样对远程管理进行保护?
使用何种配置存储以及如何保护其安全?

敏感数据

应用程序处理何种敏感数据?
如何在网络和持久存储中保护其安全?
使用了何种加密类型以及如何保护加密密钥的安全?

会话管理

会话 cookies 是如何生成的?
如何保护会话的安全以防止会话拦截?
如何保护持久会话状态的安全?
会话通过网络时如何保护会话状态的安全?
应用程序如何与会话存储进行验证?
证书是否通过有线传输以及是否由应用程序维护?
如果是,如何保护它们的安全?

密码系统

使用何种运算法则和密码技术?
加密密钥包含多少字符以及如何保护其安全?
应用程序如何对自身实现加密?
密钥的循环周期如何?

参数处理

应用程序是否检测受干扰的参数?
是否对格式字段、查看状态、cookie 数据和 HTTP 标题中的参数进行验证?

异常处理

应用程序如何处理出现的错误?
是否允许异常向后继承至客户端?
是否使用不包含可非法利用的信息的一般错误消息?

审核与日志

应用程序是否在所有服务器上对各个级别的活动均进行审核?
如何保护日志文件的安全?

步骤 4:识别威胁

在此步骤中,您将识别可能影响系统并危及资产安全的威胁。开始此过程前,请将开发团队和测试团队的成员聚集在一起,在白板前召开一次研讨会以集思广益。这是一个识别潜在威胁的简单而有效的方法。如果团队由应用程序体系结构设计者、安全专家、开发者、测试者和系统管理员组成就更为理想了。

您可以使用两种基本的方法:

使用 STRIDE 来识别威胁。考虑多种威胁种类(例如电子欺骗术、篡改和拒绝服务),使用模块 2 威胁和对策 的 STRIDE 模型来对有关应用程序的体系结构和设计的每个方面提出质疑。这是一种基于目标的方法,在该方法中,您考虑的是攻击者的目标。例如,攻击者是否可以骗取某种身份以访问服务器和 Web 应用程序?某人是否可以篡改网络或存储中的数据?某人是否可以拒绝服务?

使用分类威胁列表。通过此方法,您将从启动按照网络、主机和应用程序进行分类的常见威胁的细目列表开始。接下来,将威胁列表应用到您自己的应用程序体系结构和此过程中早期已经识别的所有安全漏洞中。因为这些威胁不适用于您的脚本,所以您可以立刻排除一些威胁。

使用以下资源有助于理解威胁识别过程:

有关按照网络层、主机层和应用程序层分类的威胁列表以及对威胁和相关对策的解释,请参阅模块 2 威胁和对策。

有关根据技术进行分类的威胁列表,请参阅本指南第三部分中每个“建立”模块开始部分的“威胁和对策”。

在该步骤中,需要执行以下任务:

识别网络威胁。

识别主机威胁。

识别应用程序威胁。

识别网络威胁

这是网络设计者和网络管理员的任务。分析网络拓扑和数据包流,同时分析路由器、防火墙、交换机配置,并查找潜在的安全漏洞。另外请注意虚拟专用网络 (VPN) 末端。查看网络安全设置,以防止模块 2 威胁与对策中已识别的最常见网络层的威胁。

设计阶段最先考虑的网络威胁包括:

使用依赖于发包者的 IP 地址的安全机制。发送带有错误的源 IP 地址(IP 欺骗)来发送 IP 包是一种相对容易的方式。

通过未加密的网络通道传输会话识别器或 cookies。这可以导致 IP 会话拦截。

通过未加密的通信通道传输清楚的文本验证证书或其他敏感数据。这使攻击者可以监测网络、获得登录证书或者获取并可能篡改其他敏感数据项目。

您必须同时确保由不安全设备和服务器配置而引起的威胁不会对网络进行攻击。例如,是否要关闭并禁用不必要的端口和协议?路由表和 DNS 服务器是否安全?服务器上的 TCP 网络堆栈是否不易攻击?有关预防此类型的安全漏洞的详细信息,请参阅模块 15 保护您的网络。

识别主机威胁

配置主机安全设置(也就是,Microsoft Windows 2000 和 .NET 框架配置)时,本指南通篇使用的方法是将配置分成几个类别,您可以按照结构化和逻辑方式应用安全设置。此方法还能够理想的用于检查安全性,准确确定安全漏洞的位置并识别威胁。所有服务器角色的一般配置类别包括补丁程序和更新信息、服务、协议、帐户、文件和目录、共享、端口以及审核与日志。对于每个类别识别潜在的易受攻击的配置设置。通过这些设置来识别威胁。

最先考虑的安全漏洞包括:

可以被病毒、特洛伊木马、蠕虫以及已知的 IIS 攻击的未安装补丁程序的服务器。

使用非基本端口、协议和服务,这将增加攻击配置文件,使攻击者可以搜集有关信息并非法利用您的环境。

允许未经验证的匿名访问。

如果能够有意锁定帐户,请使用简单的密码和帐户策略,该策略可以导致密码分解、身份欺骗和拒绝服务这类攻击。

识别应用程序威胁

在前面的步骤中,您定义了应用程序的的体系结构、数据流、信任边界。您还创建了安全配置文件,用以描述应用程序如何管理核心区域(例如:验证、授权、配置管理)和其他区域。

现在请使用各类 STRIDE 威胁和预定义的威胁列表来仔细检查应用程序安全配置文件的每个方面。关注应用程序威胁、特定技术威胁以及代码威胁。要考虑的主要安全漏洞包括:

使用普通输入验证将导致跨站点脚本 (XSS)、SQL 植入和缓冲溢出攻击。

通过未加密的网络链路传输验证证书或验证 cookies,这将导致证书捕获或会话拦截。

使用简单的密码和帐户策略,将导致未经授权的访问。

无法确保应用程序配置管理方面的安全,包括管理界面。

以纯文本方式存储配置私秘,例如连接字符串和服务帐户证书。

使用超权限进程和服务帐户。

使用不安全的数据访问代码技术,可以增加由 SQL 植入引起的威胁。

使用简单的或自定义的加密措施无法充分确保密钥的安全。

依赖于 Web 浏览器传输集成参数,例如,格式字段、查询设置、cookie 数据和 HTTP 标题。

使用不安全的异常处理,可以导致拒绝服务攻击和对攻击者有用的系统级详细资料的泄漏。

实施不充分的审核与日志检查,将导致抛弃威胁。

使用攻击树和攻击模式

使用攻击树和攻击模式是安全专家使用的主要工具。它们不是威胁识别阶段的基本组件,但您将发现它们很有用。它们使您可以更深层次地分析威胁,更好地帮助您识别其他可能威胁。

要点:如果使用以前准备好的已知的威胁分类列表,仅能发现常见的已知的威胁。使用其他方法(例如攻击树和攻击模式)可以帮助您识别其他潜在的威胁。

攻击树按照结构化和层次化的模式搜集并证明系统上存在的潜在攻击。树结构对攻击者用以危及系统安全的各种攻击进行描述性分类。通过创建攻击树,您将创建一个有助于集中精力的可重复使用的安全问题的描述。测试团队可以创建测试计划以确保安全设计的有效性。开发者可以在实现期间做出权衡,体系结构设计者或开发领导者可以对其他方法的安全成本进行评估。

攻击模式是在企业中捕获攻击信息的形式化的方法。这些模式可以帮助您识别常见的攻击技术。

创建攻击树

在实践中可以使用若干方法的同时,可接受的方法是识别攻击者要成功攻击需要采取的措施以及识别攻击者的目标和子目标。您可以使用层次化图表或简单布局来代表攻击树。最后,您是否拥有用以描述应用程序的攻击配置文件所需的工具也是很重要的。然后,您可以大致评估安全风险,可以通过使用相应的对策(例如,更正设计方法、加强配置设置及其他解决方法)来降低安全风险。

首先从创建代表攻击者目标的根节点构造攻击树开始。然后添加叶节点,叶节点是代表唯一攻击的攻击方法学。图 3.5 显示了一个简单的样例。

攻击树的表示法

图 3.5
攻击树的表示法

您可以使用 ANDOR 标签对叶节点作标记。例如,在图 3.5 中,1.1 和 1.2 必须同时发生才可以导致攻击。

攻击树正如上述样例,并迅速复杂化。创建它们也是非常耗时的一项工作。一些团队热中的其他方法是使用布局(如下所示)来构建攻击树。

1.  目标一
1.1 子目标一
1.2 子目标二
2.  目标二
2.1 子目标一
2.2 子目标二

注意:除了目标和子目标外,攻击树还包括方法学和所需条件。

此处为实际中的一个布局方法样例:

#1 号威胁攻击者通过监测网络获得了验证证书
1.1 通过网络“与”传输清晰的文本证书
1.2 攻击者使用网络监测工具
1.2.1 攻击者识别证书数据

要获得完整的样例,请参阅本指南中“创建表单”一节中的“样例攻击树”。

攻击模式

攻击模式是通常发生在各种不同环境中的攻击的一般表示方法。模式定义了攻击发生必须的条件、执行攻击所需的步骤和攻击的结果,也定义了攻击的目标。攻击模式致力于攻击技术,但是基于 STRIDE 的各种方法致力于攻击者的目标。

例如,代码植入攻击模式就是攻击模式的一个样例,该模式用于以一般方式描述代码植入攻击。表 3.3 描述了代码植入攻击模式。

表 3.3 代码植入攻击模式

模式

代码植入攻击

攻击目标

命令或代码执行

所需条件

来自攻击的简单输入验证代码
在服务器上具有足够的权限。

攻击技巧

1. 使用输入验证漏洞在目标系统上识别程序。
2. 创建要植入和运行的代码,并通过目标应用程序的安全环境来运行此代码。
3. 构造输入值将代码插入目标应用程序的地址空间,并强加一个导致应用程序异常并跳转到植入代码的堆栈破坏。

攻击结果

来自攻击的代码将运行并执行恶意的操作。

有关攻击模式的详细信息,请参阅本模块最后部分的“其他参考”。

步骤 5:证明威胁

要证明应用程序的威胁,请使用显示类似于以下属性的若干威胁属性的模板。威胁描述和威胁目标是最基本的属性。此阶段不进行危险评估。如果对已识别的威胁列表进行了优先级排序,此步骤将用于威胁建模过程的最后阶段。您可能想要包括的其他属性有:攻击技术(该技术也可以暴露被非法利用的安全漏洞)和解决威胁所需的对策。

表 3.4威胁 1

威胁描述 攻击者通过监测网络获得验证证书。
威胁目标 Web 应用程序用户验证过程
风险

 

攻击技术 使用网络监测软件
对策 使用 SSL 以提供加密的通道

表 3.5 威胁 2

威胁描述 SQL 命令的植入
威胁目标 数据访问组件
风险

 

攻击技术 攻击者在用户名上捆绑了 SQL 命令,该命令用于形成 SQL 查询
对策 使用常规表达以验证用户名的有效性,使用通过参数访问数据库的存储的步骤。

步骤 6:评估威胁

在此步骤中,您拥有将应用到特定应用程序脚本中的威胁列表。在最后的步骤中,您要基于威胁造成的风险进行威胁评估.这使您能够最先解决代表最大风险的威胁,然后解决其他威胁。实际上,从经济方面考虑,描述出所有已识别的威胁可能并不可行。您可能要忽略某些威胁,因为它们发生的几率很小并且如果发生所造成的损害微乎其微。

风险 = 可能性 * 潜在的损害

此公式表示特定威胁带来的风险等于威胁发生的可能性乘以潜在的损害,它代表了发生攻击时对系统造成损害的程度。

您可以将 1–10 这个比例用于威胁发生的可能性,其中 1 代表不太可能发生的威胁,10 代表几乎可以确定会发生的威胁。同样,可以将 1–10 这个比例用于潜在的损害,其中 1 表示最小的损害,10 代表灾难性的损害。使用这种方法,可以得出结论:发生的可能性低而潜在的损害高,这样的威胁带来的风险等于潜在的损害有限却极易发生的威胁带来的风险。

例如,如果可能性 = 10,潜在的损害 = 1,那么风险 = 10 * 1 = 10。如果可能性 = 1,潜在的损害 = 10,则风险 = 1 * 10 = 10。

这种方法带来的比例为 1–100,您可以将此比例分成三个区,这样就生成了高、中或低风险等级。

高、中和低等级

您可以使用简单的高、中或低等级对威胁进行优先级排列。如果威胁评估结果为高,则威胁将对应用程序造成显著的威胁,并且需要尽可能地解决。中级威胁需要解决,但是不紧急。根据解决威胁所需的努力和费用,您可能会决定忽略低级威胁。

DREAD

由于评估系统的简单化而引起的问题是团队成员通常无法对等级达成一致。为帮助解决此问题,增加了有助于确定安全威胁真正意味的影响的新的评估标准。在 Microsoft,DREAD 模型用于帮助计算风险。使用 DREAD 模型,您可以通过询问以下问题对给定的威胁活的风险等级:

潜在的损害:如果安全漏洞被利用,则损害有多大?

再现性:再次攻击是否容易?

可利用性:进行攻击是否容易?

受影响的用户:作为一个粗略的百分比计算,大概有多少用户会受到影响?

可发现性:发现安全漏洞是否很容易?

您可以使用上述项目来评估每个威胁。为满足您的需要,您也可以对上述问题进行延伸。例如,您可以增加有关潜在名誉损害的问题:

名誉:风险有多高?是否存在名誉风险?名誉风险将导致失去客户信任。

无需大范围地逐个地进行威胁评估,因为这将很困难。你可以使用简单的模式,例如高 (1)、中 (2) 和低 (3)。

如果清楚的定义了评估系统中每个值所代表的含义,将有助于避免混淆。表 3.6 显示了一个等级表的典型样例,可用于团队成员对威胁进行优先级排列。

表 3.6威胁等级表

等级
高 (3)
中 (2)
低 (1)

D

潜在的损害 攻击者可以破坏安全系统,获取全部信任授权,以管理员身份运行并上载内容。 泄露敏感信息 泄漏普通信息

R

可再现性 攻击是可再现的,无时间范围。 攻击是可再现的,但是仅在某个时间范围内以及特定的条件下才会发生。 即使具备安全漏洞的知识,再次实现攻击也是非常困难的。

E

可利用性 初学者程序员在很短的时间内就可以制造攻击。 熟练的程序员可以制造攻击,并可重复攻击。 每次开展攻击均需要程序员具备极其熟练的技能和深入的知识。

A

受影响的用户 全部用户、默认配置用户、关键客户 某些具有非默认配置的用户 极少数用户、匿名用户

D

可发现性 出版的信息将对攻击进行解释。可在最常使用的功能中发现安全漏洞,而且这种漏洞是显而易见的。 安全漏洞还存在于很少使用的产品的组件中,因此只有少数用户才会偶尔遇到。要发现恶意使用需要花费一些思考。 这种漏洞并不明显,而且靠用户解决它的潜在损害是不太可能的。

询问上述问题以后,请计算给定威胁的等级 (1–3)。结果的范围为 5–15。然后您可以将总体等级为 12–15 的威胁处理为高级风险,8–11 为中级风险,5–7 为低级风险。

例如,我们来考虑先前描述的两个威胁:

攻击者通过监测网络来获得验证证书。

将 SQL 命令植入应用程序。

表 3.7 显示了两种威胁的 DREAD 等级的样例:

表 3.7DREAD 等级

威胁 D R E A D
总数
等级
攻击者通过监测网络来获得验证证书。

3

3

2

2

2

12

将 SQL 命令植入应用程序。

3

3

3

3

2

14

一旦获得风险等级,您便可以更新已证明的威胁,并增加发现的评估等级级别,上述两种威胁的等级均为“高”。表 3.8 显示了一个样例。

表 3.8 威胁 1

威胁描述 攻击者通过监测网络获得验证证书。
威胁目标 Web 应用程序用户验证过程
风险等级
攻击技术 使用网络监测软件
对策 使用 SSL 以提供加密的通道

接下来要做什么?

威胁建模过程的输出包括应用程序体系结构安全性方面的文档以及已评估的威胁列表。威胁模型有助于集中开发团队成员的力量,并集中解决最大的威胁。

要点:威胁建模是一个迭代进程。威胁模型是不断改进的文档,各个团队成员均可对其进行修改。

威胁模型可用于以下团队:

设计者可以使用威胁模型作出有关技术和功能的安全设计选择。

编写代码的开发者可以使用威胁模型来降低风险。

如果分析师已识别的威胁对应用系统构成安全性问题,测试者可以编写测试案例进行测试。

生成工作项目报告

根据初始威胁模型,您可以创建更正式的工作项目报告,该报告包括附加属性(例如故障 ID),该属性可用于将威胁附加在您喜欢的故障跟踪系统中。实际上,您可以选择在故障跟踪系统中输入已识别的威胁,并使用其报告工具生成报告。您还可以包括一个状态栏,用以指示故障是否已解决。您应当确保报告包括原始威胁编码以将其返回威胁模型文档。

按照网络、主机和应用程序类别在报告中组织威胁。这将使处于不同角色的不同团队成员更容易理解报告。在每个类别内,按照优先顺序显示威胁,从风险等级高的威胁开始,接下来是代表较少风险的威胁。

小结

虽然您可以减少攻击的风险,但您无法减少或排除真正的威胁。尽管您采取了安全措施并应用了相应的对策,威胁仍然存在。安全领域中的实际情况是:您承认威胁的存在,同时努力处理风险。威胁建模可以帮助您在团队中处理并交流安全风险问题。

将威胁建模作为一个迭代过程来对待。请将安全模型列为不断变化的动态项目,以适应不断发现的新威胁和攻击类型。威胁模型还应能够不断调整,以跟上应用程序的发展,因为需要不断增强和修改应用程序,才能满足不断变化的商业需求。

 

 

版权所有:UML软件工程组织