安全设计 | 安全设计不得马虎!微软STRIDE威胁建模方法让你事半功倍,快速发现应用安全隐患!

STRIDE威胁建模方法最早发表于2006年11月的《MSDN杂志》,作者是微软的工程师Shawn Hernan、Scott Lambert 、Tomasz Ostwald 和 Adam Shostack。那我们为什么要进行威胁建模? 如何使用数据流图对系统进行威胁建模?如何减轻威胁?接下来本文展开逐一介绍。

1. 安全设计原则

在介绍STRIDE方法前我们需要先了解下安全设计的原则,设计安全软件的一个问题是,不同的群体对安全性的看法不同:

  • 软件开发人员主要从代码质量方面考虑安全性,而网络管理员则考虑防火墙、事件响应和系统管理;
  • 学术界可能主要根据经典的Saltzer和Schroeder设计原则、安全模型或其他抽象概念来考虑安全性。

当然,以上考虑在构建安全系统时都很重要。常用的安全设计原则如下:

原则解释
开放式设计假设攻击者掌握了来源和规格
默认安全系统或软件应默认配置为安全状态,即默认情况下不开启不必要的服务或功能,减少潜在的攻击面
最小权限系统中的每个组件或用户只应拥有完成其任务所需的最小权限集合。这样可以减少潜在的安全风险,因为即使攻击者获取了某些权限,其影响范围也会受到限制
纵深防御在多个层面上实施安全措施,以确保即使一个安全层被攻破,其他层仍能提供保护。这包括物理安全、网络安全、应用安全等多个层面
透明性和可理解性安全机制应尽可能透明,易于理解和操作,以减少人为错误的可能性
经济性安全机制设计尽可能简单短小,从而在排查缺陷、检测漏洞时代码更容易处理
可审计性记录和审计系统活动,以便在发生安全事件时能够追踪和分析。这包括日志记录、监控和报告机制。

安全意味着系统具有机密性、完整性和可用性的特性(即CIA特性),用户得到了正确的身份验证和授权,并且不可否认的。(PS:CIA加上份验证和授权、不可否认下文简称为CIA变体)下图解释了每个属性:

安全属性

确保应用具有这些安全属性的一种方法就是使用STRIDE进行威胁建模,STRIDE 是六个主要威胁类别的首字母缩写:

  • 欺骗(Spoofing):冒充某人或某物
  • 篡改(Tampering):未经授权更改数据
  • 否认(Repediation):不宣称对执行的操作负责
  • 信息泄露(Information Disclosure):在未获得权限的情况下查看数据
  • 拒绝服务(Denial of Service):使系统过载
  • 权限提升(Elevation of Privilege):拥有本不应拥有的权限

STRIDE代表的六种威胁,每种威胁都违反了 “CIA 变体” 的特定属性,具体如下:

威胁与安全属性的映射

2. 威胁建模

2.1. 什么是威胁建模

威胁建模是一种有助于保护系统、应用程序、网络和服务的有效技术。 威胁建模使用以图形形式演示系统工作方式的数据流关系图。 之后,它应用一个框架来帮助你发现和修复安全问题。它可帮助你在开发生命周期的早期确定潜在的威胁和降低风险策略。

威胁建模方法由微软的安全工程和通信小组开发。与SDLC的其他部分一样,威胁建模也在不断发展,并将应用于新的环境中。当创建自己的安全代码开发流程时,这种方法可能会很好地作为基线,实际上很多公司都参照了微软的威胁建模方法制定了自己的基线。

2.2. 为什么要进行威胁建模?

无论你是在构建一个新系统还是更新现有系统,你都需要考虑入侵者如何攻击它,然后在系统的设计和实施阶段建立适当的防御。

微软内部通过一种名为威胁建模的技术来设计安全系统,即对系统设计或体系结构进行系统审查,以发现和纠正设计级别的安全问题。威胁建模是安全开发生命周期中不可或缺的一部分。

3. 威胁建模和STRIDE

威胁建模是Microsoft安全开发生命周期(SDL)的核心元素。这是一种工程技术,可以用来帮助您识别可能影响应用程序的威胁、攻击、漏洞和对策。我们可以使用威胁建模来塑造应用程序的设计,满足公司的安全目标,并降低风险。STRIDE方法是执行威胁建模的理论依据。

为了遵循STRIDE,我们要将系统分解为相关组件,分析每个组件对威胁的易感性,并减轻威胁。然后重复这个过程,直到我们对任何剩余的威胁都感到满意。这时我们才可以认为系统是安全的。

我们无法证明当组件组成一个系统时,对欺骗威胁单独免疫的组件之间的相互作用不易受到欺骗威胁的影响。事实上,只有当系统被连接起来以创建更大的系统时,威胁才会经常出现。

