威胁建模基础:概念、STRIDE模型与流程

威胁建模,说白了就是在攻击者动手之前,先替他们想好怎么搞破坏。我经常跟团队讲一句话:“如果你不知道敌人会从哪里来,你就没法真正守住门。” 这不是什么高深理论,而是安全工作的基本功。

这一章,我们就把威胁建模的底子打扎实。我会从概念讲起,然后深入STRIDE模型——这是微软提出的一套经典框架,最后带你走一遍完整的威胁建模流程。嗯,这里面的坑,我踩过不少,都会一一告诉你。

1. 威胁建模到底是什么?

先别急着背定义。我换个说法:威胁建模 = 系统化的“找茬”过程。

你设计一个系统,画好架构图,写清楚数据流。然后你坐下来,问自己几个问题:

  • 谁会攻击我?
  • 他们想拿到什么?
  • 他们能从哪里下手?
  • 如果得手了,后果有多严重?

把这些问题的答案整理成文档,就是威胁模型。它不是一个静态的表格,而是一份活的、持续更新的安全地图。

核心要点:威胁建模不是一次性的安全评审,而是贯穿整个软件开发生命周期的持续活动。从需求阶段开始,到设计、开发、测试、部署,每个阶段都应该有对应的威胁建模输出。

我记得有一次,团队做了一个内部管理系统,功能很简单,就是员工请假审批。大家觉得没什么安全风险,就没做威胁建模。结果上线后,有人通过修改HTTP请求参数,直接把自己从“普通员工”改成了“CEO审批人”。嗯,那场面……后来我们花了三天时间紧急修复,还补了安全审计。从那以后,我再也不敢跳过威胁建模了。

2. STRIDE模型详解

STRIDE是微软提出的一种威胁分类方法。它把安全威胁分成六类,每个字母代表一类:

字母 威胁类型 通俗解释 违反的安全属性
S Spoofing(假冒) 冒充别人身份,比如伪造登录 认证
T Tampering(篡改) 修改数据或代码,比如改数据库记录 完整性
R Repudiation(抵赖) 做了坏事不承认,比如删日志 不可否认性
I Information Disclosure(信息泄露) 不该看的数据被看到了 机密性
D Denial of Service(拒绝服务) 让系统不可用,比如DDoS 可用性
E Elevation of Privilege(权限提升) 普通用户拿到管理员权限 授权

你可能会问:“这六类够用吗?” 说实话,大部分场景下是够的。STRIDE的厉害之处在于,它把安全属性(认证、完整性、机密性等)和具体的威胁类型对应起来了。你分析一个功能时,只要对着这六类逐一排查,基本不会漏掉大的风险点。

我的习惯:每次做威胁建模,我都会在墙上贴一张STRIDE分类表。每分析一个数据流,就对着表问一遍:“这个流会不会被假冒?会不会被篡改?会不会导致信息泄露?” 这样不容易遗漏。

3. 威胁建模的标准流程

流程不复杂,但每一步都有讲究。我把它总结成五个步骤:

  1. 界定范围 —— 明确你要分析的系统边界、功能模块、数据资产。
  2. 分解系统 —— 画出架构图、数据流图(DFD),标出信任边界。
  3. 识别威胁 —— 用STRIDE或其他模型,对每个数据流和节点进行威胁分析。
  4. 评估风险 —— 对识别出的威胁进行优先级排序,决定哪些要修、哪些可以接受。
  5. 制定缓解措施 —— 针对高风险威胁,设计具体的防护方案。

下面这张图,就是整个流程的概览。我建议你把它打印出来,贴在工位上。

威胁建模五步流程 1. 界定范围 2. 分解系统 3. 识别威胁 4. 评估风险 5. 制定缓解措施 说明: • 步骤1-4是顺序执行 • 步骤5完成后,可能需要 回到步骤3重新识别威胁 • 虚线表示迭代反馈

4. 每个步骤的实战要点

4.1 界定范围

这一步最容易犯的错是范围太大或太小。太大,分析不完;太小,漏掉关键风险。我建议你从用户故事或功能模块入手,一次只分析一个功能点。比如“用户注册登录”作为一个单元,“订单支付”作为另一个单元。

我曾经踩过的坑:有一次,我试图在一个威胁建模会议里把整个电商平台都分析完。结果开了三个小时的会,只讨论了首页展示功能。后来我学乖了,每次只分析一个核心功能流,控制在1-2小时内完成。

4.2 分解系统

画数据流图(DFD)是核心。你需要标出:

  • 外部实体(用户、第三方系统)
  • 进程(服务、模块)
  • 数据存储(数据库、缓存)
  • 数据流(请求、响应)
  • 信任边界(比如内网和外网的分界线)

信任边界特别重要。我见过很多团队画DFD时,把整个系统画成一个黑盒子,然后说“内部都是安全的”。这其实很危险。攻击者一旦突破边界,内部就完全暴露了。

4.3 识别威胁

对着DFD,用STRIDE逐项分析每个元素。我习惯用表格来记录:

数据流/节点 STRIDE威胁 具体描述 影响
用户登录请求 Spoofing 攻击者伪造登录请求,冒充合法用户 高
数据库写入 Tampering 攻击者通过SQL注入篡改订单数据 高
日志记录 Repudiation 攻击者删除操作日志,无法追溯 中
API响应 Information Disclosure API返回了用户手机号等敏感信息 高
文件上传 Denial of Service 攻击者上传超大文件耗尽磁盘空间 中
权限校验 Elevation of Privilege 普通用户通过修改请求参数提升权限 高

4.4 评估风险

不是所有威胁都要修。你需要根据可能性和影响程度来排序。我常用的方法是:

  • 高可能性 + 高影响 → 必须立即修复
  • 高可能性 + 低影响 → 尽快修复
  • 低可能性 + 高影响 → 制定应急方案
  • 低可能性 + 低影响 → 记录在案,暂不处理

我的经验:不要试图一次性解决所有威胁。优先处理那些“一旦发生就会让业务停摆”的风险。比如,用户数据泄露、支付系统被篡改,这些是红线,必须优先处理。

4.5 制定缓解措施

缓解措施要具体、可落地。比如:

  • 针对Spoofing:强制使用OAuth 2.0 + MFA
  • 针对Tampering:所有写操作加数字签名
  • 针对Information Disclosure:API响应脱敏,日志不记录明文密码
  • 针对Denial of Service:限流、熔断、资源配额
  • 针对Elevation of Privilege:最小权限原则,服务间调用使用JWT

嗯,到这里,威胁建模的基础就讲完了。你可能会觉得内容有点多,但别急,后面几章我们会用真实案例来演练,到时候你会发现自己已经能熟练运用这些知识了。