區(qū)塊鏈安全事件回顧之The DAO被黑事件區(qū)塊鏈
曲速區(qū):2016年6月17日,加密貨幣和區(qū)塊鏈社區(qū)發(fā)生了一次大地震,theDAO被黑客攻擊了。價(jià)值6千萬(wàn)美元的以太幣被盜!!朋友圈,微信群一下子炸開(kāi)了鍋。
曲速區(qū):只有不忘歷史才能展望未來(lái),在接下來(lái)這段時(shí)間里曲速區(qū)將帶你一起回顧區(qū)塊鏈安全事件總結(jié)與區(qū)塊鏈技術(shù)展望。
二、THE DAO被黑事件詳細(xì)回顧
今天我們來(lái)說(shuō)第二個(gè)被盜事件: The DAO 被黑事件
二、以太幣組織 The DAO 被黑事件解析
時(shí)間:2016年6月
北京時(shí)間2016年6月17日發(fā)生了在區(qū)塊鏈歷史上留下沉重一筆的攻擊事件。由于 其編寫(xiě)的智能合約存在著重大缺陷,區(qū)塊鏈業(yè)界最大的眾籌項(xiàng)目TheDAO(被攻擊前 擁有1億美元左右資產(chǎn))遭到攻擊,目前已導(dǎo)致300多萬(wàn)以太幣資產(chǎn)被分離出TheDAO 資產(chǎn)池。TheDAO編寫(xiě)的智能合約中有一個(gè)splitDAO函數(shù),攻擊者通過(guò)此函數(shù)中的漏洞重復(fù)利用自己的DAO資產(chǎn)來(lái)不斷從TheDAO項(xiàng)目的資產(chǎn)池中分離DAO資產(chǎn)給自己。
TheDAO 被攻擊,攻擊利用兩個(gè)代碼漏洞創(chuàng)建子合約提取了360萬(wàn)個(gè)以太幣。因?yàn)楣粽呤峭ㄟ^(guò)splitDAO開(kāi)始攻擊。我們從splitDAO代碼開(kāi)始分析
函數(shù)調(diào)用者只能是TokenHolder。不能是ether賬戶(hù)。這里沒(méi)什么問(wèn)題,符合預(yù)期
splitDAO的代碼有點(diǎn)長(zhǎng),我們看到如下的代碼
在這里是計(jì)算需要支付的金額,然后調(diào)用createTokenProxy函數(shù)。我們需要記住這點(diǎn)。根據(jù)BLOG 2,在DAO.sol中,function splitDAO函數(shù)有這樣一行:
合約中,為msg.sender記錄的dao幣余額歸零、扣減dao幣總量totalSupply等等都發(fā)生在將發(fā)回msg.sender之后,這里是在Blog 1中指出的一個(gè)典型“反模式”。
接下來(lái)看withdrawRewardFor函數(shù)。目前github中所見(jiàn)最新代碼并非部署于Ethereum livenet的代碼:
paidOut[_account] = reward 在原來(lái)代碼里面放在payOut函數(shù)調(diào)用之后,最新github代碼中被移到了payOut之前。再看payOut函數(shù)調(diào)用。rewardAccount的類(lèi)型是ManagedAccount,在ManagedAccount.sol中可以看到:
_recipient.call.value()() 這個(gè)函數(shù)調(diào)用時(shí),轉(zhuǎn)賬_amount個(gè)Wei,call調(diào)用默認(rèn)會(huì)使用當(dāng)前剩余的所有g(shù)as,此時(shí)call調(diào)用所執(zhí)行的代碼步驟數(shù)可能很多,基本只受攻擊者所發(fā)消息的可用的gas限制。
把這些拼起來(lái),黑客的攻擊手法就浮現(xiàn)了:
我們現(xiàn)在可以建立一個(gè)攻擊合約。
創(chuàng)建一個(gè)錢(qián)包,調(diào)用splitDAO多次,直到到達(dá)合約的gas limit,或者stack limit。
創(chuàng)建一個(gè)分割提案到一個(gè)新的錢(qián)包地址。
等待7天。
調(diào)用splitDAO
調(diào)用了兩次splitDAO,withdrawRewardFor也調(diào)用了兩次,并且兩次都是成功。成功竊取ether。
所以一定要先重置變量,再調(diào)用發(fā)送函數(shù)。
從代碼看,本次攻擊得逞的因素有二:一是dao余額扣減和Ether轉(zhuǎn)賬這兩步操作的順序有誤,二是不受限制地執(zhí)行未知代碼。
曲速未來(lái)實(shí)驗(yàn)室表示:本次黑客事件不意味著以太坊乃至去中心化、區(qū)塊鏈的終結(jié)。雖然教訓(xùn)深刻,但如果能夠汲取教訓(xùn),那么從中獲益的不僅僅是THE DAO, 以太坊,整個(gè)區(qū)塊鏈社區(qū)都將從中獲益。
1.TMT觀察網(wǎng)遵循行業(yè)規(guī)范,任何轉(zhuǎn)載的稿件都會(huì)明確標(biāo)注作者和來(lái)源;
2.TMT觀察網(wǎng)的原創(chuàng)文章,請(qǐng)轉(zhuǎn)載時(shí)務(wù)必注明文章作者和"來(lái)源:TMT觀察網(wǎng)",不尊重原創(chuàng)的行為T(mén)MT觀察網(wǎng)或?qū)⒆肪控?zé)任;
3.作者投稿可能會(huì)經(jīng)TMT觀察網(wǎng)編輯修改或補(bǔ)充。