STRIDE威胁建模的流程如下:

  1. 定义安全需求
  2. 绘制数据流图
  3. 识别潜在威胁
  4. 制定缓解措施
  5. 进行安全验证

在这里插入图片描述

3.1. 定义安全需求

需求定义阶段是一个关键步骤,它定义你的应用程序是什么,以及它发布后可用来做什
么。 在需求阶段,就要考虑在你的应用程序中构建的安全控制措施,以确保发布并部署安全的应用程序。

此阶段是考虑基础的安全和隐私问题的最佳时间。 在项目开始时定义可接受的安全和隐
私级别有助于团队:

  • 了解与安全问题相关的风险。
  • 在开发过程中确定和修复安全 bug。
  • 在整个项目中应用确定的安全和隐私级别。

在编写对应用程序的要求时,请确保考虑有助于保护应用程序和数据安全的安全控制措
施。

3.2. 绘制数据流图(DFD)

数据流图(DFD)通常用于以图形方式表示系统,将系统分解为多个部分,并显示每个部分不易受到相关威胁的影响。

DFD 使用由四个元素组成的标准符号集:

  • 数据流
  • 数据存储
  • 过程
  • 交互程序

对于威胁建模,我们还添加了扩展元素:信任边界。下图则显示了这些符号。

在这里插入图片描述

注:

  1. 交互程序是系统的终点:人员、Web服务和服务器。一般来说,它们是系统范围之外的数据提供者和消费者,但显然与系统相关。
  2. 信任边界可能是最主观的:它们代表了可信和不可信元素之间的边界。信任是复杂的,你的牙医会给你牙齿,你的父母会给你零花钱,但你可能不相信你的牙医能给你零花钱。

正确绘制及使用DFD是正确使用威胁模型的关键。

3.3. 识别潜在威胁

需使用数据流图查找针对系统的潜在威胁,STRIDE威胁清单如下:

威胁定义问题威胁示例
欺骗攻击者冒充某人或某物通信的双方是否都通过了身份验证?通过看似合法的帐户向用户发送一封带有恶意链接和附件的电子邮件,以捕获用户的凭据、数据和设备访问权限
篡改攻击者在未经授权的情况下更改数据如何得知某人无法更改传输中的数据、正在使用的数据或静态数据?通过弱 API 调用处理修改内存,导致崩溃和泄漏敏感错误消息
否认攻击者声称尚未执行任何操作每个操作是否可以绑定到标识?声称没有删除数据库记录
信息泄露攻击者看到了不应看到的数据如何得知某人无法看到传输中的数据、正在使用的数据或静态数据?访问安全控制较弱的未授权文档和文件夹
拒绝服务攻击者使你的系统崩溃系统中是否存在资源受限的区域?向网络发送大量请求
权限提升攻击者未经授权而可访问数据如何得知某人可以执行此操作?利用输入处理逻辑或内存中的弱点来提取数据

数据流图中的每个元素(处理过程、数据存储、数据流和外部交互)都有一组易受威胁的因素,如下表所示:

元素仿冒篡改否认信息泄露拒绝服务权限提升
数据流XXX
数据存储XXX
处理过程XXXXXX
外部交互XX

3.4. 制定缓解措施

在此阶段,需要决定如何处理所有威胁。 每个 STRIDE 威胁都对应到一项或多项安全控制,这些控制措施提供不同的功能和操作类型。

威胁安全控制安全控制示例
欺骗身份验证发送和接收使用数字签名进行签名的消息,以验证来源并确保消息完整性
篡改完整性验证输入以防止处理恶意有效负载和错误处理意外行为
否认不可否认性创建和保护包含用户操作和时间戳的安全日志
信息泄露机密性应用访问控制列表,以确保合适的用户可以访问适当的数据
拒绝服务可用性使用弹性资源管理不断增加或减少的使用量
权限提升授权使用最少的访问量运行服务

可能有可以立即减少或完全消除多个威胁的安全控制。 例如,使用 SSL/TLS 创建安全传输通道,以帮助防止恶意数据修改或泄露。

在上一阶段(识别潜在威胁)中发现的问题,可以使用以下其中一个解决方案。 它们在不同组织之间存在略微差异:

解决方案描述
减轻通过使用 bug 修复或重新设计来减轻或消除威胁影响和严重性。
转移将问题分配给另一个系统或团队。
消除去除系统中包含问题的部分。
接受在没有解决方法的情况下接受风险。 此解决方案需要授权风险决策者的批准。 此决定可能基于威胁严重性。 严重威胁可能需要高级领导的批准,而深层防御风险可能需要高级工程师批准。 与你的团队交流以获得战略指导。

3.5. 进行安全验证

验证阶段是威胁建模过程的最后一步,通常发生在部署系统之前。 它涉及到确保满足要求、验证假设以及准备好安全控制。

