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 总结一下
威胁建模这件事,说白了就是:画图 → 找威胁 → 排优先级 → 修。循环往复,每次迭代都做一遍。
我见过太多团队,上线前不做威胁建模,结果被攻击了才追悔莫及。你想想看,与其等出事了再救火,不如一开始就把火种掐灭。
下一章,我们会聊安全需求分析——怎么把威胁建模的结果,转化成真正的安全需求。到时候见。