本节摘要:敌手画像要落成工程动作才有用。本节给出四步推演清单——列资产、找入口、定能力、估影响——并用一个即时通信系统走完全流程,标注哪些条目最常被高估、哪些最常被低估。读完你能独立主持一次一小时的威胁推演会,产出一份团队可以执行的清单,而不是一份没人再打开的文档。
多数团队的威胁建模是一次性作业:安全评审前填一张模板表,通过后再没人看。病根通常不在态度而在方法——模板问的是"你有什么风险"这种开放问题,而开放问题在会议室里只会得到政治正确的空答案。本节的清单刻意做成封闭动作:每一步都有明确的产出物和判定标准,推演会开完,清单就是可执行的。
清单的另一个设计原则是先具体化敌手再讨论风险。这正是 2.1 节画像的直接应用:讨论"数据会不会泄露"毫无产出,讨论"图 2-1 右上象限的敌手通过哪条入口拿到哪些资产"立刻有产出。威胁不是系统的属性,是"系统 × 敌手"关系对的属性。
第一步:列资产。 产出物是一张资产表,每行写"资产、它对谁有价值、失去后的最坏后果"。以即时通信系统为例:消息明文(对用户、对运营方都有价值)、联系人关系图(元数据,对广告商和对情报机构价值不同)、账号凭证(对用户)、私钥存储(对所有人)、消息投递日志(对运营方)。易错点:只列"数据"类资产,漏掉关系类与能力类资产——"某两个账号频繁通信"这条元数据本身常常比单条消息更敏感;"签发新设备密钥的能力"是能力类资产,它被滥用等于账号沦陷。
第二步:找入口。 对每个资产列出全部可达路径。纪律是"物理上可达就算",不预设"我们的内网是安全的"。即时通信系统的入口至少有:客户端与服务端之间的网络路径、推送通道(常由第三方提供)、多设备同步通道、备份与导出功能、客服与管理后台、账号找回流程。两个常被低估的入口值得点名。推送通道:通知内容由第三方推送服务投递,若通知里嵌消息预览,机密性承诺在系统外破了个洞。账号找回:它是认证体系的后门——短信验证码的信道安全不在你的协议管辖内,但攻击者最爱走这里。
第三步:定能力。 给每个"入口 × 资产"配敌手能力档位,直接引用 2.1 节的四项能力与两条限制。示范一行:备份导出功能 × 消息明文——机会型敌手需要先盗号(能力门槛高),定向型敌手可通过钓鱼拿到已登录会话(能力门槛中)。这一步最常见的错误是把内部系统全标成"零能力"——"内网敌手不存在"是最常被高估的假设,历史事故里大量横向移动始于一台已失守的内网机器。
第四步:估影响并排序。 每行给"机密性/完整性/认证性哪个先失效、失效半径多大"的判断,按失效半径排序产出行动清单。失效半径是关键判据:某个入口被击穿时波及的是"一个用户"还是"全体用户",决定了防御投入的优先级。
【推演清单样例 · 节选】 资产: 私钥存储 入口: 客户端本地存储 敌手: 机会型·强能力 路径: 设备丢失 + 无本地保护 影响: 认证性失效(冒名) + 历史消息泄露(若私钥解密本地缓存) 失效半径: 单用户 优先级: 高 对策: 本地密钥用系统钥匙库保护 + 历史消息仅存密文 + 远端吊销机制 ------------------------------------------------ 资产: 账号找回流程 入口: 短信验证码 敌手: 定向型·弱能力 路径: SIM卡换绑攻击 / 运营商社工 影响: 认证性完全失效, 敌手获得账号全部控制权 失效半径: 单用户(可扩大到其全部联系人, 伪冒身份发消息) 优先级: 高 对策: 找回后冷启动设备信任 + 向联系人展示密钥变更告示
四步做完,清单还停留在风险管理层面。最后加一个动作把它接回协议分析主线:对清单里每一行追问"协议层能不能把这个风险变成不可行的命题"。账号找回的例子,协议层命题是"找回流程完成后,旧设备的会话密钥全部失效"——这就是可验证的命题(2.3 节的模板马上给形式写法)。有些风险协议层接不住(短信信道安全不归你管),那就老老实实标记为"运营层残余风险",写明谁负责、怎么监测。**推演清单的成熟标志是每一行都有归属:要么变成协议命题,要么变成运营措施,要么明确接受。**三不管的行就是未来事故的预定期。
⚠️ 最常被高估与最常被低估的一句话总结:高估的是"内网隔离与私有协议的模糊安全性",低估的是"元数据、备份通道与找回流程"——三个低估项全部在真实案例里反复出现,第 3 章的案例里还会再见到它们。
清单要有人一起过才完整——单人推演总会漏掉自己系统的盲区。给一个实测可用的六十分钟议程,主持人按秒表走,效果远好于无限时自由讨论。
【威胁推演会 · 60 分钟议程】 0-5 分钟 主持人重述系统边界与本次范围(改动了什么、新增了什么入口) 5-20 分钟 列资产:按数据类、关系类、能力类三栏过,每类至少三条 20-35 分钟 找入口:对 Top 资产逐条问"物理可达路径有几条" 纪律: 提出者只描述路径, 其他人不许当场反驳可行性 35-50 分钟 定能力并排序: 每行给敌手档位, 按失效半径排优先级 50-60 分钟 归属: 每行标注 → 协议命题 / 运营措施 / 明确接受 出现"三不管"行必须当场指定跟进人与期限
两条主持纪律值得单独强调。一是"先发散后收敛":找入口阶段禁止任何人说"这个不可能发生"——可行性判断是第三步定能力时的事,过早反驳会把入口清单砍成"政治正确版",而真实事故几乎都从被当场否决的那条路径进来。二是"新人必须在场":客服、运维、产品对系统的理解各照出一块盲区,入口清单的质量与参会者的岗位多样性直接相关——推演会最怕开成安全团队的内部独白。
💡 判断一次推演会开没开好的土标准:散会时清单里"明确接受"的行数占比。全部风险都承诺修复,说明第三步的能力分档没做实;一半以上被明确接受并写明理由,说明团队真的在做取舍——威胁建模的产出不是"零风险清单",是"知道自己在接受什么"的清单。
清单还有个容易忽略的姊妹动作:登记与回访节奏。清单做完成文档,三个月后系统加了个导出功能、换了个推送服务商,清单还是旧的——威胁建模失效的第二大原因(第一大是流于形式)是过期。建议把清单的条目编号纳入变更管理:需求评审里凡是"新增入口、新增数据类型、新增第三方依赖"的改动单,必须勾选"影响哪些清单条目",勾不出来的新建条目。回访节奏不必重:每季度十分钟核对一遍"清单里的入口还都存在吗、有没有新入口",比每年一次大而全的重建有效得多。威胁建模做成连续动作还是年度仪式,差别就在这个回访钩子上。
下一节把清单最后一列的"命题"写成严格形式:同一句"聊天是安全的",可以拆成敌手前提各不相同的三种命题——机密性、认证性、前向保密,它们的写法将直接决定第 5 章机器验证的查询语句。