一、什么是威胁建模
简单的来说,威胁建模就是通过结构化的方法,系统的识别、评估产品的安全风险和威胁,并针对这些风险、威胁制定消减措施的一个过程。
威胁建模是一个非常有用的工具,它的核心是“像攻击者一样思考”。威胁建模可以在产品设计阶段、架构评审阶段或者产品运行时开展,强迫我们站在攻击者的角度去评估产品的安全性,分析产品中每个组件是否可能被篡改、仿冒,是否可能会造成信息泄露、拒绝攻击。威胁建模的作用更偏向于确保产品架构、功能设计的安全,无法保证编码的安全,但是输出的威胁建模报告中包含了全面的安全需求,这些安全需求不仅包括大的方案设计,如要认证、鉴权、审计,也可以包括安全细节的实现,比如具体的认证方式、密码使用哪种安全算法存储,使用什么方法生成安全随机数等。所以,威胁建模虽不能保证编码的安全,但可以指导研发人员编写出安全的代码,同时也可以辅助渗透测试人员开展安全测试。
二、为什么要做威胁建模
1. 站在攻击者的角度通过识别威胁,尽可能多的发现产品架构和功能设计中的安全风险
2. 制定措施消减威胁,规避风险,确保产品的安全性
三、应该在什么时候做威胁建模
威胁建模应融入企业的软件开发安全生命周期(SDL)中。
1. 新产品或新功能的设计阶段应开展威胁建模,发现风险、制定消减措施,消减措施是安全需求的一部分,需落入产品需求跟踪,确保产品安全。
2. 系统运行过程中也可以开展威胁建模,发现的风险可以为企业渗透测试提供支持,尽可能发现更多的漏洞。
四、常用的威胁建模方法—STRIDE
STRIDE是微软开发的用于威胁建模的方法和工具。
STRIDE威胁建模的总体流程:
五、STRIDE的六类威胁与四类元素
在正式开始威胁建模前,我们先来了解STRIDE的六类威胁和数据流图中的四类元素。
5.1 六类威胁
STRIDE是从攻击者的角度,把威胁划分成6个类别,分别是Spooling(仿冒)、Tampering(篡改)、Repudiation(抵赖)、InformationDisclosure(信息泄露)、Dos(拒绝服务)和Elevation of privilege (权限提升)。
为什么划分这6类,这与信息安全三要素和信息安全基本的三个属性相关。
信息安全三要素 |
信息安全三属性 |
保密性 |
认证 |
完整性 |
鉴权 |
可用性 |
审计 |
表:六类威胁与信息安全三要素、三属性的对应关系
威胁 |
安全属性 |
定义 |
举例 |
仿冒(S) |
认证 |
冒充人或物 |
冒充其他用户账号 |
篡改(T) |
完整性 |
修改数据或代码 |
修改订单信息 |
抵赖(R) |
审计 |
不承认做过某行为 |
不承认修改行为 |
信息泄露(I) |
保密性 |
信息被泄露或窃取 |
用户信息被泄露 |
拒绝服务(D) |
可用性 |
消耗资源、服务可不用 |
DDOS导致网站不可用 |
权限提升(E) |
授权 |
未经授权获取、提升权限 |
普通用户提升到管理员 |
随着全球对隐私保护重视程度的加大,隐私安全也成了产品的一个重要威胁,因此STRIDE的6个威胁也添加了一项隐私(Privacy),也就变成了ASTRIDE,A代表Advanced。
5.2 四类元素
我们在来了解下四类元素,STRIDE威胁建模的第一步就是绘制数据流图,数据流图是由【外部实体】、【处理过程】、【数据存储】、【数据流】这四类元素组成。STRIDE威胁建模的核心就是使用这四类元素绘制数据流图,然后分析每个元素可能面临的上述六类威胁,针对这些威胁制定消减方法。
四类元素的介绍如下:
1. 外部实体
系统控制范围之外的用户、软件系统或者设备。作为一个系统或产品的输入或输出。在数据流图中用矩形表示外部实体。
2. 处理过程
表示一个任务、一个执行过程,一定有数据流入和流出。在数据流图中用圆形表示。
3. 数据存储
存储数据的内部实体,如数据库、消息队列、文件等。用中间带标签的两条平行线表示。
4. 数据流
外部实体与进程、进程与进程或者进程与数据存储之间的交互,表示数据的流转。在数据流图中用箭头表示。
使用以上四个元素绘制完数据流图后,还需要引入信任边界,安全的本质就是信任问题,信任边界往往就是攻击发起的地方。在数据流图中可以用红色的虚线隔离出信任边界。
如下是一个比较简单的数据流图演示:
六、STRIDE四类元素与六类威胁的对应关系
具体的对应关系如下图所示,并不是每个元素都会面临6个威胁,比如外部实体只有仿冒和抵赖两类威胁,我们不用关心外部实体会不会被篡改、会不会发生信息泄露、以及拒绝服务等,因为外部实体本来就是我们控制范围之外的。
其中进程(处理过程)会面临全部的6个威胁,数据存储中Repudiation(抵赖)是红色,表示只有存储的数据是审计类日志才会有抵赖的风险,存储其他数据的时候无抵赖。
七、威胁建模的整体流程
通过上面的介绍,我们已经了解了四个元素和六个威胁,STRIDE威胁建模的总体流程:
7.1 微软威胁建模工具
微软发布了STRIDE威胁建模工具,提供免费下载,因为使用便利性、威胁攻击库等原因,微软建模工具不见得可以直接拿来在企业内推广使用。
下载地址:https://docs.microsoft.com/en-us/azure/security/azure-security-threat-modeling-tool
7.1.1 安装过程:
7.1.2 工具首页:
7.1.3 Create A Model(绘制数据流图)
7.1.4 威胁分析模式
进入分析模式后,数据流图下方会自动弹出很多的威胁以及建议,如下图所示:
可以在Justification里面填写相关的消减举措。
7.1.5 导出报告
7.2 绘制数据流图
介绍微软威胁建模工具的时候也可以看到,绘制数据流图就是用上面所介绍的【外部实体】、【处理过程(进程)】、【数据存储】、【数据流】把系统(产品)的数据流转图画出来。这个工作需要开展威胁建模工作的人对产品有比较深入的了解,如果有遗漏可能就会导致威胁分析不全,具体在做的过程中可以把产品架构图拿来参考,如果是新上线的重要且复杂度较高的产品,也可以由产品经理、研发、安全坐在一起完成。
7.3 分析威胁
根据绘制的数据流图,按照元素与威胁对应表,分析所有元素可能遇到的威胁。这部分工作对威胁分析人员的安全能力要求很高,如果威胁分析不全,则风险就会被带到线上。而且威胁建模工作不仅仅是安全人员在架构评审时去做,更应该是产品经理在产品设计阶段需要完成,这就要求非安全人员要具备较高的安全能力。所以,企业一般需要借助威胁建模工具去辅助进行威胁分析。
威胁建模工具需要具备两个库,一个是威胁分析阶段使用的《威胁库》,一个是制定消减措施阶段使用的《消减措施库》。这里的《威胁库》可以分为两类,一类就是各种威胁,比如绕过认证、获取口令、破解口令等等,还有一类是合规,各类法律法规的要求,比如隐私声明、企业内部要求等。
当我们在数据流图上面选中某个元素进行威胁分析时,威胁建模工具可以自动的把这个元素可能涉及的威胁列出来,让分析人员去选择,并针对选择的威胁给出一定的消减措施提醒,这样便可以降低对分析人员的能力要求。
威胁分析举例,用户通过浏览器登录web网站,用户就是一个外部实体,面临的威胁包括仿冒和抵赖。
仿冒威胁分析:
1. 【威胁】攻击者仿冒用户登录网站
【消减措施】增加认证功能,通过用户名+密码的方式认证,暂不使用双因素、短信、指纹等其他认证方式
2. 【威胁】攻击者绕过当前的认证方式,仿冒用户登录
【消减措施】:
2.1 增加图形验证码防暴力破解
2.2 密码增加复杂度要求,防暴力破解
2.3 认证错误返回统一提示,防止checkUser
2.4 确保密码重置、密码找回逻辑的安全,谨防绕过
3. 【威胁】攻击者通过中间人窃取用户密码
【消减措施】:
3.1 登录请求走HTTPS
3.2 开启HSTS
3.3 确保SSL证书安全,算法套中使用的是安全的算法
3.4 密码传输前先做一次加密或哈希
4. 【威胁】攻击者窃取正常用户的会话,仿冒用户登录web网站
【消减措施】:
4.1 长度大于24位,通过安全随机数生成
4.2 登录前后强制改变会话
4.3 限制会话过期时间
不在一一列举,总之把可能遇到的威胁列到《威胁库》,让威胁建模人员选择涉及的威胁并确认消减措施。同时,需要认识到威胁库是需要动态更新的一个过程,消减措施也要遵循安全设计的基本原则,如纵深防御、授权最小化、默认安全,满足安全基本原则的消减措施,才可能让产品更安全、抵御更多的攻击。
上述所列举的所有消减措施都是安全需求,最终输出一份威胁建模报告,研发人员在开发阶段需要参考威胁建模报告,把这些全部需求实现。SDL代码评审阶段也可以参考威胁建模报告对研发人员的实现情况进行正向和逆向测试。
7.4 风险评估
风险=影响*可能性
利用风险评估方法,为识别的威胁进行风险定级,根据企业实际情况,确认哪些级别的风险必须规避、哪些级别的风险可以消减后遗留。
7.5 制定、落实消减措施
制定威胁消减措施,并落入软件安全开发生命周期,确保措施有效落地执行。
常见的消减措施如下:
威胁 |
消减措施 |
仿冒 |
身份管理、认证(密码认证、单点登录、双因素、证书认证)、会话管理 |
篡改 |
完整性校验、访问控制 |
抵赖 |
安全管理、安全审计、监控 |
信息泄露 |
敏感信息保护、数据加密、访问控制 |
拒绝服务 |
负载均衡 防DDOS |
权限提升 |
授权,最小化 |
八、 一点关于威胁建模面临的困境与对策的思考
威胁建模在企业经常面临落地、推广困难的问题,主要原因有以下几方面:
1. 流程复杂,耗费时间
2. 人员能力要求高
3. 需要开发威胁建模工具、维护威胁库、消减库
威胁建模是一个结构化的分析方法,目的是尽可能多的识别产品风险,正因为要把风险尽可能识别全,所以面临流程复杂,花费时间多、推广困难的困境。
企业可以根据自己的实际情况做调整和优化,找到平衡点,比如:
1. 以产品维护控制范围
1.1 新产品一般周期研发、上线比较长,可以预留威胁建模时间
1.2 重要系统的重要功能要求开展威胁建模
1.3 其他产品和功能不做要求
2. 以风险角度控制范围
2.1 对暴露在信任边界的元素开展威胁建模
2.2 对暴露到公网的元素开展威胁建模
2.3 优化威胁库,仅保留风险级别比较高的威胁
3. 优化威胁建模工具
通过工具降低对威胁建模人员的能力要求,提高威胁建模效率,减少时间。