一句话版本
安全不是"加了多少功能",而是"攻击者来了能不能挡住"。威胁建模先回答:谁会来、想要什么、从哪里进来;红队测试再用攻击者的方式真的打一遍,验证每一道防线是否有效。 最实用的原则是:每一条安全规则都要有一个对应的攻击用例,没被测试打过的规则,就当它不存在。
全文分三层:
- 通俗理解:先想小偷会怎么进门,再去试一试
- 实际用处:STRIDE、MITRE ATT&CK、红队 / 蓝队 / 紫队、漏洞赏金
- 原理与工程要点:从真实手法反推防御、测试清单怎么写、怎样模拟"撒谎的依赖"
第一层:通俗理解
1.1 先想小偷会怎么进门
给房子装防盗设施之前,先站在小偷的角度想一想:
- 小偷想要什么?(现金、珠宝、身份证件)
- 能从哪里进来?(正门、窗户、阳台、冒充快递员骗你开门)
- 进来之后会做什么?(翻抽屉、撬保险柜、删监控录像)
每个答案对应一道防线。这就是威胁建模。
1.2 再找人真的试一试
装好之后,请一个懂行的朋友真的试着撬一撬:窗户锁是不是真的锁得住?报警器是不是真的会响?监控是不是真的能拍到?
很多防线装了但没生效:配置写错了、某个条件没覆盖到、报警发到了没人看的邮箱。只有真的打一遍才知道。这就是红队测试。
第二层:实际用处
2.1 常用框架
| 框架 | 用途 |
|---|---|
| STRIDE(微软,1999) | 按六类威胁逐一检查系统:Spoofing 冒充、Tampering 篡改、Repudiation 抵赖、Information disclosure 信息泄露、Denial of service 拒绝服务、Elevation of privilege 权限提升 |
| 攻击树(Schneier,1999) | 把"攻击者的目标"作为树根,一层层拆解成实现它的各种途径,便于找出最便宜的攻击路径 |
| MITRE ATT&CK | 根据真实攻击事件整理的攻击战术与技术知识库,用来对照"我们能不能检测到这一招" |
2.2 红队、蓝队、紫队
| 角色 | 做什么 |
|---|---|
| 红队 | 扮演攻击者,尝试突破 |
| 蓝队 | 负责防守、监控和响应 |
| 紫队 | 红蓝合作:红队每打一招,蓝队当场确认"看见了吗、拦住了吗",没拦住就立刻修 |
小团队或个人项目往往一个人身兼三职,紫队的思路最实用:每设计一条防线,就同时写一个攻击它的用例。
2.3 漏洞赏金
邀请外部安全研究者来找漏洞并给予奖励。它是红队测试的延伸:内部测试受限于自己的想象力,外部研究者会从意想不到的角度进攻。即使没有预算,也至少应当公开一个安全联系邮箱(如 security@),以及一份 security.txt。
Caloogy Wallet 也采用了完整的红队测试清单。
第三层:原理与工程要点
3.1 从真实手法反推防御
不要凭空想象攻击,而是从已经发生过的事件出发:
| 真实手法 | 对应防线 | 对应测试用例 |
|---|---|---|
| 地址投毒 | 相似地址检测 | 制造一笔投毒转账,再从历史里复制地址转账,看是否被标为高风险 |
| Permit 签名钓鱼 | 解析 EIP-712,禁止盲签 | 模拟钓鱼网站请求 Permit 签名 |
| 前端被篡改 | 完整性巡检、广播后比对 | 在测试环境里篡改页面上的收款地址 |
| 账号被接管 | 冷静期、强认证 | 模拟"忘记密码"接管后立即转账 |
| 数据源撒谎 | 多源交叉验证 | 让其中一个数据源返回伪造结果 |
| 重放攻击 | 一次性 nonce | 把上一次的签名再提交一次 |
| CSRF | SameSite、Origin 校验 | 从另一个域名发起修改请求 |
3.2 测试清单怎么写
每一项至少包含:
| 字段 | 内容 |
|---|---|
| 编号 | 便于和设计文档、规则配置互相引用 |
| 场景 | 攻击者做了什么 |
| 前置条件 | 测试需要的环境和数据 |
| 预期结果 | 应该被拦住、告警,还是降级 |
| 实际结果 | 通过 / 失败,附证据(日志、截图) |
| 结论与跟进 | 失败的话修了没有,修完重测了没有 |
再加一张总览表,一眼看出哪些已通过、哪些未测、哪些失败待修。
3.3 测试必须"能失败"
一个永远通过的测试没有价值。几个常用技巧:
- 注入故障:用假的数据源(假 RPC、假 API)返回伪造或错误的数据,验证系统是否会发现并拒绝;
- 注入恶意客户端:测试钱包故意篡改交易参数,验证签名后核对能否抓到;
- 先让它失败:新写的检测,先在没开启防线时跑一遍,确认测试确实失败;开启后再确认通过。
3.4 自动化和人工都要有
| 自动化测试 | 人工演练 |
|---|---|
| 每次改代码都跑,防止回退 | 定期进行,模拟完整的攻击链 |
| 覆盖单条规则 | 覆盖"多个小问题串起来"的组合攻击 |
| 用假依赖,快速稳定 | 在真实环境(测试网)上跑,发现配置问题 |
很多问题只在真实环境中出现:某个第三方平台悄悄往页面里插了脚本、日志里意外记录了敏感参数、某个证书配置允许了过时的协议。这些只有"真打一遍"才发现得了。
3.5 关于公开
测试的方法论和类别可以公开分享,但具体的测试清单、未通过的项、待修的问题属于敏感信息,相当于给攻击者的路线图,应当保密。
总结
| 层次 | 要点 |
|---|---|
| 威胁建模 | 谁来、要什么、从哪进;STRIDE、攻击树、ATT&CK |
| 红队测试 | 用攻击者的方式真打一遍;紫队思路最实用 |
| 原则 | 每条规则对应一个攻击用例;测试必须能失败 |
| 实践 | 从真实事件反推;自动化 + 人工演练;未通过项保密 |