这里逐一拆解 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 · 权限与身份假设失效

Unit 3 · 数值假设失效

Unit 4 · 外部数据假设失效

Unit 5 · 经济与博弈假设失效

Unit 6 · 工具链与编译器

Unit 7 · 密钥与签名流程

附录


⚠️ 关于口径与时效:金额为公开报道的涉案规模约数,按事发当时币价估算,不同来源常有出入;归还与追回单独标注——把它们算进"损失"会明显高估合约漏洞那一侧。资料截止到 2026 年年中。

⚠️ 本档案的用途是防御。 每一篇都给出了完整的攻击路径,因为不理解攻击就写不出防御;但所有案例都是已公开、已修复、有公开复盘的历史事件,攻击细节不针对任何在运行的系统。