以太坊蜜罐智能合約之黑客的漏洞利用區(qū)塊鏈
DASPTOP10中的前三:重入漏洞、訪問控制、算數(shù)問題在這些蜜罐智能合約中均有體現(xiàn)。黑客在這場(chǎng)欺詐者的游戲中扮演著不可或缺的角色。
利用重入漏洞的 The DAO 事件直接導(dǎo)致了以太坊的硬分叉、利用整數(shù)溢出漏洞可能導(dǎo)致代幣交易出現(xiàn)問題。
私人銀行 (重入漏洞):
合約關(guān)鍵代碼如下:
了解過 DAO 事件以及重入漏洞可以很明顯地看出,CashOut() 存在重入漏洞。在了解重入漏洞之前,讓我們先了解三個(gè)知識(shí)點(diǎn):Solidity 的代碼執(zhí)行限制。
為了防止以太坊網(wǎng)絡(luò)被攻擊或?yàn)E用,智能合約執(zhí)行的每一步都需要消耗 gas,俗稱燃料。如果燃料消耗完了但合約沒有執(zhí)行完成,合約狀態(tài)會(huì)回滾。addr.call.value()(),通過 call() 的方式進(jìn)行轉(zhuǎn)賬,會(huì)傳遞目前所有的 gas 進(jìn)行調(diào)用。
回退函數(shù) fallback(): 回退函數(shù)將會(huì)在智能合約的 call 中被調(diào)用。如果我們調(diào)用合約中的 CashOut(),關(guān)鍵代碼的調(diào)用過程如下圖:
由于回退函數(shù)可控,如果我們?cè)诨赝撕瘮?shù)中再次調(diào)用 CashOut(),
由于滿足 _am<=balances[msg.sender] ,將會(huì)再次轉(zhuǎn)賬,因此不斷循環(huán),直至 合約中以太幣被轉(zhuǎn)完或 gas 消耗完。
根據(jù)上述分析寫出攻擊的代碼如下:
模擬的攻擊步驟如下:
正常用戶 A (地址:0x14723a09acff6d2a60dcdf7aa4aff308fddc160c)向該合約存入 50 ether。
惡意攻擊者 B (地址:0x583031d1113ad414f02576bd6afabfb302140225) 新建惡意智能合約 Attack,實(shí)施攻擊。不僅取出了自己存入的 10ether,還取出了 A 存入的 50ether。
用戶 A 的余額還是 50ether,而惡意攻擊者 B 的余額也因?yàn)榘l(fā)生溢出變成 115792089237316195423570985008687907853269984665640564039407584007913129639936。
雖然此時(shí)用戶 A 的余額仍然存在,但由于合約中已經(jīng)沒有以太幣了,所以 A 將無法取出其存入的 50 個(gè)以太幣根據(jù)以上的案例可以得出如下結(jié)論:
當(dāng)普通用戶將以太幣存取該蜜罐智能合約地址,他的代幣將會(huì)被惡意攻擊者通過重入攻擊取出,雖然他依舊能查到在該智能合約中存入的代幣數(shù)量,但將無法取出相應(yīng)的代幣。
1.TMT觀察網(wǎng)遵循行業(yè)規(guī)范,任何轉(zhuǎn)載的稿件都會(huì)明確標(biāo)注作者和來源;
2.TMT觀察網(wǎng)的原創(chuàng)文章,請(qǐng)轉(zhuǎn)載時(shí)務(wù)必注明文章作者和"來源:TMT觀察網(wǎng)",不尊重原創(chuàng)的行為TMT觀察網(wǎng)或?qū)⒆肪控?zé)任;
3.作者投稿可能會(huì)經(jīng)TMT觀察網(wǎng)編輯修改或補(bǔ)充。