2、安全威胁建模:威胁建模概念、STRIDE模型详解、数据流图绘制、威胁评估与优先级排序

2.1 威胁建模到底是什么?

说实话,很多团队做安全,都是等系统上线了,被攻击了,才慌慌张张去修。这就像房子盖好了才发现地基没打牢——代价太大了。

威胁建模,就是在你画图纸的阶段,提前想清楚:谁会来搞破坏?他们怎么进来?我们能怎么防?

我个人习惯把威胁建模比作「安全领域的沙盘推演」。你不需要真的被攻击,就能模拟出攻击路径。我在项目中遇到过好几次,开发同学觉得「这个功能没人会黑吧」,结果威胁建模一跑,漏洞一抓一大把。

核心思想: 安全左移。越早发现威胁,修复成本越低。

2.2 STRIDE模型详解

STRIDE 是微软提出的一套威胁分类方法。为什么叫 STRIDE?它取了六种威胁类型的首字母。我刚开始学的时候也觉得这名字挺拗口,但用熟了你会发现,它几乎能覆盖你遇到的所有安全问题。

威胁类型 英文 通俗解释 举个栗子
S - 身份欺骗 Spoofing 冒充别人身份 盗用管理员账号登录
T - 篡改 Tampering 非法修改数据 修改转账金额
R - 抵赖 Repudiation 做了不承认 用户说「我没下过单」
I - 信息泄露 Information Disclosure 不该看的看到了 数据库被拖库
D - 拒绝服务 Denial of Service 让系统瘫痪 DDoS 攻击
E - 权限提升 Elevation of Privilege 普通用户干管理员的事 越权访问后台

你想想看,任何一个安全漏洞,基本都能归到上面某一类里。我记得有一次做支付系统的威胁建模,光「篡改」这一类就挖出了 7 个高危风险点。

我的小技巧: 每次做威胁建模,拿 STRIDE 当 checklist 过一遍。别凭感觉想,按分类来,不容易漏。

2.3 数据流图绘制

威胁建模不能空想,你得先搞清楚系统长什么样。数据流图(DFD)就是干这个的。

说白了,数据流图就四个要素:

  • 外部实体(人、第三方系统)—— 画成矩形
  • 处理过程(你的业务逻辑)—— 画成圆形
  • 数据存储(数据库、文件)—— 画成两条横线
  • 数据流(数据怎么流动)—— 画成箭头

嗯,这里要注意:别画得太细。我见过有人把每个变量都画出来,结果图比代码还复杂,根本没法看。粒度控制在「模块级别」就够了。

举个例子,一个简单的登录流程:

用户(外部实体) → 输入账号密码 → 登录接口(处理过程) → 查询数据库(数据存储)
                                                      ↓
                                              返回 token → 用户

画完数据流图,你就能清晰地看到:数据在哪些节点停留?哪些地方可能被攻击?

避坑指南: 我曾经犯过一个错——只画了正常流程,没画异常流程。结果攻击者通过「忘记密码」功能绕过了整个登录验证。所以,异常路径也要画

2.4 威胁评估与优先级排序

威胁找到了,但你不能什么都修。资源有限,时间有限,你得知道先修哪个

我个人习惯用 DREAD 模型 来打分:

维度 说明 评分(1-10)
D - 潜在损失 如果被利用,损失多大? 10 = 公司倒闭
R - 可复现性 攻击者能稳定复现吗? 10 = 每次都能成功
E - 利用难度 攻击门槛高不高? 10 = 脚本小子都能搞
A - 受影响用户 多少人会遭殃? 10 = 所有用户
D - 可发现性 攻击者容易发现这个漏洞吗? 10 = 一眼就能看到

每个威胁算一个总分,分数越高,越要优先修

举个例子:

  • 「SQL 注入」:损失 9、可复现 10、利用难度 3、受影响用户 10、可发现性 8 → 总分 40
  • 「日志记录不全」:损失 5、可复现 10、利用难度 8、受影响用户 2、可发现性 2 → 总分 27

那很明显,先修 SQL 注入。

我的经验: 别纠结于精确打分。DREAD 的核心是帮你排序,不是做科学计算。只要分数能分出「高、中、低」三档,就够了。

2.5 总结一下

威胁建模这件事,说白了就是:画图 → 找威胁 → 排优先级 → 修。循环往复,每次迭代都做一遍。

我见过太多团队,上线前不做威胁建模,结果被攻击了才追悔莫及。你想想看,与其等出事了再救火,不如一开始就把火种掐灭。

下一章,我们会聊安全需求分析——怎么把威胁建模的结果,转化成真正的安全需求。到时候见。