威胁建模入门:STRIDE模型详解、威胁建模的步骤、绘制数据流图

大家好,欢迎来到第二章。上一章我们聊了安全需求从哪来,这一章咱们直接上手干活——威胁建模。

说实话,我早年做项目时,安全基本靠“拍脑袋”。后来被甲方怼了几次,才老老实实学威胁建模。这东西说白了,就是在系统还没写代码之前,先把自己想象成黑客,看看哪里能捅刀子。

什么是威胁建模?

威胁建模不是画几张图就完事。它是一种结构化的分析方法。你想想看,盖楼之前要先画结构图,做系统也一样。威胁建模就是给系统做“安全体检”。

我个人习惯把威胁建模分成三个核心问题:

  • 我们在建什么? —— 系统长什么样,数据怎么流
  • 哪里可能出问题? —— 攻击者能从哪里下手
  • 怎么修? —— 对应的缓解措施是什么

核心观点:威胁建模越早做,修复成本越低。等代码写完了再补安全,那叫“亡羊补牢”,而且羊可能已经丢光了。

STRIDE模型详解

STRIDE是微软提出的一套威胁分类法。我当年第一次看到这六个字母,觉得挺唬人。用熟了才发现,它就是一张“攻击者菜单”。

威胁类型 英文 核心问题 举个栗子
S - 身份欺骗 Spoofing 你能假装成别人吗? 盗用管理员Token登录后台
T - 篡改 Tampering 数据在传输或存储中被改了吗? 中间人改掉支付金额
R - 抵赖 Repudiation 做了坏事能赖账吗? 用户说“我没下过这个订单”
I - 信息泄露 Information Disclosure 不该看的人看到了吗? 数据库明文存密码
D - 拒绝服务 Denial of Service 系统还能正常服务吗? 刷验证码接口打到服务器宕机
E - 权限提升 Elevation of Privilege 普通用户能干管理员的事吗? 越权访问其他用户的订单

我的小技巧:每次做威胁建模,我就拿STRIDE当checklist,对着每个元素问一遍“这里能不能搞事情?” 基本不会漏。

威胁建模的五个步骤

很多新手一上来就画图,画完就懵了。其实威胁建模有标准流程。我一般按下面五步走:

  1. 界定范围 —— 明确要分析的系统边界。别把整个公司网络都画进去,那是给自己找麻烦。
  2. 分解系统 —— 画数据流图,搞清楚谁跟谁通信,数据怎么流转。
  3. 识别威胁 —— 用STRIDE对着每个数据流、每个存储、每个进程问一遍。
  4. 评估风险 —— 给威胁排优先级。我常用DREAD模型打分,但那是另一节课的内容了。
  5. 制定缓解措施 —— 针对高风险的威胁,给出具体的修复方案。

避坑指南:我曾经见过一个团队,花了两周画了一张极其精美的数据流图,然后就没有然后了。记住,图是工具,不是目的。真正的价值在于“识别威胁”那一步。

绘制数据流图(DFD)

数据流图是威胁建模的“地图”。没有地图,你连敌人在哪都不知道。

DFD有四种基本元素:

  • 外部实体 —— 用户、第三方系统。用矩形表示。
  • 进程 —— 处理数据的模块。用圆形或椭圆表示。
  • 数据存储 —— 数据库、文件。用两条平行线表示。
  • 数据流 —— 箭头,表示数据在移动。

嗯,这里要注意:画DFD时,别把控制流(比如“点击按钮”)画进去。我们只关心数据怎么流,不关心用户怎么操作。

下面是我画的一个简化版“用户登录”数据流图,你可以感受一下:

用户登录模块 - 数据流图(简化版) 用户 登录服务 (进程) 用户数据库 会话缓存 用户名+密码 查询用户信息 返回密码Hash 写入会话Token 返回会话Token 图例 外部实体 进程 数据存储 数据流

画完图之后,就该STRIDE上场了。对着每个数据流问:

  • 用户到登录服务这条线,能不能被身份欺骗?—— 嗯,如果没做双向认证,中间人可以伪造用户。
  • 登录服务到数据库这条线,数据会不会被篡改?—— 如果没做完整性校验,攻击者可能改掉查询结果。
  • 会话Token返回给用户,会不会泄露?—— 如果走HTTP明文传输,Token就裸奔了。

我的习惯:画完DFD后,我会在每条数据流旁边标注它对应的STRIDE威胁编号。比如“S-1”表示第一个身份欺骗威胁。这样评审时一目了然。

威胁建模的常见误区

做了这么多年安全评审,我总结几个新手常踩的坑:

  • 图太细或太粗 —— 画到每个函数调用,那是设计文档;只画一个框“系统”,那是没画。合适的粒度是“模块级”。
  • 只画正常流程 —— 别忘了异常分支。比如登录失败三次后,数据流怎么走?
  • 忽略信任边界 —— 数据从外部进入内部系统的那条线,往往是威胁最多的地方。用虚线标出信任边界。
  • 做完就扔 —— 威胁建模不是一次性工作。系统迭代了,图也要跟着更新。

我曾经踩过的坑:有一次给一个支付系统做威胁建模,我漏画了“退款回调”那条数据流。结果上线后,攻击者利用回调接口的漏洞,把一笔订单退了三次款。嗯,从那以后,我每次画图都会拉着开发和测试一起过一遍,确保没有遗漏任何数据流。

小结

这一章我们聊了STRIDE模型的六个威胁维度,威胁建模的五步法,以及怎么画数据流图。说白了,威胁建模就是“先画地图,再找敌人”。