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