这里逐一拆解 2010 到 2026 年间 29 起有公开技术复盘的链上安全事故。
这是 安全 目录下的链上那一支(另一支是 Web 安全,编排中)。
它和一般的"被黑事件盘点"不同的地方在于:每一篇的重点不是损失多少钱,是"这条假设为什么会失效,以及你手上的代码里有没有同一条假设"。
每一篇的结构
七个小节,固定顺序。“举一反三"是这个档案存在的理由——如果读完只知道"The DAO 是重入”,那这篇就白写了。
一、背景 这个系统原本在做什么、钱是怎么进来的
二、漏洞在哪 精确到那一行,以及它默认了什么
三、攻击复盘 攻击者一步步做了什么,含交易结构
四、为什么没被发现 审计、测试、代码评审为什么都没拦住
五、防御 正确的写法,以及为什么那样写就安全
六、⭐ 举一反三 同一条假设还会出现在哪里 —— 这一节最重要
七、本案小结
思考题
这个档案怎么用
不建议从头读到尾。 更有用的用法是:
① 写到某一类代码之前,读对应那一类的两三篇
要写提款函数 → Unit 1
要写代理/升级 → Unit 2
要接价格源 → Unit 4
要设计投票 → Unit 5
② 上线之前,把 [上线前检查清单](https://blog.ifcalm.org/posts/security/blockchain/90-checklist/) 从头过一遍
③ ⚠️ 如果你只有时间读三篇:
Parity 第二次(第 5 篇)—— 权限漏洞可以让钱【永久锁死】而不是被偷
Compound DAI(第 14 篇)—— 预言机【完全正常工作】,损失照样发生
Bybit(第 25 篇)—— 合约、密码学、多签门槛全部正常,$14.6 亿没了
分类:七条会失效的假设
前五类在合约里,后两类在合约外——而后两类占了近年损失的大头。
| 类别 | 失效的假设 | |
|---|---|---|
| C1 | 控制流 | “调用外部合约后,我的状态还是我离开时那样” |
| C2 | 权限与身份 | “只有该调用的人能调用”、“初始化只会发生一次” |
| C3 | 数值 | “这个数不会溢出”、“精度损失可以忽略”、“舍入方向无所谓” |
| C4 | 外部数据 | “报上来的价格 = 有代表性的价格” |
| C5 | 经济与博弈 | “参与者的资源和身份是稳定的” |
| C6 | ⚠️ 工具链 | “我写的语义 = 链上跑的语义” |
| C7 | ⚠️ 密钥与签名 | “签名者看到的 = 他实际签署的” |
和课程的关系:C1–C5 沿用 CS 251 第 35 讲 的分类。C6、C7 是这个档案从事故数据里补出来的——课程只讲合约内部的失效,而历史数据显示合约外的两类占了损失的大头。想先理解机制再看事故,建议先读那门课的 Unit 5 和 Unit 7。
Unit 1 · 控制流假设失效
Unit 2 · 权限与身份假设失效
- 第 4 篇:Parity 多签(一)——没人锁的初始化函数
- 第 5 篇:Parity 多签(二)——51.3 万 ETH 被永久锁死
- 第 6 篇:Poly Network——把自己变成签发方
- 第 7 篇:Nomad——一个零值引发的公开哄抢
Unit 3 · 数值假设失效
- 第 8 篇:比特币值溢出——唯一一次凭空造币
- 第 9 篇:BEC batchOverflow——一个乘法毁掉一个代币
- 第 10 篇:BNB 桥——证明验证里的实现缺陷
- 第 11 篇:Cetus——2025 年的溢出仍值两亿美元
Unit 4 · 外部数据假设失效
- 第 12 篇:bZx——闪电贷时代的开场
- 第 13 篇:Harvest Finance——在存取之间套走差额
- 第 14 篇:Compound DAI——预言机没坏,钱没了
- 第 15 篇:Cream Finance——同一套路的规模化
- 第 16 篇:Mango Markets——薄盘就是攻击面
Unit 5 · 经济与博弈假设失效
Unit 6 · 工具链与编译器
Unit 7 · 密钥与签名流程
- 第 21 篇:Wormhole——没被验证的那个账户
- 第 22 篇:Ronin——四把钓来的钥匙和一把忘了收回的
- 第 23 篇:WazirX——你签的不是你看到的
- 第 24 篇:Radiant Capital——同一模式的第三次
- 第 25 篇:Bybit——史上最大,且全程合规
- 第 26 篇:密钥失窃的六个变体
附录
⚠️ 关于口径与时效:金额为公开报道的涉案规模约数,按事发当时币价估算,不同来源常有出入;归还与追回单独标注——把它们算进"损失"会明显高估合约漏洞那一侧。资料截止到 2026 年年中。
⚠️ 本档案的用途是防御。 每一篇都给出了完整的攻击路径,因为不理解攻击就写不出防御;但所有案例都是已公开、已修复、有公开复盘的历史事件,攻击细节不针对任何在运行的系统。