引言
软件的安全问题很大一部分是由于不安全的设计引起的,在设计阶段造成的安全缺陷在后期修复的成本比较高,并且修改代码存在二次风险,所以本文介绍一种安全设计方法——ASTRIDE威胁建模。它是由微软在2006年提出的,通过一种结构化的方法识别应用中的安全和隐私风险,ASTRIDE威胁建模将威胁分成仿冒、篡改、抵赖、信息泄露、拒绝服务、权限提升和隐私几种,本文结合实战案例,介绍ASTRIDE威胁建模的分析过程以及常犯的错误,为威胁建模提供方法指引和最佳实践。
什么是威胁建模
威胁建模是一种结构化的方法,帮助开发人员可以系统性的识别产品的安全威胁,评估威胁的风险等级,制定相应消减措施的过程。
STRIDE威胁建模方法是由微软的安全工程和通信部门开发的,其概念最早发表于2006年11月的《MSDN杂志》,作者是微软的工程师肖恩·埃尔南、斯科特·兰伯特、托马斯·奥斯特瓦尔德和亚当·肖斯塔克,2018年11月微软宣布威胁建模工具的通用版本将在MSDN免费下载。
威胁建模的定义(GBT20984)是“威胁建模是一项工程技术,可以使用它来帮助确定会对您的应用程序造成影响的威胁、攻击、漏洞和对策。您可以使用威胁建模来形成应用程序的设计、实现公司的安全目标以及降低风险。”
为什么需要威胁建模?
威胁建模方法用来识别系统设计中所面临的安全风险,并帮助分析风险和消减风险,它可以有效解决安全和业务两条腿的问题,即安全人员不了解业务、开发人员不了解安全的矛盾,不仅降低了安全风险识别和分析的门槛,而且在提升软件安全性的同时,也降低了开发运维成本。
首先,在进入威胁建模之前,先明确一些常见的威胁及其对应的解决措施。
威胁类型 | 问题 | 解决措施 |
输入数据校验 | 应用程序接收到的输入是否有效和安全? | 输入验证在应用程序处理输入数据之前对其过滤、清洗或拒绝输入。 |
身份认证 | 你是谁? | 身份验证是一个实体通过凭据(例如用户名和密码)来证明另一个实体的身份的过程。 |
授权 | 您可以做什么? | 授权是应用程序为资源和操作提供访问控制的方式。 |
配置管理 | 应用程序以什么身份运行?它连接哪些数据库?如何被管理?这些设置如何得到保护? | 配置管理是应用程序如何处理这些操作。 |
敏感数据 | 应用程序如何处理敏感数据? | 应用程序如何处理必须在内存、网络或持久存储中受到保护的任何数据。 |
会话安全 | 应用程序如何处理和保护用户会话? | 会话安全保护用户和Web应用程序之间的一系列交互过程的安全。 |
密码学 | 如何保持机密性?如何防止数据被篡改(完整性)?如何为必须具有密码学强度的随机值提供种子? | 密码学安全包括应用程序如何强制实施机密性和完整性,以及信息发送者身份可信(数字签名和数字证书)。 |
参数操作 | 应用程序如何操作参数值? | 表单字段、查询字符串参数和cookie值经常用作应用程序的参数,应用程序如何保护这些值的篡改以及如何处理输入参数。 |
异常管理 | 当应用程序中的方法调用失败时,会如何处理异常?异常透露多少信息?会向最终用户返回友好的错误信息吗?会将有价值的异常信息传递回调用者吗? | 异常管理保证应用程序“安全”的失败。 |
审计和日志记录 | 谁在什么时候做了什么? | 审计和日志记录是指应用程序如何记录与安全相关的事件。 |
安全的目标是确保正确的人通过正确的方式访问正确的数据,并且不可否认其行为。
安全属性 | 描述 |
保密性 | 数据仅供合法的人使用 |
正确 | 数据和系统只能由适当的人员以适当的方式进行更改 |
可用性 | 系统在需要时准备就绪,并且性能可以接受 |
认证 | 用户的身份已建立 |
授权 | 明确允许或拒绝用户访问资源 |
不可否认性 | 用户无法执行操作,然后拒绝执行过该操作 |
表1. 安全属性
STRIDE威胁建模将威胁分成六类(见下表),这六类威胁分别保证系统具备上表重的六个安全属性,从而保证系统的安全性,安全属性与威胁的对应关系见下表。
威胁 | 英文 | 安全属性 |
欺骗、仿冒 | Spoofing | 认证 |
篡改 | Tampering | 正确 |
否认 | Repudiation | 不可否认性 |
信息泄露 | Information disclosure | 保密性 |
拒绝服务 | Denial of Service | 可用性 |
权限提升 | Elevation of Privilege | 授权 |
表2. 威胁与安全关系
STRIDE是六种威胁的英文名称首字母组合而成,随着隐私风险日益显著,在传统STRIDE威胁模型中添加了隐私威胁(Privacy),称为ASTRIDE威胁模型,A为Advanced缩写(以下统一称为ASTRIDE)。
什么时候威胁建模?
威胁建模通常在系统设计阶段进行,作用是发现架构或功能设计方案中的安全威胁,而不是代码的安全,但是,威胁的消减措施提供了安全技术细节,如采用的认证方式、加解密算法、完整性校验算法、数字签名算法等,这些技术可以指导开发人员安全的编码,所以执行威胁分析的是系统设计人员,但是它的作用范围包括了设计、开发、安全、测试人员。
如何威胁建模?
ASTRIDE威胁建模需要像攻击者一样思考,采用逆向的思考来预测系统中潜在的风险点,即可预测的威胁,通过添加控制措施消除或者减缓威胁,从而降低对业务造成的影响。
ASTRIDE威胁建模是一种结构化的分析方法,需要将系统分解为组件,分析每个组件的安全威胁,这些威胁的合集就构成了系统的威胁清单,每个组件的安全威胁被消除或缓解之后,系统在一定程度上是安全的,但不是绝对安全。
威胁建模的操作步骤
ASTRIDE威胁建模包括以下五个步骤:
- 确定安全目标。
- 应用顶层模型。
- 绘制数据流图。
- 识别威胁。
- 风险定级。
以下将分别对每个步骤展开详细介绍:
第一步、确定安全目标
为系统设定清晰明确的安全目标非常重要,它决定了系统的安全性可以达到什么程度,也为设计、开发、安全、测试人员在安全要求上提供统一的标准,对于识别出的威胁,系统开发人员可以根据严重性和安全目标,决定将更多精力花费在哪些威胁上。
安全目标可以来自于:
- 外部合规要求:安全政策、隐私合规、法规标准、认证要求。
- 需要满足内外部的安全需求:公司的研发安全红线,研发安全制度、客户的安全要求。
- 需要保护的用户数据:用户帐户和密码、客户帐户详细信息、财务历史和交易记录、客户信用卡号码、银行详细信息或旅行行程。
第二步,应用顶层模型
系统的顶层模型是绘制数据流图的基础,将应用程序作为黑盒,分析应用程序作为整体接收的外部输入和输出,确定应用程序的关键功能、特征和客户端,分析系统面临的来自外部的威胁。
威胁建模是一个迭代的过程,随着设计的推进,应逐步添加更多细节,也就是0层设计,到1层设计,到2层设计……,逐步成熟。
创建应用顶层设计的步骤如下:
- 绘制端到端的部署场景。
- 确定角色。
- 确定关键使用场景。
- 确定技术。
- 确定应用程序的安全机制。
第三步、绘制数据流图
数据流图是一种表示系统数据流转的描述方式,数据流图英文为Data Flow Diagram,简称DFD,数据流图包括以下5类元素:
元素 | 定义 | 举例 | 绘制 |
外部交互方 | 系统范围之外但与系统明显相关的数据提供者和使用者 | 浏览器、外部Web应用、外部Web服务、人、Windows运行时 | |
处理过程 | 任务处理过程 | 进程、线程、本地应用程序、浏览器客户端、Web服务器、Web应用程序、Web服务、虚拟机 | |
数据存储 | 数据存储实体 | 云存储、SQL数据库、非关系型数据库、文件系统、注册表、配置文件、缓存、Local storage、cookie | |
数据流 | 数据传输 | HTTP、HTTPS、IPsec、命名管道、SMB、RPC、二进制 | |
信任边界 | 划分不同的信任等级、跨信任边界的数据流应重点分析。 | 内部和外部、用户态和内核态、App容器之间。 |
正确绘制数据流图是威胁分析的基础,几种常见的数据流图错误:
- 数据流图不完整,数据流图中缺少功能会造成安全威胁漏分析,即便看起来风险较小的业务;
- 元素类型错误,外部交互方和处理过程经常容易混淆,区分二者的方法是如果在控制范围之内就是处理过程,否则是外部交互方;
数据流图常常和类图、程序流程图混淆,数据流图表示的是数据在系统中的流转关系,而不是业务模块之间的调用关系,虽然大多数接口调用都会伴随数据的传递,但是类图无法直观的展示数据的起始和终点以及在系统内部的处理方式等;
- 数据不是凭空产生的,一般情况来自于外部交互方或者数据存储;
- 数据流不能从外部交互方直接流转到数据存储,例如用户