3.5.1. 验证要求和设置默认值

首先,验证是否满足第一阶段创建的所有要求。

示例:

  • 网络安全计划
  • 机密管理解决方案实施
  • 日志记录和监视系统
  • 标识和访问控制

然后,确保更改云提供商、操作系统和组件的默认配置设置,以满足所有安全要求。

3.5.2. 执行验证

执行验证会涉及运行手动和自动验证。 在微软内部,系统在部署前要执行一个验证流程。 该流程可能包括自动扫描程序、代码评审和渗透测试。 可以在每次部署之前或隔一定的时间(如每 6 - 12 个月)强制执行该过程。

4. 结论

设计安全的软件可能很困难,但与任何挑战一样,一个好的策略是将问题分解为更容易解决的较小部分。对于高风险活动,将STRIDE模型与威胁建模结合使用就是这样一种方法。微软内部的许多团队中已经使用了这个模型。

在开发安全软件时,建议将威胁建模作为流程的关键部分,特别是本文中介绍的STRIDE模型。但关键是要找到一种适合你的方法,在设计的早期应用它,记住任何组件都可能失败,并进行必要的研究,以确保你已经考虑到已知的攻击模式。

最后,设计只是构建安全软件的一部分。执行支持、实施、测试、构建和交付以及服务和维护都在系统的最终安全性方面发挥着至关重要的作用。

若大家对微软的SDL安全开发生命周期感兴趣,可以深入学习如下两篇文档:

  • 微软SDL安全开发生命周期总体介绍.pptx(共26页,访问密码:6277)
  • 微软安全开发生命周期详细指导文档.pdf (共285页,访问密码: 6277)

5. 参考链接

  • uncover-security-design-flaws-using-the-stride-approach
  • https://www.microsoft.com/en-us/securityengineering/sdl/threatmodeling
  • https://learn.microsoft.com/zh-cn/training/modules/tm-introduction-to-threat-modeling/4-step-3-fix-phase

推荐阅读:

  • 安全设计 | 68家国内外科技巨头和安全巨头参与了CISA发起的安全设计承诺,包含MFA、默认密码、CVE、VDP等七大承诺目标
  • 安全设计 | Microsoft 威胁建模工具Threat Modeling Tool安装、使用及威胁生成原理详解(文末附样例)

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/644217.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构(邓俊辉)学习笔记】二叉树04——Huffman树

文章目录 0. 概述1. 无前缀冲突编码2. 编码成本3. 带权编码成本4. 编码算法5. 算法实现流程6. 时间复杂度与改进方案 0. 概述 学习Huffman树。 1. 无前缀冲突编码 在加载到信道上之前,信息被转换为二进制形式的过程称作编码(encoding)&…

java: 无法访问org.springframework.ldap.core.LdapTemplate

完整错误: java: 无法访问org.springframework.ldap.core.LdapTemplate错误的类文件: /E:/apache-maven-3.6.3/repository/org/springframework/ldap/spring-ldap-core/3.2.3/spring-ldap-core-3.2.3.jar!/org/springframework/ldap/core/LdapTemplate.class类文件具…

【Qt 学习笔记】Qt窗口 | 工具栏 | QToolBar的使用及说明

博客主页:Duck Bro 博客主页系列专栏:Qt 专栏关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ Qt窗口 | 工具栏 | QToolBar的使用及说明 文章编号:Qt 学习…

Android14 - 绘制系统 - 概览

从Android 12开始,Android的绘制系统有结构性变化, 在绘制的生产消费者模式中,新增BLASTBufferQueue,客户端进程自行进行queue的生产和消费,随后通过Transation提交到SurfaceFlinger,如此可以使得各进程将缓…

Golang | Leetcode Golang题解之第111题二叉树的最小深度

题目&#xff1a; 题解&#xff1a; func minDepth(root *TreeNode) int {if root nil {return 0}queue : []*TreeNode{}count : []int{}queue append(queue, root)count append(count, 1)for i : 0; i < len(queue); i {node : queue[i]depth : count[i]if node.Left …

软件项目详细设计说明书实际项目参考(word原件下载及全套软件资料包)

系统详细设计说明书案例&#xff08;直接套用&#xff09; 1.系统总体设计 2.性能设计 3.系统功能模块详细设计 4.数据库设计 5.接口设计 6.系统出错处理设计 7.系统处理规定 软件开发全文档下载&#xff08;下面链接或者本文末个人名片直接获取)&#xff1a;软件开发全套资料-…

转行一年了

关注、星标公众号&#xff0c;直达精彩内容 ID&#xff1a;技术让梦想更伟大 整理&#xff1a;李肖遥 来公司一年了。 说是转行其实还是在半导体行业&#xff0c;熟悉我的朋友知道 &#xff0c;我在18年开始进入半导体行业&#xff0c;那个时候想着行业很重要&#xff0c;站对了…

