威胁建模基础:在攻击发生前先画地图

刚开始做安全的时候,我总觉得威胁建模是“纸上谈兵”。直到有一次,一个电商系统上线后,用户数据被批量拖库——原因就是支付模块和用户模块共用了一个没鉴权的API。复盘时我们才意识到,如果在设计阶段画过数据流图,这个洞一眼就能看出来。从那以后,威胁建模就成了我每个项目的起手式。

说白了,威胁建模就是在写代码之前,把系统可能被攻击的点一个一个列出来。它不是玄学,是有套路的。这一章我们就把套路拆开看。

什么是威胁建模

威胁建模不是画一张图就完事。它是一个结构化的分析过程。目标就一个:在坏人动手之前,找到系统最脆弱的地方。

我个人习惯把它叫做“安全需求的第一道过滤器”。你想想看,如果连自己的系统哪容易挨打都不知道,你怎么防?威胁建模做的就是把攻击面可视化,然后给每个威胁排优先级。

核心三问:
1. 系统里有什么?(资产)
2. 谁会攻击它?(威胁源)
3. 怎么攻击?(攻击路径)

STRIDE模型:六种威胁类型

STRIDE是微软提出的威胁分类框架,也是我用的最多的。六个字母分别对应六种攻击手法。记住它,你就拿到了威胁建模的六把钥匙。

STRIDE威胁类型速查
缩写威胁定义
SSpoofing(欺骗)假冒别人身份,比如伪造登录Cookie
TTampering(篡改)修改数据或代码,比如改数据库里的余额
RRepudiation(抵赖)做了坏事不认账,比如删除日志
IInformation Disclosure(信息泄露)数据被不该看的人看到,比如SQL注入
DDenial of Service(拒绝服务)让系统没法用,比如DDoS
EElevation of Privilege(权限提升)普通用户干管理员的事,比如越权

记得我刚学STRIDE时,总喜欢拿它套所有场景。后来发现,有些威胁对某些系统不成立。比如一个纯静态页面,Tampering和Elevation of Privilege就不太要紧。所以别死板,STRIDE是工具,不是教条。

我的小习惯:每遇到一个组件,就拿出STRIDE挨个问一遍“这个组件怕哪个字?”一般5分钟就能扫出20多个潜在威胁。

威胁建模的完整流程

威胁建模不是一步到位的。我通常分五步走。每一步都有产出,方便后续跟踪。

  1. 定义范围:画清楚系统边界,哪些是你管的,哪些是外部。
  2. 分解系统:画出数据流图(DFD),把组件、数据存储、外部实体都列出来。
  3. 识别威胁:用STRIDE对着每个元素问“能不能被攻击”。
  4. 评估风险:给每个威胁打分(严重程度×可能性),决定修不修。
  5. 消减措施:拿出方案——加密、鉴权、日志、限流……选最合适的。
我曾经踩过的坑:流程走到第三步就停了,以为列出威胁就完事。结果没人跟进,威胁清单全烂在文档里。后来我强制要求:没有消减措施的威胁,不允许通过架构评审。

这五步是要来回迭代的。比如你画完DFD,发现有一个新外部实体,就得回头重新识别威胁。别想着一次画完,那不可能。

数据流图(DFD):威胁建模的骨架

DFD是威胁建模的核心工具。它用四个基本元素描述系统:外部实体(人/系统)、过程(服务/函数)、数据存储(数据库/文件)、数据流(线)。你想想看,每个元素都可能成为攻击点。

画DFD有两条铁律:

  • 每条数据流都要标明方向(箭头不能省)。
  • 每个数据存储都要考虑访问权限(谁读谁写)。

我记得有一次帮一个金融项目做威胁建模,他们画的DFD里有个数据存储叫“内部缓存”,没有任何输入输出流。我当时就笑了:“这缓存是凭空生数据吗?”后来发现是需求没对齐,那个模块根本还没设计。DFD就是有这本事——逼你直面系统里的空白。

避坑指南:DFD不是架构图,不要画服务器、负载均衡那些物理设备。只画逻辑组件和数据流向。画乱了就重来,控制在20个元素以内最好。

常用工具:别自己画,让工具帮你

手工画DFD当然可以,但效率太低。我推荐几个工具,它们都内置威胁库,能自动生成威胁列表。

工具名特点我的推荐场景
Microsoft Threat Modeling Tool免费、支持STRIDE、拖拽式画图Windows办公、小团队快速上手
OWASP Threat Dragon开源、Web端、可集成Git跨平台、喜欢命令行和CI的团队
IriusRisk商业、自动生成风险报告大型企业、需要合规审计

我个人用Microsoft Threat Modeling Tool最多。它有个很好的功能:画完DFD后点一下“分析威胁”,它就会对着每个元素自动列出STRIDE威胁,还能给你消减建议。虽然有些建议很泛,但至少不会漏掉常见的。

注意:工具只是辅助,它无法理解业务逻辑。比如你的支付流程里有个“金额取整”操作,工具不可能知道这个取整可能导致多付一分钱。所以人工分析是永远绕不开的。

最后,我们用一个图把本章的核心逻辑串起来。威胁建模不是线性过程,而是从“系统描述”出发,通过STRIDE映射到威胁清单,再消减,循环迭代。

威胁建模核心流程与STRIDE映射 系统描述/DFD STRIDE威胁分类 欺骗 篡改 抵赖 泄露 拒绝 提权 威胁清单 风险评估 消减措施 迭代优化 提示 每个DFD元素都要用 STRIDE过一遍 工具辅助,人工拍板

嗯,到这里威胁建模的基础就讲完了。记住,画的图、列的清单、评的风险,最终都要落地成代码里的防御措施。不然都是白费功夫。