威胁建模STRIDE框架
- 1.威胁建模框架概述
- 2.STRIDE威胁建模框架
- 欺骗 - 冒充某人或某物
- 篡改 - 未经授权更改数据
- 否认性 - 不宣称对执行的操作负责
- 信息泄露 - 查看不应查看的数据
- 拒绝服务 - 系统繁忙
- 权限提升 - 拥有本不应该拥有的权限
- 3.后续的威胁发现
1.威胁建模框架概述
威胁建模框架可帮助你生成潜在威胁的列表,并找到降低或消除风险的方法。
引入威胁建模框架目的是在开发生命周期的早期尽可能多地发现并修复问题。 等待时间越长,客户的风险就越高
一般使用 STRIDE 框架中的六个主要威胁类别来发现安全设计问题:
类别 | 说明 |
---|---|
欺骗 | 冒充某人或某物 |
篡改 | 未经授权更改数据 |
否认性 | 不宣称对执行的操作负责 |
信息泄露 | 未经许可查看数据 |
拒绝服务 | 系统繁忙 |
权限提升 | 拥有本不应该拥有的权限 |
每个威胁类别都与安全控制关联,如下:
类别 | 安全控制 | 描述 |
---|---|---|
欺骗 | 身份验证 | 其身份是否如其所述 |
篡改 | 完整性 | 防止恶意修改数据 |
否认性 | 不可否认性 | 操作与用户绑定 |
信息泄露 | 机密性 | 保护数据免遭意外泄露 |
拒绝服务 | 可用性 | 系统适当处理所有请求 |
特权提升 | 授权 | 用户拥有执行请求的适当权限 |
2.STRIDE威胁建模框架
欺骗 - 冒充某人或某物
当恶意人员或程序成功地冒充用户或系统进行恶意活动时,就会发生欺骗。
示例包括:
1、案例1:在同一台机器上假冒一个进程或文件
如果一个攻击者在你的代码运行之前预先创建了特定的文件,而你的代码也需要创建同名的文件,那么你的代码可能会意外地使用攻击者创建的文件。这种情况下,攻击者可以控制该文件的内容,从而可能导致数据被误认为是由你的代码生成的,从而被信任和处理。
假设你的代码在 /tmp 目录下创建一个文件 data.txt 用于存储重要数据:
File file = new File("/tmp/data.txt");
if (!file.exists()) {file.createNewFile();
}
// 后续对文件进行读写操作
如果攻击者在你的代码运行之前,已经创建了 /tmp/data.txt 并写入了恶意数据,那么你的代码可能会使用这个文件,误以为这是你创建的文件,从而信任并处理该数据。
同样的,如果管道、本地过程调用(IPC)等用于进程间通信的文件权限没有被很好地管理,攻击者可能接管这些通信端点,欺骗或干扰与这些端点通信的进程。
假设你的代码使用 Unix 域套接字与另一个进程通信,并且套接字文件位于 /tmp 目录下:
ServerSocketChannel serverChannel = ServerSocketChannel.open();
serverChannel.socket().bind(new UnixDomainSocketAddress("/tmp/socket"));
如果没有正确设置文件权限,攻击者可以在 /tmp 目录下创建同名的套接字文件并接管通信。这样,攻击者就可以接收和发送数据,伪装成合法的通信方,欺骗你的进程。
2、案例2:假冒一台机器
ARP欺骗
攻击者在本地网络中可以发起假冒ARP(地址解析协议)请求。ARP用于将IP地址映射到物理MAC地址,攻击者可以通过发送伪造的ARP响应来篡改ARP缓存,从而将流量重定向到攻击者的设备上。
IP欺骗
攻击者可以伪造IP数据包,使其看起来像是来自另一个合法的IP地址。这种技术常用于拒绝服务(DoS)攻击或绕过基于IP地址的访问控制。
DNS欺骗
攻击者可以伪造DNS响应,篡改域名解析结果
正向DNS查询攻击:攻击者假冒DNS服务器,向客户端返回伪造的IP地址。
影响:用户被重定向到攻击者控制的恶意网站。
反向DNS查询攻击:攻击者篡改反向DNS记录,使某个IP地址解析为虚假的域名。
影响:误导性解析结果可能被用于欺骗或绕过安全措施。
中间人攻击
一旦攻击者成功假冒了一台机器,他们可以充当中间人,在客户端和服务器之间拦截并篡改通信。这种攻击可以导致信息泄露、数据篡改和身份认证信息的窃取
钓鱼攻击
攻击者发送伪装成合法机构(如银行)的电子邮件或创建伪造的网站。当用户点击链接并输入身份认证信息,这些信息会被发送到攻击者控制的服务器。
3、案例3:人员假冒
人员假冒 指的是攻击者伪装成其他人,通常包括两种主要形式:
- 进入某人的账户:攻击者获取并使用别人的账户凭证(如用户名和密码),从而以该账户的身份进行操作。
- 使用别人的账户进行伪装:攻击者创建虚假的账户,冒充某个真实存在的个人或机构,进行欺诈、操控或其他恶意活动。
在威胁建模数据流关系图中可能面临欺骗攻击风险的元素和交互是:
名称 | 交互 | 定义 |
---|---|---|
过程 <-> 过程 | 一个任务从任务接收数据或向任务发送 | |
过程 <-> 数据存储 | 一个任务向数据存储发送数据或从数据存储接收数据 | |
过程 <-> 外部实体 | 一个任务向外部实体发送数据或从外部实体接收数据 |
那么,如何防止欺骗攻击?主要的方案是使用身份验证验证用户和系统的身份是否属实
示例包括:
- 发送和接收使用数字签名进行签名的消息,以验证来源并确保消息完整性。
- 使用 SSL/TLS 保护数据传输,以加密信息源和目标之间的流量。
- 使用具有时效有限的令牌、密码或多重身份验证的唯一凭据来帮助保护用户、管理员和服务帐户。
用于降低或消除风险的常用安全控制:
对于数据:
- 哈希
- 消息验证码
- 数字签名
对于系统:
- 用户身份验证
- Cookie 身份验证
- Kerberos
- SSL/TLS
- 证书
- IPSec
- 数字签名的数据包
IPSec(Internet Protocol Security)是一种网络安全协议,用于在IP网络上提供加密和认证服务。通过使用IPSec隧道,可以保护跨终结点的通信,确保数据在传输过程中不被窃听、篡改或伪造
IPSec隧道是通过在两个终结点之间建立一个加密的“隧道”来保护通信的。这两个终结点可以是路由器、防火墙、VPN网关或主机等设备。IPSec隧道主要使用以下两个协议来实现安全通信:
- AH(Authentication Header):提供数据包的完整性和源认证,但不加密数据。它确保数据在传输过程中未被篡改,并验证数据包的发送者身份。
- ESP(Encapsulating Security Payload):提供数据加密、完整性校验和认证功能。ESP不仅能验证数据包的完整性和身份,还能加密数据,确保数据的机密性。
篡改 - 未经授权更改数据
当恶意攻击者未经授权在系统中读取、修改、删除或插入数据时,就会发生篡改。
案例包括:
1、案例1:篡改文件
文件篡改
文件篡改指的是攻击者利用对文件的写入权限,恶意修改文件内容。这种攻击可以发生在多种环境下,包括本地磁盘和远程共享文件。
如果你的代码依赖于某些文件,而这些文件的写入权限被不受信任的用户或程序所控制,那么这些文件可能被篡改。攻击者可以修改文件内容来改变程序的行为或引入漏洞。
如果文件通过网络共享(例如在Web应用中,JavaScript文件可能来自远程源),攻击者可以通过破坏共享源或中间人攻击篡改文件。这可能导致恶意代码注入或其他安全问题。
链接和重定向篡改
指的是攻击者通过修改链接或重定向设置来干扰程序的正常操作。这通常涉及到篡改网页上的链接、重定向规则或其他形式的跳转。
缓存污染攻击
缓存污染攻击是指攻击者利用缓存机制的漏洞,将恶意数据插入到缓存中,从而影响后续的请求和响应。
2、案例2:篡改内存
当数据在函数或方法中按引用传递时,实际上是传递了数据的内存地址而不是数据的副本。这种方式通常用于提高性能,但也会带来安全风险。
如果攻击者能够访问或修改传递的数据的引用,他们可以在安全检查之后改变数据内容,从而影响程序的行为或绕过安全防护。
假设你有一个函数处理用户提交的数据:
public void processData(UserData data) {// 执行一些安全检查if (isValid(data)) {// 处理数据data.modify(); // 这里 data 是按引用传递的}
}
在这种情况下,如果攻击者能够访问 data 的引用,他们可以在 isValid 检查之后直接修改 data 对象,从而绕过检查
3、案例3:篡改网络
网络篡改是指攻击者通过控制网络流量来修改数据,这包括中间人攻击、数据包篡改和注入攻击。随着无线通信技术的发展,特别是SDR(软件定义无线电是一种无线通信技术,它利用软件而不是硬件来处理无线信号)的出现,攻击者能够更容易地拦截和篡改无线数据流。(现代SDR单元价格相对较低,使得更多的攻击者能够使用这种技术进行恶意操作,攻击者可以通过SDR分析和破解无线协议,从而获取或修改传输的数据)
在威胁建模数据流关系图中可能面临篡改攻击风险的元素和交互是:
名称 | 交互 | 定义 |
---|---|---|
过程 <-> Data store 数据存储 | 一个任务向数据存储发送数据或从数据存储接收数据 | |
数据流 <-> 信任边界 | 通过 Internet 将数据从受信任的环境传输给某人(反之亦然) |
那么,如何防止篡改攻击?
示例包括:
- 验证输入以防止处理恶意的数据
- 使用数字签名对消息进行签名,以确保消息不被篡改
- 使用访问控制列表应用权限
- 使用 SSL/TLS 保护传输
- 创建 IPSec 隧道,以保护终结点之间的通信
用于降低或消除风险的常用安全控制有:
- 操作系统完整性控制
- 访问控制列表 (ACL)
- 数字签名
- 消息验证码
否认性 - 不宣称对执行的操作负责
当有人出于恶意或无意采取某个操作,但他不承认时就会发生否认性威胁
示例包括:
- 拒绝承认修改了包含敏感操作的日志。
- 使用其他人的帐户以避免被抓。
- 声称没有删除数据库记录。
系统日志是攻击者的金矿,不仅可用于操纵,还可用于收集有关用户、环境和弱点的数据。
可能面临否认性攻击风险的元素和交互:
名称 | 交互 | 定义 |
---|---|---|
过程 <-> 过程 | 一个任务向其他任务发送数据或从其他任务接收数据 | |
过程 <-> 外部实体 | 一个任务向用户发送数据或从用户接收数据 | |
过程 <-> 数据存储 | 一个任务向数据存储发送数据或从数据存储接收数据 |
那么,如何防止否认性威胁?
一般来讲,不可否认性通过创建和保护安全日志来确保每个操作都可以追溯到其来源。
用于降低或消除风险的常用安全控制:
- 强身份验证
- 安全日志记录和监视
- 数字签名
- 安全时间戳
信息泄露 - 查看不应查看的数据
向未经授权的个人公开敏感数据时,会发生信息泄漏。 无论是在有意或无意的情况下,都有可能发生信息泄露。
示例包括:
1、案例1:进程信息泄露
进程信息泄露是指攻击者通过各种途径获取关于正在运行的进程的敏感信息。这种泄露可能会导致系统安全性严重下降。以下是一些常见的泄露方式及其影响
泄漏内存地址
攻击者通过泄露进程的内存地址,可以获得关于进程内存布局的信息。这种信息对绕过一些防御机制(如地址空间布局随机化 ASLR)尤其重要,ASLR 是一种安全机制,它通过随机化进程的内存地址布局来阻止攻击者猜测地址。泄露内存地址可能使攻击者能够绕过 ASLR,从而进行精确的攻击。如果攻击者知道了内存中某个函数的确切位置,他们可以利用这点来执行代码注入攻击。
泄露秘密信息
泄露包括但不限于数据库连接字符串、密码口令等敏感信息,这些信息的泄露可能导致进一步的攻击。
泄露设计细节
泄露系统设计的细节(如反欺诈规则)可以帮助攻击者理解系统的防御机制,从而找到绕过这些机制的方法
2、案例2:数据存储信息泄露
不合理的安全机制使用
如果文件或目录的权限设置不当,可能导致未授权的用户访问敏感数据。例如,公开可读的文件或目录可能被任何人访问
加密密钥泄露
加密密钥是保护数据的核心。如果加密密钥泄露,攻击者可以解密保护的数据,从而访问敏感信息
文件名泄露
文件名本身可能包含敏感信息。例如,一个名为“2013年5月裁员/Alice辞退信.docx”的文件,文件名就透露了文件内容的信息
程序和系统的敏感数据
日志、临时文件和交换区:这些存储区域可能会包含敏感数据。如果没有正确保护,攻击者可以从中提取信息
操作系统和用户设备的安全性
如果攻击者可以控制用户的操作系统,他们可以从设备中提取敏感数据
数据彻底删除
普通删除操作可能不会彻底清除硬盘上的数据,数据可能被恢复。使用专业的数据擦除工具或物理破坏硬盘,确保数据被彻底销毁。
3、案例3:数据流中的信息泄露
数据在网络上传输的风险
当信息在网络上传输时,数据流特别容易遭受信息泄露攻击。攻击者可以通过多种手段截获或读取网络数据流中的信息。攻击者可以利用伪造的网络控制协议将流量重定向到他们自己的设备上,从而查看原本不会传输到他们设备的数据。这种攻击可以在攻击者不在数据流路径上的情况下进行。
共享计算环境的风险
当计算资源在云端共享,或者一台服务器由多个不信任的用户共享时,数据流的安全性面临更高的风险。不同用户可能会互相干扰,或在共享环境中进行信息窃取。即使在单一机器上,如果该机器上有多个用户或进程,也可能存在数据流泄露的风险。例如,恶意用户可能会监视或干扰其他用户的通信。
加密流量的风险
即使数据流量经过加密,攻击者也可能通过其他方式获取信息。例如,攻击者可能会分析加密流量的元数据,或者使用侧信道攻击来推断加密数据的内容。
社交网络分析
攻击者可以通过社交网络分析获取信息,包括查看DNS记录、社交媒体(如LinkedIn)的活动等。这些信息可能帮助攻击者理解目标的行为模式、社交圈以及潜在的攻击路径
可能面临信息泄漏风险的元素和交互:
名称 | 交互 | 定义 |
---|---|---|
过程 -> 过程 | 一个任务将数据发送到另一个任务 | |
过程 <-> 外部实体 | 一个任务向用户发送数据或从用户接收数据 | |
过程 <-> 数据存储 | 一个任务向数据存储发送数据或从数据存储接收数据 | |
数据流 <-> 信任边界 | 通过 Internet 将数据从受信任的环境传输给某人(反之亦然) |
那么,如何防止信息泄露威胁呢?
示例包括:
- 应用访问控制列表,以确保合适的用户可以访问适当的数据。
- 加密静态数据、传输中数据和正在使用的数据。
- 强制实施 SSL/TLS 以保护传输。
- 使用 IPSec 隧道保护跨终结点的通信。
用于降低或消除风险的常用安全控制:
- 加密
- 访问控制列表 (ACL)
拒绝服务 - 系统繁忙
当攻击者导致系统不可用时,将发生拒绝服务。
示例包括:
- 向网络发送大量请求。
- 占用内存和 CPU 进程。
- 请求数量过多导致数据存储崩溃。
拒绝服务攻击的分类:
1、攻击者正在攻击 vs. 持续攻击
- 正在攻击:这是指攻击者在某个时刻进行攻击。例如,攻击者可能通过填满网络带宽或发送大量请求来使系统瘫痪。这种攻击会在攻击者停止攻击时结束,除非系统有持久性漏洞。
- 持续攻击:这种攻击会持续存在,甚至在系统重启后依然能继续攻击。例如,攻击者可能使用
while(1){fork();}
(不断创建进程)来耗尽系统资源,或者填满磁盘空间,使系统无法正常运作。
2、放大型攻击 vs. 非放大型攻击
- 放大型攻击:这种攻击方式是攻击者通过较小的努力产生大的影响。通常,攻击者利用某些服务或协议的特性,使得少量的数据或请求就能对目标造成严重影响。
- 非放大型攻击:这种攻击方式需要攻击者付出更多的努力或资源来对目标造成影响。例如,通过直接耗尽系统资源或带宽进行攻击,可能需要更多的攻击者或资源投入来产生显著效果。
可能面临拒绝服务风险的元素和交互:
名称 | 交互 | 定义 |
---|---|---|
过程 -> 过程 | 一个任务将数据发送到另一个任务 | |
过程 <-> 外部实体 | 一个任务向用户发送数据或从用户接收数据 | |
过程 <-> 数据存储 | 一个任务向数据存储发送数据或从数据存储接收数据 | |
数据流 <-> 信任边界 | 通过 Internet 将数据从受信任的环境传输给某人(反之亦然) |
那么,如何防止拒绝服务攻击呢?
可用性确保系统为用户启动且正常运行。 示例包括:
- 使用网络访问控制列表控制传入和传出的流量,ACLs 可以基于 IP 地址、端口号或协议类型来限制访问,确保只有授权的流量能够进入或离开网络。
- 使用弹性资源管理不断增加或减少的系统资源(根据系统负载自动增加或减少计算资源,或使用负载均衡)。
- 监视系统以检测是否出现异常(使用监控工具如 Prometheus、Grafana、Nagios来实时监测系统性能指标如 CPU 使用率、内存消耗、网络流量等。设置告警以在性能异常时通知管理员)。
- 启用操作系统标志来处理内存和 CPU 进程。(通过操作系统的调度器设置进程优先级,确保关键进程获得足够的 CPU 资源;启用操作系统的内存管理功能如 Linux 的虚拟内存管理)
用于降低或消除风险的常用安全控制:
- 访问控制列表
- 筛选
- 配额
- 授权
- 高可用性
权限提升 - 拥有本不应该拥有的权限
个人未经许可访问资源时,就会发生权限提升。 示例包括:
1、案例1:通过崩溃进程提升权限
崩溃进程通常指的是程序在运行时由于错误或攻击而中断或停止工作。攻击者可能通过触发这些错误来干扰程序的正常操作或利用程序的崩溃状态进行进一步的攻击。
例如:攻击者可能使用粉碎堆栈、利用栈或堆上的数据等技术来实现这些攻击。粉碎堆栈指的是通过溢出或其他手段破坏栈的内容,从而影响程序的控制流或数据流。
攻击者可以通过栈溢出或堆溢出攻击来覆盖程序的控制数据(如返回地址)或数据,导致程序行为异常或执行攻击者的代码。
2、案例2:通过授权失效提升权限
在某些程序中,可能存在路径上的权限检查遗漏,即某些操作在执行之前没有进行适当的权限验证。
如果程序有多个功能模块,其中某些模块在访问资源时没有验证用户的权限,那么攻击者可以利用这些模块进行未授权的操作。比如,一个文件管理程序在某些操作上没有检查用户是否有权限访问特定文件,那么攻击者可能会利用这个漏洞访问或修改不该访问的文件。
可能面临权限提升风险的元素和交互:
名称 | 交互 | 定义 |
---|---|---|
过程 <-> 过程 | 一个任务将数据发送到另一个任务 | |
过程 <- 外部实体 | 任务接收来自用户的数据 | |
过程 <- 数据存储 | 任务接收来自数据存储的数据 |
那么,如何防止权限提升威胁呢?
授权确保用户拥有适当的权限。 示例包括:
- 实现授权机制以验证对数据和资源的权限。
- 应用安全控制,以使用最少的访问权限运行服务。
- 监视访问以检测异常和未经授权的访问尝试。
用于降低或消除风险的常用安全控制:
- 访问控制列表 (ACL)
- 基于角色的访问控制 (RBAC)
- 基于组的访问
- 权限
- 输入验证
3.后续的威胁发现
使用STRIDE对威胁分类后,可以使用威胁树分析程序中的威胁和漏洞
攻击树和攻击库:https://www.yuque.com/dahezhiquan/vyd91w/qornbrccqqf87ayr
用根节点表示系统所面临威胁的抽象描述,逐层细化威胁的细节信息,直到用叶节点表示具体攻击方式
建立威胁树后,就可以对威胁进行量化评估,评定其严重程度,可以使用DREAD方法来完成。
DREAD方法是以下单词的首字母缩写,分别从五个方面描述威胁的危害程度
在 DREAD 模型里,每个因素都可以分为高、中、低三个等级,分别用 3、2、1 的分数代表其权重值,可以具体计算出某一个威胁的风险值
等级 | 高(3) | 中(2) | 低(1) |
---|---|---|---|
Damage Protential | 获取完全验证权限;执行管理员操作;非法上传文件 | 泄露敏感信息 | 泄露其他信息 |
Reproducibility | 攻击者可以随意再次攻击 | 攻击者可以重复攻击,但有时间限制 | 攻击者很难重复攻击过程 |
Exploitability | 初学者在短期内能掌握攻击方法 | 熟练的攻击者才能完成这次攻击 | 漏洞利用条件非常苛刻 |
Affected users | 所有用户,默认配置,关键用户 | 部分用户,非默认配置 | 极少数用户,匿名用户 |
Discoverability | 漏洞很显眼,攻击条件很容易获得 | 在私有区域,部分人能看到,需要深入挖掘漏洞 | 发现该漏洞极其困难 |
DREAD比较主观,会在很多情况下产生奇怪的结果。因此,到2010年,微软 SDL团队不再推荐使用DREAD