威胁建模入门:STRIDE模型详解、数据流图绘制方法、识别信任边界

威胁建模这件事,说白了就是在系统还没写一行代码之前,先把自己想象成攻击者,到处找茬。我见过太多团队,上线前一天才做安全测试,结果发现架构级漏洞,改都改不动。所以,咱们得把安全左移——移到设计阶段。

这一章,我会带你走完威胁建模的三个核心动作:画图、找威胁、划边界。工具就是STRIDE模型和数据流图(DFD)。

2.1 STRIDE模型:六类威胁,一个不漏

STRIDE是微软提出来的威胁分类法。每个字母代表一类威胁。为什么要分类?因为不同威胁的缓解措施完全不同。你想想看,防篡改和防信息泄露,用的技术能一样吗?

威胁类型 英文 核心问题 典型例子
S 欺骗 Spoofing 攻击者能否冒充他人身份? 伪造JWT Token、盗用Session
T 篡改 Tampering 数据或代码能否被非法修改? SQL注入修改数据库、中间人改请求体
R 抵赖 Repudiation 用户能否否认做过某操作? 无审计日志、日志被删
I 信息泄露 Information Disclosure 敏感数据能否被未授权访问? API返回明文密码、日志打印身份证号
D 拒绝服务 Denial of Service 系统资源能否被耗尽? CC攻击、未限流的文件上传
E 权限提升 Elevation of Privilege 普通用户能否获得管理员权限? 水平越权、垂直越权
我的小技巧: 每次做威胁建模,我都拿STRIDE当检查清单,对着数据流图一个一个过。别凭感觉想,要对着图看。漏掉一个,可能就是上线后的一个漏洞。

2.2 数据流图(DFD):把系统画出来,威胁才看得见

数据流图是威胁建模的“地图”。没有地图,你连敌人在哪都不知道。我个人习惯用分层DFD,从上下文图开始,逐步细化到内部流程。

2.2.1 DFD的四个基本元素

  • 外部实体(矩形):用户、第三方系统、定时任务。这些是数据的起点或终点。
  • 过程(圆形/圆角矩形):处理数据的逻辑单元,比如登录服务、支付模块。
  • 数据存储(两条平行线):数据库、缓存、文件系统。
  • 数据流(箭头):数据在元素之间的流动方向。

嗯,这里要注意:数据流必须标注内容。别只画个箭头写个“数据”,要写清楚是“用户凭证”、“订单信息”还是“日志记录”。

2.2.2 绘制步骤

  1. 画上下文图:把整个系统画成一个过程,外面画外部实体。这一步看清系统边界。
  2. 分解核心过程:把系统内部拆成子过程。比如“订单服务”拆成“创建订单”、“支付处理”、“库存扣减”。
  3. 标注数据流:每一条线上写清楚传输的数据内容。
  4. 标记信任边界:用虚线框出不同信任等级的区域。
避坑指南: 我曾经在一个项目中,团队画DFD只画了外部实体和过程,完全没画数据存储。结果威胁建模时,所有人都忽略了数据库的篡改风险。后来上线第一天就被拖库了。所以,数据存储必须画出来,哪怕你觉得它“不重要”。

2.3 识别信任边界:安全的分界线

信任边界,就是不同安全等级区域之间的分界线。数据跨过这条线,风险就变了。比如,从浏览器到Web服务器,从Web服务器到数据库服务器,每跨一次,就要重新验证。

常见的信任边界有:

  • 用户端 ↔ 服务端:用户输入不可信,必须校验。
  • 内网 ↔ 外网:外网流量默认不可信。
  • 应用层 ↔ 数据层:应用层不能直接信任数据库返回的数据。
  • 微服务之间:服务间调用需要认证和鉴权。
注意: 信任边界不是物理防火墙,而是逻辑上的安全假设。你画DFD时,用虚线框出每个信任域,然后在虚线穿过的地方,就是你要重点做安全控制的地方。

2.4 实战:一个登录系统的威胁建模

咱们拿一个最简单的登录系统来练手。系统包含:浏览器、登录API、用户数据库、Redis Session存储。

2.4.1 数据流图(DFD)

下面这张SVG图,展示了登录系统的数据流和信任边界。你看,数据从浏览器出发,穿过信任边界进入服务端,再流向数据库和Redis。

登录系统数据流图与信任边界 登录系统数据流图与信任边界 浏览器 登录API 用户数据库 Redis Session 用户凭证 查询用户 用户信息 写入Session Token/Set-Cookie 信任边界:服务端 说明: 1. 浏览器到登录API的数据流(用户凭证)跨越信任边界,必须做输入校验和防重放。 2. 登录API到数据库的查询,要防SQL注入;写入Redis的Session,要防篡改。

2.4.2 用STRIDE逐条过威胁

图有了,咱们拿STRIDE清单对着过一遍。我习惯用表格记录,方便后续评审。

数据流/元素 STRIDE威胁 风险描述 缓解措施
浏览器 → 登录API Spoofing 攻击者伪造请求,冒充合法用户 使用HTTPS + 防CSRF Token
登录API → 用户数据库 Tampering SQL注入篡改查询语句 参数化查询 / ORM
登录API → Redis Tampering Session数据被篡改 Session签名 / HMAC
登录API → 浏览器 Information Disclosure Token泄露或Cookie未设置Secure/HttpOnly 设置Cookie安全属性 + Token短有效期
登录API Denial of Service 暴力破解导致API过载 限流 + 验证码 + 账户锁定
用户数据库 Elevation of Privilege 数据库账户权限过高,可执行危险操作 最小权限原则,只给SELECT/INSERT
我的经验: 别试图一次把所有威胁都找全。第一轮先找最明显的,比如跨信任边界的数据流。第二轮再深入。我一般会做三轮:第一轮画图+找边界,第二轮STRIDE逐条过,第三轮评审+补充。三轮下来,基本能覆盖90%的威胁。

2.5 本章小结

威胁建模不是一次性的工作。系统迭代一次,DFD就要更新一次,STRIDE就要再过一遍。你想想看,架构都变了,威胁面能不变吗?

记住三个核心动作:画数据流图、用STRIDE找威胁、标信任边界。这三步走扎实了,后面的安全设计才有根基。