在区块链和智能合约的发展历程中,安全事件始终是推动技术成熟和完善的重要力量,以太坊上的“The DAO”重入攻击事件,无疑是智能合约领域最具里程碑意义的案例之一,它不仅导致了以太坊社区的剧烈分裂和硬分叉,更深刻地揭示了智能合约编程中一个至关重要的安全漏洞——重入漏洞(Reentrancy Vulnerability),并为后续的智能合约安全开发敲响了警钟。
事件背景:雄心勃勃的“The DAO”
“The DAO”(Decentralized Autonomous Organization,去中心化自治组织)是2016年启动的一个基于以太坊平台的智能合约项目,旨在创建一个去中心化的风险投资基金,由社区共同治理,其理念是通过智能合约实现资金的自动管理、提案和投票,无需中心化机构干预,The DAO的众筹规模空前,在短短数月内募集了超过1500万个以太币(当时价值约1.5亿美元),占据了当时以太坊总供应量的很大一部分,被誉为以太坊生态系统中最伟大的实验之一。
攻击发生:重入漏洞的致命一击
The DAO的智能合约中存在一个致命的重入漏洞,重入漏洞是指一个外部合约在调用另一个合约的函数时,能够在该函数执行完毕并返回之前,多次)调用同一个函数,这就像一个不速之客在别人家做客时,反复按门铃,让主人一次又一次开门,从而有机会窃取家中财物。
The DAO的漏洞主要存在于其“splitFunction”和“withdrawRequest”等函数中,当用户请求从The DAO中提取资金时,合约会先记录用户的提款请求,然后尝试将相应的以太币转移到用户的地址,但在这个过程中,合约在转移资金之前,没有正确地更新用户的内部状态(将用户的可用余额先扣除),这就给了攻击者可乘之机。
攻击者(或攻击团伙)利用这个漏洞,构造了一个恶意合约,当他们调用The DAO的提款函数时:
- The DAO合约记录了提款请求,但未立即扣除攻击者的余额。
- The DAO合约向攻击者的恶意合约地址转发了以太币。
- 恶意合约在收到以太币后,由于fallback函数(回调函数)的特性,会立即再次调用The DAO的提款函数,请求提取更多的资金。
- 由于The DAO合约的状态仍未更新,它认为攻击者仍有余额可供提取,于是再次进行转账。
- 这个过程循环往复,直到The DAO合约中攻击者名下的“可提取”资金被全部转走,或者达到了以太坊区块gas的限制。
通过这种方式,攻击者成功从The DAO中窃取了价值约5000万美元的以太币,引发了以太坊社区的巨大恐慌和混乱。
事件影响:硬分叉与社区分裂








