一、⭐ 资料的优先级

同一起事故,不同来源的可信度差很多。按这个顺序读:

① ⭐⭐ 链上交易本身
      攻击交易的 calldata、内部调用树、状态变更
      ⟹ 唯一不会撒谎的来源

② ⭐ 项目方的官方事后复盘(post-mortem)
      有具体代码行、有时间线的那种
      ⚠️ 注意:早期公告常常不准确,要看最终版

③ 安全公司的技术分析
      通常有攻击交易的逐步解读

④ ⚠️ 新闻报道
      金额经常有出入、机制经常被简化到失真
      ⭐ 只用来定位事件,不用来理解机制

本档案的金额都标注为"约数",且区分了「涉案」与「最终损失」——因为公开来源之间的差异常常达到数倍(第 10 篇的 $5.7 亿 vs $1 亿就是一例)。

二、自己动手复现

读十遍复盘,不如把攻击在本地跑一遍。

【环境】
   Foundry ——  forge test --fork-url <RPC> --fork-block-number <N>
   ⭐ 分叉到攻击【之前】的那个区块,
      然后自己写一份攻击合约,看它能不能成功

【为什么这件事值得做】
   □ 你会发现复盘里省略的细节
   □ ⭐ 你会知道"这个漏洞在我的代码里长什么样"
   □ 修好之后再跑一遍 ⟹ 验证修复真的有效

适合动手复现的几篇(机制清晰、依赖少):

[第 1 篇](https://blog.ifcalm.org/posts/security/blockchain/01-the-dao/)  重入            —— 二十行就能写出最小复现
[第 9 篇](https://blog.ifcalm.org/posts/security/blockchain/09-bec-batch-overflow/)  batchOverflow   —— 一行乘法,手算即可验证
[第 19 篇](https://blog.ifcalm.org/posts/security/blockchain/19-erc4626-inflation/) 第一存款人      —— ⭐ 最适合入门,纯算术
[第 12 篇](https://blog.ifcalm.org/posts/security/blockchain/12-bzx/) 闪电贷操纵      —— 需要分叉主网,但路径清晰
[第 18 篇](https://blog.ifcalm.org/posts/security/blockchain/18-euler-finance/) 自我清算        —— 逻辑精巧,值得完整实现一遍

三、工具

【静态分析】
   Slither     —— ⭐ 免费、快、误报可控。至少跑一遍
   Semgrep     —— 自己写规则,扫"我们团队特有的坏味道"
   ⭐ 用法:写一条规则扫出所有【裸算术】、
      所有【无修饰符的 external 函数】、
      所有【未检查的返回值】
      ⟹ 让"漏掉一处"变成机器能发现的事([第 9 篇](https://blog.ifcalm.org/posts/security/blockchain/09-bec-batch-overflow/))

【测试】
   Foundry fuzz      —— ⭐ 让工具替你找边界值([第 8 篇](https://blog.ifcalm.org/posts/security/blockchain/08-bitcoin-value-overflow/)、[第 11 篇](https://blog.ifcalm.org/posts/security/blockchain/11-cetus-mask/))
   Foundry invariant —— ⭐⭐ 本档案反复推荐的那几条不变量
   Echidna           —— 属性测试,适合复杂状态机

【形式化验证】
   Certora / Move Prover / Halmos
   ⚠️ 记住它的边界:⭐ 证明的是"实现符合规约",
      不是"规约是对的"([第 11 篇](https://blog.ifcalm.org/posts/security/blockchain/11-cetus-mask/))

【链上分析】
   区块浏览器的内部调用树 —— 看攻击交易到底调了什么
   ⭐ Tenderly 一类的模拟器 —— 逐步执行、看每一步的状态变更
   Foundry 的 cast run —— 命令行重放一笔交易

【监控】
   ⭐⭐ 一个每分钟读余额的脚本 ——
      几十行,是本档案投入产出比最高的一条([第 22 篇](https://blog.ifcalm.org/posts/security/blockchain/22-ronin-bridge/))

四、⭐ 读一份新复盘时该问什么

这是一份可以直接用的流程(对应第 24 篇的"把同行的复盘当作自己的待办"):

① 失效的是哪一条假设?
      ⭐ 不要停在"这是重入",
         要说出"它默认了什么,而那个默认为什么不成立"

② 它属于哪一类?(C1–C7)
      ⟹ 归类是为了知道"我该去检查我的哪部分代码"

③ ⭐ 我的系统里有没有同一条假设?
      逐条对照,不确定的就去读代码

④ 如果有,我现在的防御是什么层次的?
      结构性(不依赖人)?还是程序性(依赖人)?

⑤ ⭐ 这份复盘里,有没有提到"某个信号被忽略了"?
      ⟹ 那个信号在我这里对应什么?

⑥ ⚠️ 把"有问题"的那几条变成工单,
      把"没问题"的那几条写下理由 ——
      ⭐ 因为半年后情况可能变了

五、⭐ 本档案刻意没有覆盖的

① 中心化交易所的【运营失败】
      挪用客户资产、资不抵债、欺诈
      ⭐ 理由:那不是安全问题,是治理和监管问题。
         本档案只收录有【技术复盘】的事故。

② 诈骗、拉盘砸盘、"跑路"
      ⭐ 理由:它们不涉及任何被绕过的技术防线。

③ 单纯的前端钓鱼 / 假网站
      ⚠️ 除非它构成了对签名流程的攻击([第 23 篇](https://blog.ifcalm.org/posts/security/blockchain/23-wazirx/)、[第 25 篇](https://blog.ifcalm.org/posts/security/blockchain/25-bybit/))
      ⭐ 理由:那是终端安全问题,有更成熟的资料。

④ 具体审计公司的方法论与报告模板
      ⭐ 理由:变化快,且与"理解漏洞"这个目标无关。

⑤ ⚠️ 2026 年年中之后的事故
      资料截止于此。⭐ 如果你在更晚的时间读到这里,
      请自行补上这段空白 —— 并按第四节的流程处理它们。

六、怎么继续

⭐ 三条不同方向的路:

① 想理解机制为什么这样设计
      ⟹ [CS 251:区块链系统原理](https://blog.ifcalm.org/posts/blockchain/)
         尤其第 35 讲(漏洞的结构分类)、
         第 31 讲(预言机)、第 24 讲(调用语义)

② 想动手
      ⟹ 按第二节挑一篇,在 Foundry 里复现一遍
      ⟹ 然后把[检查清单](https://blog.ifcalm.org/posts/security/blockchain/90-checklist/)里对应的那几条
         应用到自己的代码上

③ ⭐ 想建立长期的习惯
      ⟹ 把[检查清单](https://blog.ifcalm.org/posts/security/blockchain/90-checklist/)做成季度例行事项
      ⟹ 订阅几个安全团队的复盘,按第四节的流程处理
      ⟹ ⭐ 每季度演练一次应急响应

最后一句:这个档案里 29 起事故,没有一起是因为攻击者比防守方聪明。 每一起的根因,在事后看都简单得令人难受——而这正是它们值得被逐条读一遍的原因。


相关上线前检查清单 · 术语表 · 回到事故档案目录