威胁建模入门:从“事后救火”到“事前预防”

大家好,我是你们的老朋友。今天咱们聊聊威胁建模。

说实话,我见过太多团队,开发完系统才发现安全漏洞。然后呢?加班、打补丁、写复盘报告。累不累?

我个人习惯是,在设计阶段就把安全问题想清楚。这就是威胁建模的价值——把安全左移,从源头解决问题。

什么是威胁建模?

威胁建模,说白了就是“模拟黑客怎么搞你”。

你想想看,如果你是一个攻击者,你会从哪里下手?是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的几个原则

  1. 从宏观到微观:先画顶层图,再逐层细化。别一上来就画细节,会乱。
  2. 标注信任边界:用虚线画出信任边界。比如“用户端”和“服务端”之间就是一条信任边界。
  3. 关注数据流向:箭头方向别画反了。数据从哪来,到哪去,要清晰。
  4. 别漏了隐式数据流:比如日志、缓存、消息队列。这些容易被忽略,但往往是攻击点。

画完DFD之后,再结合STRIDE,对每个数据流、每个处理过程、每个存储点做威胁分析。这样就能系统性地发现安全问题。

总结一下

威胁建模不是什么高深的东西。它就是一套方法论,帮你在设计阶段就把安全想清楚。

STRIDE是分类工具,帮你识别威胁类型。DFD是可视化工具,帮你理清系统结构。两者结合,效果翻倍。

我建议你从一个小功能开始练手。比如“用户注册”或者“文件上传”。画DFD,套STRIDE,找威胁,定对策。练上几次,你就能感受到威胁建模的价值。

记住一句话:安全不是加出来的,是设计出来的。

好了,这一章就到这里。下一章咱们聊聊如何把威胁建模落地到实际项目中。