重入攻击:从 The DAO 到今天的变体
2026/8/24大约 2 分钟
Web3 区块链系列 · 阶段 6 · 安全攻防 · 第 34/57 篇 · 🚧 占位待学
上一篇:《攻击面与威胁模型:OWASP 智能合约 Top 10》
下一篇:《访问控制漏洞:权限错置与签名滥用》
学习大纲:《Web3 区块链学习总纲》
状态:待学习。 本文为占位文档:知识点清单、实验与验收标准已就绪,正文待按「先学习、先实验、再撰写」补全。
对应总纲单元:阶段 6 · 单元 6.2
一、本文要解决的问题
2016 年 The DAO 360 万 ETH 被盗,直接导致以太坊分叉出 ETC——根因只是一个「先转账、后改状态」。亲手复现它,再理解所有变体与所有防御。
二、知识点清单
- 重入根因:外部调用发生在状态更新之前(checks-effects-interactions 被破坏)
- The DAO 事件始末与硬分叉(历史语境)
- 经典重入:攻击合约在 fallback 里递归调用提款
- 变体:跨函数重入、跨合约重入、只读重入(preview 函数被利用)
- 防御四件套:CEI 顺序、重入锁(nonReentrant)、pull 支付、transfer 的 2300 gas 限制为何不再被视为可靠防御
三、动手实验(学习时必须真跑)
- 写一对「受害者 + 攻击者」合约复现经典重入,把钱偷光
- 基于 4626 金库复现一次只读重入
- 分别用 CEI 与重入锁修复,验证攻击失效
四、验收标准(全部通过才进入下一篇)
五、写作提示(补正文时遵守)
- 开篇问题驱动;结构走「是什么 → 为什么 → 怎么做 → 背景知识」
- 所有代码、命令、输出必须先在本机跑通再写入,不得杜撰
- 版本口径以总纲环境清单为准(以太坊 Fusaka / Solidity 0.8.36 / Foundry v1.0 / OpenZeppelin Contracts 5.x)
- 涉及版本敏感结论时标注出处与时间
本篇完成后,把文首导航块的「🚧 占位待学」去掉,并在总纲处打卡。