4. 威胁建模入门:常见威胁类型与STRIDE模型初步应用
威胁建模这件事,说白了就是“在攻击者动手之前,先替他们想好怎么搞破坏”。
我早年做第一个安全项目时,根本没这个概念。结果上线第一天,就被扫出一个SQL注入漏洞。嗯,从那以后,我再也不敢跳过威胁建模了。
4.1 威胁到底从哪里来?——三大威胁来源
你想想看,一个系统面临的威胁,无非来自三个方向:人、技术、环境。咱们一个一个拆。
4.1.1 人为威胁
这是最不可控的一类。我习惯把人为威胁分成“有意”和“无意”两种。
- 恶意内部人员:比如被裁的运维,删库跑路。我在项目中遇到过,一个离职的DBA用他还在生效的VPN账号,半夜把测试库清了。
- 外部攻击者:脚本小子、APT组织、勒索团伙。他们的目标很明确——钱、数据、破坏。
- 无意的内部人员:比如运维误配防火墙、开发把密钥提交到GitHub。这类其实占比最高。
4.1.2 技术威胁
技术本身也会带来威胁。不是技术不好,而是技术有“副作用”。
- 软件漏洞:缓冲区溢出、反序列化、逻辑缺陷。
- 协议缺陷:比如HTTP明文传输、DNS劫持、TLS降级攻击。
- 配置脆弱性:默认密码、开放端口、调试接口未关闭。
我的经验:技术威胁里,配置问题占了我处理过的安全事件的一半以上。别小看“默认设置”这四个字。
4.1.3 环境威胁
环境威胁往往被忽略,但一旦发生,影响面极大。
- 物理环境:机房断电、空调失效、火灾、水淹。
- 供应链环境:第三方库投毒、硬件后门、云服务商故障。
- 合规与法律环境:数据跨境、GDPR、等保要求。不合规本身就是一种威胁。
4.2 威胁建模的“瑞士军刀”——STRIDE模型
STRIDE是微软提出的一套威胁分类法。我个人觉得,它是入门威胁建模最友好的工具,没有之一。
为什么?因为它把威胁拆成了六类,每一类对应一个安全属性。你对着这六类去检查系统,基本不会漏掉大头。
| 威胁类型 | 英文 | 违反的安全属性 | 举个栗子 |
|---|---|---|---|
| S 假冒 | Spoofing | 身份认证 | 攻击者伪造用户Token登录 |
| T 篡改 | Tampering | 完整性 | 中间人修改请求报文 |
| R 抵赖 | Repudiation | 不可否认性 | 用户否认发起过某笔交易 |
| I 信息泄露 | Information Disclosure | 机密性 | 数据库被拖库,明文密码泄露 |
| D 拒绝服务 | Denial of Service | 可用性 | CC攻击打垮Web服务器 |
| E 权限提升 | Elevation of Privilege | 授权 | 普通用户通过越权漏洞拿到管理员权限 |
记住这个口诀:“假、篡、赖、泄、拒、提”——六个字,对应STRIDE的六类威胁。
4.3 STRIDE模型怎么用?——四步走
光知道分类没用,得会用。我一般按下面四个步骤来:
- 画数据流图(DFD):把系统拆成外部实体、进程、数据存储、数据流。这是威胁建模的“地图”。
- 逐元素应用STRIDE:对着DFD里的每个元素,问自己“这个元素可能遭受STRIDE里的哪几种威胁?”
- 记录威胁清单:把识别出的威胁写下来,包括威胁描述、影响、风险等级。
- 制定缓解措施:针对每个威胁,给出具体的控制措施。比如“加认证”、“做校验”、“上WAF”。
我曾经带过一个团队做威胁建模,他们第一步就卡住了——DFD画得太粗。你想想看,连数据流都画不清楚,后面识别威胁就是瞎蒙。
4.4 实战案例:一个简单的登录模块
咱们拿一个最常见的登录功能来练手。假设系统是这样的:
- 用户通过浏览器输入账号密码
- 前端发送POST请求到后端API
- 后端查询数据库,校验密码
- 校验通过后,返回JWT Token
用STRIDE过一遍:
| DFD元素 | STRIDE威胁 | 具体描述 | 缓解措施 |
|---|---|---|---|
| 用户(外部实体) | Spoofing | 攻击者伪造合法用户身份 | 多因素认证、设备指纹 |
| 登录API(进程) | Tampering | 中间人篡改登录请求 | 强制HTTPS、请求签名 |
| 数据库(数据存储) | Information Disclosure | 密码明文存储,拖库即泄露 | bcrypt加盐哈希、加密存储 |
| Token返回(数据流) | Repudiation | 用户否认登录行为 | 记录审计日志、Token绑定设备 |
| 登录接口(进程) | Denial of Service | 暴力破解导致接口不可用 | 限流、验证码、账户锁定 |
| 会话管理(进程) | Elevation of Privilege | 普通用户越权访问管理员功能 | RBAC权限校验、最小权限原则 |
避坑指南:我曾经见过一个团队,做完威胁建模后把清单往wiki一扔就完事了。结果三个月后复盘,发现一半的威胁根本没修。威胁建模不是写文档,是驱动决策的。
4.5 一张图看懂本章知识体系
下面这张图,把威胁来源、STRIDE分类、建模流程串在了一起。你可以把它当成一个速查框架。
4.6 给新手的三个建议
- 别贪大求全:第一次做威胁建模,选一个核心功能模块就够了。我见过有人一上来就想把整个系统建模完,结果画DFD就画了两周,项目黄了。
- 拉上开发一起做:威胁建模不是安全团队的自嗨。开发最了解代码逻辑,他们参与进来,识别出的威胁才靠谱。
- 迭代,别想一次完美:威胁建模是持续的过程。系统改一次,模型就更新一次。我习惯在每个迭代的“设计评审”环节加入威胁建模,每次花30分钟,效果比集中做三天好得多。
一个小工具推荐:微软的Threat Modeling Tool是免费的,支持自动生成STRIDE威胁清单。你可以用它来辅助练习,但别完全依赖它——工具只能提示,真正的威胁判断还得靠人。