高校网站群及融媒体中心建设方案

一、项目背景 随着信息技术的飞速发展&#xff0c;互联网已成为高校展示形象、传播信息、服务师生、沟通社会的重要渠道。然而&#xff0c;目前许多高校在网站建设和媒体传播方面存在以下问题&#xff1a; 网站分散、缺乏统一规划&#xff1a;各高校内部往往存在多个部门或学院…

常见 JVM 面试题补充

原文地址 : 26 福利&#xff1a;常见 JVM 面试题补充 (lianglianglee.com) CMS 是老年代垃圾回收器&#xff1f; 初步印象是&#xff0c;但实际上不是。根据 CMS 的各个收集过程&#xff0c;它其实是一个涉及年轻代和老年代的综合性垃圾回收器。在很多文章和书籍的划分中&…

springboot里面自带的测试用法

1. 依赖项配置 首先&#xff0c;确保你的 pom.xml 或 build.gradle 文件中包含必要的依赖项。以下是 Maven 配置示例&#xff1a; <dependencies><!-- Spring Boot Starter Test --><dependency><groupId>org.springframework.boot</groupId>&l…

TypeScript-函数类型

函数类型 指给函数添加类型注解&#xff0c;本质上就是给函数的参数和返回值添加类型约束 function add(a: number,b: number) :number {return a b } let res: number res add(2 3) // 函数参数注解类型之后&#xff0c;不但限制了参数的类型还限制了参数为必填 优点&…

【Flutter】有状态组件StatefulWidgetScaffold组件属性

&#x1f525; 本文由 程序喵正在路上 原创&#xff0c;CSDN首发&#xff01; &#x1f496; 系列专栏&#xff1a;Flutter学习 &#x1f320; 首发时间&#xff1a;2024年5月26日 &#x1f98b; 欢迎关注&#x1f5b1;点赞&#x1f44d;收藏&#x1f31f;留言&#x1f43e; 目…

HTML静态网页成品作业(HTML+CSS)——企业酒店官网网页(5个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有5个页面。 二、作品演示 三、代…

vue3 <script setup> 语法糖时间组件

<template><div><p>当前时间Current Time: {{ currentTime }}</p></div> </template><script setup> import { ref, onBeforeUnmount, onMounted } from vueconst currentTime ref()let interval // 声明 interval 变量const getTo…

ArcGIS提取含有计曲线的等高线

喜欢就关注我们吧&#xff01; 今天我么来看看&#xff0c;如何利用DEM提取含有计曲线的等高线&#xff01; 常规的话我们利用DEM提取的等高线都是不带计曲线的&#xff0c;无法把计曲线标注出来&#xff0c;今天我们就来看下&#xff0c;如何处理一下哦&#xff01;提取带有计…

uni-app 微信 支付宝 小程序 使用 longpress 实现长按删除功能,非常简单 只需两步

1、先看效果 2、直接上代码 ui结构 <view class"bind" longpress"deleteImage" :data-index"index"><view class"bind_left">绑定设备</view><view class"bind_right"><view class"bind_t…

gdc2024:Raytracing in Snowdrop技术实现与性能优化策略

在今年的GDC&#xff08;游戏开发者大会&#xff09;的Advanced Graphics Summit上&#xff0c;关于Snowdrop引擎中光线追踪技术的讨论引起了广泛关注。 一、光线追踪全局照明的实现细节 屏幕空间追踪&#xff1a; 屏幕空间追踪从相机出发&#xff0c;对屏幕上的每个像素点生成…

x264 码率控制中实现 VBV 算法源码分析

关于 VBV 的解释与原理可以参考x264 码率控制 VBV 原理。 x264中 VBV 算法执行的流程 vbv 参数配置相关函数 x264_param_default函数 功能:编码参数默认设置,关于 vbv的参数的默认设置;函数内vbv相关代码:/* ... */ //代码有删减 param->rc.i_vbv_max_bitrate = 0; par…

Java的类和对象

Java的类和对象 前言一、面向过程和面向对象初步认识C语言Java 二、类和类的实例化基本语法示例注意事项 类的实例化 三、类的成员字段/属性/成员变量注意事项默认值规则字段就地初始化 方法static 关键字修饰属性代码内存解析 修饰方法注意事项静态方法和实例无关, 而是和类相…

Pytorch深度学习实践笔记5

&#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &#x1f4cb;个人专栏&#xff1a;pytorch深度学习 &#x1f380;CSDN主页 发狂的小花 &#x1f304;人生秘诀&#xff1a;学习的本质就是极致重复! 视频来自【b站刘二大人】 目录 1 Linear Regress…