威胁建模入门:从“事后救火”到“事前预防”
大家好,我是你们的老朋友。今天咱们聊聊威胁建模。
说实话,我见过太多团队,开发完系统才发现安全漏洞。然后呢?加班、打补丁、写复盘报告。累不累?
我个人习惯是,在设计阶段就把安全问题想清楚。这就是威胁建模的价值——把安全左移,从源头解决问题。
什么是威胁建模?
威胁建模,说白了就是“模拟黑客怎么搞你”。
你想想看,如果你是一个攻击者,你会从哪里下手?是SQL注入?还是越权访问?或者干脆从物理层面把服务器搬走?
威胁建模就是系统性地回答这些问题。它不是一个工具,而是一种思维方式。
核心要点:威胁建模 = 识别资产 + 分析威胁 + 评估风险 + 制定对策
我在项目中遇到过一件事。有个团队做支付系统,他们觉得“我们用了HTTPS,肯定安全”。结果呢?攻击者根本没去破解加密,而是直接伪造了订单ID。为什么?因为他们没做威胁建模,不知道订单ID是可预测的。
嗯,这就是典型的“想当然”式安全。
STRIDE模型详解
说到威胁建模,就绕不开STRIDE。这是微软提出的经典模型,把威胁分成六类。
我刚开始学的时候,觉得这六个词好记。但真正用起来,才发现每个词背后都有坑。
| 威胁类型 | 英文 | 核心问题 | 举个栗子 |
|---|---|---|---|
| 欺骗 | Spoofing | 你能证明你是谁吗? | 伪造用户身份登录 |
| 篡改 | Tampering | 数据被改过吗? | 修改转账金额 |
| 抵赖 | Repudiation | 你能赖账吗? | 用户说“我没下过单” |
| 信息泄露 | Information Disclosure | 秘密被看到了吗? | 数据库被拖库 |
| 拒绝服务 | Denial of Service | 服务还能用吗? | DDoS攻击 |
| 权限提升 | Elevation of Privilege | 你能干不该干的事吗? | 普通用户变管理员 |
我的小技巧:每次做威胁建模,我都拿STRIDE当checklist。一个一个过,别漏。我曾经漏掉“抵赖”这一项,结果线上出了纠纷,没有日志可查。从那以后,我再也不敢跳过任何一项。
S - 欺骗(Spoofing)
这是最常见的威胁。攻击者假装成别人。比如伪造IP、伪造Cookie、甚至伪造人脸识别。
怎么防?身份认证、数字签名、双向TLS。记住一个原则:永远不要信任客户端传来的身份信息。
T - 篡改(Tampering)
数据在传输或存储过程中被改了。比如中间人攻击、数据库注入。
我建议用完整性校验。哈希、MAC、数字签名都行。关键是要在“写”和“读”两个环节都做校验。
R - 抵赖(Repudiation)
用户做了操作,但事后不承认。比如“我没转账”、“我没删文件”。
解决方案?审计日志。而且日志要防篡改。我曾经见过一个系统,日志存在本地文件里,攻击者删了日志就跑路了。嗯,等于没日志。
I - 信息泄露(Information Disclosure)
敏感数据被不该看到的人看到了。比如密码明文存储、API返回了多余字段。
这里有个坑:很多人只关注传输加密,忽略了存储加密。数据在数据库里是明文,一旦被拖库,全完蛋。
D - 拒绝服务(Denial of Service)
服务不可用。可能是流量攻击,也可能是逻辑漏洞导致的资源耗尽。
我个人的经验是:不要只防DDoS。有时候一个死循环就能让CPU跑满。代码审查和限流同样重要。
E - 权限提升(Elevation of Privilege)
普通用户干了管理员的事。比如越权访问、提权漏洞。
为什么这个最危险?因为一旦攻击者拿到管理员权限,前面所有的防护都可能被绕过。
警告:STRIDE不是万能的。它主要关注“技术威胁”,对“业务威胁”覆盖不够。比如薅羊毛、刷单这些,STRIDE就管不了。需要结合业务场景做补充。
如何绘制数据流图(DFD)
做威胁建模,光有STRIDE还不够。你得先搞清楚系统长什么样。这时候就需要数据流图了。
DFD的核心元素其实就四个:
- 外部实体:用户、第三方系统、数据库(画成矩形)
- 处理过程:业务逻辑、API接口(画成圆角矩形)
- 数据存储:数据库、缓存、文件(画成开口矩形)
- 数据流:数据怎么流动的(画成箭头)
举个例子。一个简单的登录功能:
用户(外部实体) → 输入用户名密码 → 登录接口(处理过程) → 查询数据库(数据存储) → 返回结果 → 用户
你看,这么一画,攻击面就清晰了。用户输入可能被注入,数据库可能被拖库,返回结果可能被截获。
避坑指南:我曾经画DFD时,漏掉了“第三方登录”这个外部实体。结果威胁建模完全没覆盖OAuth相关的风险。后来线上出了CSRF攻击,才补上。所以画DFD时,一定要把所有外部交互都列出来。
画DFD的几个原则
- 从宏观到微观:先画顶层图,再逐层细化。别一上来就画细节,会乱。
- 标注信任边界:用虚线画出信任边界。比如“用户端”和“服务端”之间就是一条信任边界。
- 关注数据流向:箭头方向别画反了。数据从哪来,到哪去,要清晰。
- 别漏了隐式数据流:比如日志、缓存、消息队列。这些容易被忽略,但往往是攻击点。
画完DFD之后,再结合STRIDE,对每个数据流、每个处理过程、每个存储点做威胁分析。这样就能系统性地发现安全问题。
总结一下
威胁建模不是什么高深的东西。它就是一套方法论,帮你在设计阶段就把安全想清楚。
STRIDE是分类工具,帮你识别威胁类型。DFD是可视化工具,帮你理清系统结构。两者结合,效果翻倍。
我建议你从一个小功能开始练手。比如“用户注册”或者“文件上传”。画DFD,套STRIDE,找威胁,定对策。练上几次,你就能感受到威胁建模的价值。
记住一句话:安全不是加出来的,是设计出来的。
好了,这一章就到这里。下一章咱们聊聊如何把威胁建模落地到实际项目中。