威胁建模入门:从概念到实战

威胁建模,说白了就是在攻击发生之前,先把自己想象成黑客,看看系统哪里最容易被捅一刀。我做了这么多年渗透测试,发现一个规律:没有做过威胁建模的项目,后期修漏洞的成本至少高出五倍。这不是夸张,是血泪教训。

核心观点:威胁建模不是一次性的纸上谈兵,而是贯穿整个开发生命周期的安全活动。越早做,成本越低。

什么是威胁建模?

威胁建模是一种结构化的方法,用来识别、量化系统面临的安全风险,并确定应对优先级。它回答三个问题:

  • 我们在构建什么?——理解系统架构和数据流
  • 哪里可能出问题?——识别潜在威胁
  • 我们该怎么办?——制定缓解措施

我个人习惯把威胁建模比作「安全领域的沙盘推演」。你不需要真的被攻击,就能知道哪里会疼。

我的经验:有一次帮客户做金融系统的威胁建模,光数据流图就改了七版。但正是这个过程,让我们发现了一个第三方支付接口的认证漏洞——如果上线后被利用,单日损失可能上千万。

STRIDE 模型详解

STRIDE 是微软提出的威胁分类模型,也是目前业界用得最广的框架。每个字母代表一类威胁:

字母 威胁类型 通俗理解 举个栗子
S Spoofing(欺骗) 冒充别人身份 伪造 JWT Token 登录管理员账号
T Tampering(篡改) 数据被非法修改 拦截 HTTP 请求,修改订单金额
R Repudiation(抵赖) 做了坏事不承认 删除日志,否认执行过恶意操作
I Information Disclosure(信息泄露) 敏感数据被偷看 SQL 注入拖库,用户密码泄露
D Denial of Service(拒绝服务) 系统无法正常服务 CC 攻击打垮登录接口
E Elevation of Privilege(权限提升) 普通用户干管理员的事 越权访问后台管理页面

你想想看,STRIDE 覆盖了从身份认证到权限控制的完整攻击链条。我在做威胁建模时,会拿着这个清单逐个元素去对,基本不会漏掉关键威胁。

避坑指南:我曾经见过一个团队,把 STRIDE 当成 checklist 打完勾就完事了。结果呢?他们忽略了「抵赖」这个威胁,系统没有做完整的审计日志。后来内部员工删库跑路,连谁干的都查不出来。

攻击树分析

攻击树是一种用树形结构描述攻击路径的方法。根节点是攻击者的最终目标,子节点是达成目标需要满足的条件。

举个例子,攻击者的目标是「获取数据库中的用户密码」:

获取用户密码(根目标)
├── 1.0 通过网络攻击
│   ├── 1.1 SQL 注入
│   │   ├── 1.1.1 发现注入点
│   │   └── 1.1.2 绕过 WAF
│   └── 1.2 中间人攻击
│       ├── 1.2.1 劫持 HTTPS 连接
│       └── 1.2.2 解密 TLS 流量
├── 2.0 通过物理攻击
│   ├── 2.1 进入机房
│   └── 2.2 直接读取硬盘
└── 3.0 通过社会工程学
    ├── 3.1 钓鱼邮件获取凭证
    └── 3.2 冒充运维人员重置密码

攻击树的价值在于:你可以针对每个叶子节点设计防御措施。比如针对 1.1.1,你可以做参数化查询;针对 1.2.1,你可以启用 HSTS 强制 HTTPS。

实战技巧:我画攻击树时,习惯用「AND」和「OR」来标注节点关系。AND 表示所有子条件必须同时满足,OR 表示满足任意一个即可。这样能更准确地评估攻击难度。

数据流图绘制

数据流图(DFD)是威胁建模的基础。没有它,你连系统里有哪些数据、流向哪里都说不清楚,更别提找威胁了。

DFD 的核心元素只有四个:

  • 外部实体(矩形):用户、第三方系统等
  • 处理过程(圆形):业务逻辑、API 接口等
  • 数据存储(两条横线):数据库、缓存、文件系统等
  • 数据流(箭头):数据在元素之间的流动方向

下面是我为一个典型的 Web 应用绘制的数据流图:

Web 应用数据流图(简化版) 用户 Web 服务器 Nginx + PHP 应用服务器 业务逻辑 MySQL 数据库 Redis 缓存 HTTP 请求 转发请求 SQL 查询 缓存读写 返回数据 响应内容 HTTP 响应 图例说明: 外部实体(用户/第三方) 处理过程(服务/组件) 数据存储(数据库/缓存) 数据流(方向) 注意:每个数据流都需要标注传输内容,这是后续做 STRIDE 分析的基础。

画完 DFD 之后,我会在每个数据流上标注「传输内容」和「协议」。比如用户到 Web 服务器是「HTTP POST 请求,包含用户名和密码」。这样在做 STRIDE 分析时,一眼就能看出哪里可能泄露信息。

我的习惯:DFD 不要画得太细,控制在 15-20 个节点以内。太细了反而看不清全局。我一般先画 Level 0(系统级),再针对关键模块画 Level 1。

威胁建模的完整流程

把上面几个工具串起来,就形成了威胁建模的完整流程:

  1. 画数据流图——搞清楚系统长什么样
  2. 识别威胁——用 STRIDE 逐个元素分析
  3. 构建攻击树——把威胁展开成具体攻击路径
  4. 评估风险——用 DREAD 或 CVSS 打分
  5. 制定缓解措施——针对高风险路径设计防御

嗯,这里要注意:威胁建模不是一次性的。每次系统架构变更、引入新组件、暴露新接口,都应该重新走一遍这个流程。

我曾经踩过的坑:有一次给一个微服务架构做威胁建模,画了 30 多个服务的 DFD,结果发现根本分析不完。后来学乖了,先按业务域分组,每组选一个代表服务做深度分析,其他做快速扫描。效率提升了好几倍。

小结

威胁建模是渗透测试的「地图」和「作战计划」。没有它,你就是在黑夜里乱开枪。STRIDE 帮你分类威胁,攻击树帮你拆解路径,DFD 帮你看清全局。这三样东西配合起来,基本能覆盖 90% 以上的安全风险。