TheDAO 攻击事件分析

  • oo
  • 更新于 2024-07-25 17:02
  • 阅读 321

dao攻击:dao攻击是以太坊历史上第一次大型攻击事件,其攻击原理是重入攻击。dao攻击中一共进行了多次重入漏洞的攻击,这也体现了智能合约的一个弊端:上链的代码无法更改,倘若遭到了一次攻击,那这篇合约便作废了,想要保住里面的财产只能将财产转移出来,无法对原合约进行更改。因此,在合约上链之前需要确保

dao攻击: dao攻击是以太坊历史上第一次大型攻击事件,其攻击原理是重入攻击。dao攻击中一共进行了多次重入漏洞的攻击,这也体现了智能合约的一个弊端:上链的代码无法更改,倘若遭到了一次攻击,那这篇合约便作废了,想要保住里面的财产只能将财产转移出来,无法对原合约进行更改。因此,在合约上链之前需要确保合约的正确性。

事件中的主要合约地址 发起方: 0x793ea9692Ada1900fBd0B80FFFEc6E431fe8b391 DAO合约: 0xBB9bc244D798123fDe783fCc1C72d3Bb8C189413 攻击者一: 0xB656b2a9c3b2416437A811e07466cA712F5a5b5a 攻击者二: 0x969837498944aE1dC0DCAc2D0c65634c88729b2D 攻击合约: 0xc0ee9dB1a9E07cA63E4fF0d5FB6F86Bf68D47b89 攻击者三: 0xf35e2cc8e6523d683ed44870f5b7cc785051a77d 攻击合约: 0xF835A0247b0063C04EF22006eBe57c5F11977Cc4

事件中的相关合约地址: ManagedAccount: 0x807640A13483f8AC783c557fcDF27Be11ea4AC7A 0xd2e16A20dd7B1ae54fB0312209784478D069c7B0 0x17cD41543A3c3c77d5E372704C9577df09eEa003 参与方:0x4a574510c7014e4ae985403536074abe582adfc8 攻击者一: 0xB656b2a9c3b2416437A811e07466cA712F5a5b5a DarkDAO: 0x304a554a310C7e546dfe434669C62820b7D83490 其中DarkDAO是因为攻击者二的攻击合约首次调用splitDao函数创建的

事件中的重要交易hash: deploy:0xe9ebfecc2fa10100db51a4408d18193b3ac504584b51a4e55bdef1318f0a30f9 攻击者一给出提案 newProposal(_recipient=OxB656.….5a,_amount=O,_description='lonely so lonely',_transactionData=):0x5798fbc45e3b63832abc4984b0f3574a13545f415dd672cd8540cd71f735db56 以下均为攻击合约给攻击者部署的同一提案投票 vote(59,true):0x1de9b7db4d55af395518b83a49dafeOc37cb746e840ce9d4bc367cb050dbe6ac vote(59,true):0xb5ff2d7a165baba4ca8d7bf8223af9dcf956ec6a4f4f85dbdd3ebea0111251ed vote(59,true)0x0ec3f2488a93839524add10ea229e773f6bc891b4eb4794c3337d4495263790b

关键代码介绍: 提案结构体,结构体中存储的数据是否在任何时候都合乎预期是能否发现漏洞的关键,因此要深刻的理解结构体中的每一个变量的作用。 这是dao项目的使用者用于提交自己想法的提案,每一个提案都需要得到足够多的支持才会被采纳,被采纳的提案会给提案的使用者一定的奖励。

// newCurator == false 的提案表示由该 DAO 发起的一笔交易 // newCurator == true 的提案表示 DAO 的分裂 struct Proposal { // 或者如果 newCurator 为真,则为新 DAO 的拟议 Curator。 address recipient; // 如果提案被接受,将转移到 recipient 的金额。 // 如果提案被接受,amount 将转移到的地址,

uint amount;
// 提案的纯文本描述
string description;
// 表示投票期结束的 Unix 时间戳
uint votingDeadline;
// 如果提案的投票尚未计数,则为 True,否则为 False
bool open;
// 如果达到法定人数,投票已计数,并且多数同意,则为 True
bool proposalPassed;
// 用于检查提案有效性的哈希值
bytes32 proposalHash;
// 提案提交者在提交提案时添加的存款(以 wei 为单位)。
// 它来自 newProposal 调用的 msg.value。
uint proposalDeposit;
// 如果该提案是为了指定新的 Curator,则为 True
bool newCurator;
// 分裂 DAO 所需的数据
SplitData[] splitData;
// 支持提案的代币数量
uint yea;
// 反对提案的代币数量
uint nay;
// 用于检查股东是否投票支持的简单映射
mapping (address => bool) votedYes;
// 用于检查股东是否投票反对的简单映射
mapping (address => bool) votedNo;
// 创建提案的股东地址
address creator;

} } } } splitDAO:是用于创建一个新的DAO合约,然后将提案应用于新的DAO合约里,splitDAO会向调用者转账

4417212e86f694265e73a80f3c9d71b6.png

payOut:向传入的_recipient合约转账

} } }

function payOut(address _recipient, uint _amount) returns (bool) { if (msg.sender != owner || msg.value > 0 || (payOwnerOnly && _recipient != owner)) throw; if (_recipient.call.value(_amount)()) { PayOut(_recipient, _amount); return true; } else { return false; } }

大致攻击过程(若想知道更多攻击细节可以去以太坊浏览器https://etherscan.io并输入之前给出的地址进行学习): 首先,DAO的发起方部署DAO合约,参与方进行包括兑换token发布提案等一系列活动

cc430f0ee41ff2282b36491699244505.png

攻击者一:通过调用newProposal函数,创建一个新的提案 攻击者三:为攻击者一的提案投票 攻击者二:为攻击者一的提案投票,然后使用攻击合约调用splitDAO函数,攻击合约里面内置了重入攻击需要的fallback函数

eb2b5428f021099e6332ddee1dccb56c.png

点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

2 条评论

请先 登录 后评论
oo
oo
关注我,带你深入研究solidity机制,熟悉各种安全库和链上攻击