威胁建模基础:在攻击发生前先画地图
刚开始做安全的时候,我总觉得威胁建模是“纸上谈兵”。直到有一次,一个电商系统上线后,用户数据被批量拖库——原因就是支付模块和用户模块共用了一个没鉴权的API。复盘时我们才意识到,如果在设计阶段画过数据流图,这个洞一眼就能看出来。从那以后,威胁建模就成了我每个项目的起手式。
说白了,威胁建模就是在写代码之前,把系统可能被攻击的点一个一个列出来。它不是玄学,是有套路的。这一章我们就把套路拆开看。
什么是威胁建模
威胁建模不是画一张图就完事。它是一个结构化的分析过程。目标就一个:在坏人动手之前,找到系统最脆弱的地方。
我个人习惯把它叫做“安全需求的第一道过滤器”。你想想看,如果连自己的系统哪容易挨打都不知道,你怎么防?威胁建模做的就是把攻击面可视化,然后给每个威胁排优先级。
1. 系统里有什么?(资产)
2. 谁会攻击它?(威胁源)
3. 怎么攻击?(攻击路径)
STRIDE模型:六种威胁类型
STRIDE是微软提出的威胁分类框架,也是我用的最多的。六个字母分别对应六种攻击手法。记住它,你就拿到了威胁建模的六把钥匙。
| 缩写 | 威胁 | 定义 |
|---|---|---|
| S | Spoofing(欺骗) | 假冒别人身份,比如伪造登录Cookie |
| T | Tampering(篡改) | 修改数据或代码,比如改数据库里的余额 |
| R | Repudiation(抵赖) | 做了坏事不认账,比如删除日志 |
| I | Information Disclosure(信息泄露) | 数据被不该看的人看到,比如SQL注入 |
| D | Denial of Service(拒绝服务) | 让系统没法用,比如DDoS |
| E | Elevation of Privilege(权限提升) | 普通用户干管理员的事,比如越权 |
记得我刚学STRIDE时,总喜欢拿它套所有场景。后来发现,有些威胁对某些系统不成立。比如一个纯静态页面,Tampering和Elevation of Privilege就不太要紧。所以别死板,STRIDE是工具,不是教条。
威胁建模的完整流程
威胁建模不是一步到位的。我通常分五步走。每一步都有产出,方便后续跟踪。
- 定义范围:画清楚系统边界,哪些是你管的,哪些是外部。
- 分解系统:画出数据流图(DFD),把组件、数据存储、外部实体都列出来。
- 识别威胁:用STRIDE对着每个元素问“能不能被攻击”。
- 评估风险:给每个威胁打分(严重程度×可能性),决定修不修。
- 消减措施:拿出方案——加密、鉴权、日志、限流……选最合适的。
这五步是要来回迭代的。比如你画完DFD,发现有一个新外部实体,就得回头重新识别威胁。别想着一次画完,那不可能。
数据流图(DFD):威胁建模的骨架
DFD是威胁建模的核心工具。它用四个基本元素描述系统:外部实体(人/系统)、过程(服务/函数)、数据存储(数据库/文件)、数据流(线)。你想想看,每个元素都可能成为攻击点。
画DFD有两条铁律:
- 每条数据流都要标明方向(箭头不能省)。
- 每个数据存储都要考虑访问权限(谁读谁写)。
我记得有一次帮一个金融项目做威胁建模,他们画的DFD里有个数据存储叫“内部缓存”,没有任何输入输出流。我当时就笑了:“这缓存是凭空生数据吗?”后来发现是需求没对齐,那个模块根本还没设计。DFD就是有这本事——逼你直面系统里的空白。
常用工具:别自己画,让工具帮你
手工画DFD当然可以,但效率太低。我推荐几个工具,它们都内置威胁库,能自动生成威胁列表。
| 工具名 | 特点 | 我的推荐场景 |
|---|---|---|
| Microsoft Threat Modeling Tool | 免费、支持STRIDE、拖拽式画图 | Windows办公、小团队快速上手 |
| OWASP Threat Dragon | 开源、Web端、可集成Git | 跨平台、喜欢命令行和CI的团队 |
| IriusRisk | 商业、自动生成风险报告 | 大型企业、需要合规审计 |
我个人用Microsoft Threat Modeling Tool最多。它有个很好的功能:画完DFD后点一下“分析威胁”,它就会对着每个元素自动列出STRIDE威胁,还能给你消减建议。虽然有些建议很泛,但至少不会漏掉常见的。
最后,我们用一个图把本章的核心逻辑串起来。威胁建模不是线性过程,而是从“系统描述”出发,通过STRIDE映射到威胁清单,再消减,循环迭代。
嗯,到这里威胁建模的基础就讲完了。记住,画的图、列的清单、评的风险,最终都要落地成代码里的防御措施。不然都是白费功夫。