安全实战与案例库入门646 次阅读
The DAO 事件:6000 万美元如何导致以太坊硬分叉
2016 年史上第一次重大智能合约攻击,直接催生了以太坊与以太坊经典的分离,也是"重入攻击"的原型。
#安全#案例#重入攻击#以太坊#The DAO
一句话结论
The DAO 是智能合约历史上第一次重大安全事故,它让业界第一次意识到:代码漏洞的代价可以是整个网络的治理分裂。
事件经过
The DAO 是 2016 年基于以太坊的去中心化投资基金,通过众筹募集了约 1200 万个 ETH(当时约 1.5 亿美元),一度占以太坊全网 ETH 的 14%。
2016 年 6 月,攻击者利用合约提款逻辑中的重入漏洞,在合约尚未更新余额之前反复递归调用提款函数,把资金一批批转出,最终约 360 万个 ETH(当时约 5000–6000 万美元)被转入攻击者控制的分叉副本。
根本原因:先转账、后记账
问题出在资金提取函数的执行顺序:
- 先检查调用者的余额是否充足
- 先把 ETH 转给调用者
- 后才把调用者的余额清零
当收款方是一个恶意合约时,它可以在第 2 步收到 ETH 的那一刻重新调用提款函数。此时第 3 步还没执行,余额看起来仍然充足,于是再次通过校验、再次转账——如此循环。
为什么难处理
漏洞合约中锁着全网 14% 的 ETH,攻击者还设置了一个"拆分副本"机制拖延时间。社区最终选择通过硬分叉把资金追回,把攻击发生前的状态回滚。
这造成社区分裂:支持回滚的成为今天的以太坊(ETH),坚持"代码即法律、链上记录不可更改"的成为以太坊经典(ETC)。
给你的教训
- 重入攻击至今仍是最高频的合约漏洞之一,防御手段是「检查—生效—交互」(CEI)顺序,或用重入锁。
- 「代码即法律」在现实中会被社区治理打破——链上不等于绝对不可逆,重大事故可能以分叉收场。
- 对普通用户:不要只看协议收益率,要看它托管了多少资金、审计过几轮。托管量越大,被攻击的动机越强。