前言
智能合約的概念于1995年由NickSzabo首次提出,它是一種旨在以信息化方式傳播、驗證或執行合同的計算機協議,它允許在沒有第三方的情況下進行可信交易,這些交易可追蹤且不可逆轉。然而智能合約也并非是安全的,其中重入(Re-Entrance)攻擊漏洞是以太坊中的攻擊方式之一,早在2016年就因為TheDAO事件而造成了以太坊的硬分叉。漏洞概述
在以太坊中,智能合約能夠調用其他外部合約的代碼,由于智能合約可以調用外部合約或者發送以太幣,這些操作需要合約提交外部的調用,所以這些合約外部的調用就可以被攻擊者利用造成攻擊劫持,使得被攻擊合約在任意位置重新執行,繞過原代碼中的限制條件,從而發生重入攻擊。重入攻擊本質上與編程里的遞歸調用類似,所以當合約將以太幣發送到未知地址時就可能會發生。簡單的來說,發生重入攻擊漏洞的條件有2個:調用了外部的合約且該合約是不安全的外部合約的函數調用早于狀態變量的修改下面給出一個簡單的代碼片段示例:
上述代碼片段就是最簡單的提款操作,接下來會給大家詳細分析重入攻擊造成的原因。漏洞分析
在正式的分析重入攻擊之前,我們先來介紹幾個重點知識。01轉賬方法
由于重入攻擊會發送在轉賬操作時,而Solidity中常用的轉賬方法為<address>.transfer(),<address>.send()和<address>.gas().call.vale()(),下面對這3種轉賬方法進行說明:<address>.transfer():只會發送2300gas進行調用,當發送失敗時會通過throw來進行回滾操作,從而防止了重入攻擊。<address>.send():只會發送2300gas進行調用,當發送失敗時會返回布爾值false,從而防止了重入攻擊。<address>.gas().call.vale()():在調用時會發送所有的gas,當發送失敗時會返回布爾值false,不能有效的防止重入攻擊。02fallback函數
火幣區塊鏈研究院李慧:未來銀行會更加深入布局區塊鏈技術:4月7日消息,火幣區塊鏈研究院副院長李慧表示,未來銀行業對區塊鏈技術布局會否更加深入的答案是肯定的。她認為,“通過區塊鏈技術的嵌入,銀行實現原有業務基礎上的降本提效,并且吸納更多客戶,達到雙贏局面。上面所提到的區塊鏈在銀行各業務的布局以B2B業務居多,隨著區塊鏈技術的普及與發展,銀行會逐漸將區塊鏈布局到更多的toC業務領域,如信用卡積分管理等。”(證券日報)[2020/4/7]
接著我們來講解下fallback回退函數。回退函數(fallbackfunction):回退函數是每個合約中有且僅有一個沒有名字的函數,并且該函數無參數,無返回值,如下所示:
回退函數在以下幾種情況中被執行:調用合約時沒有匹配到任何一個函數;沒有傳數據;智能合約收到以太幣。03漏洞代碼
下面的代碼就是存在重入攻擊的,實現的是一個類似于公共錢包的合約,所有的用戶都可以使用deposit()存款到Reentrance合約中,也可以從Reentrance合約中使用withdraw()進行提款,當然了所有人也可以使用balanceof()查詢自己或者其他人在該合約中的余額。
聲音 | 原保監會副主席:區塊鏈等技術通過保險業務流程全面深入,提升了保險行業的業務效率:金色財經報道,近日,全國政協經濟委員會委員、國務院參事室特約研究員、原保監會副主席周延禮在“三亞財經國際論壇——全球格局變化下的應對與抉擇”上表示,近年來,科技和互聯網巨頭跨入保險界,大數據與人工智能成為保險科技的主要驅動力,大數據、云計算、區塊鏈、人工智能等技術通過保險業務流程全面地深入,提升了保險行業的業務效率,改變了產品形態與服務的交互方式,新的商業模式和保險生態隨之而產生。[2019/12/11]
首先使用一個賬戶(0x5B38Da6a701c568545dCfcB03FcB875f56beddC4)扮演受害者,將該合約在RemixIDE點擊Deploy按鈕進行部署。
在部署合約成功后在VALUE設置框中填寫5,將單位改成ether,點擊deposit存入5個以太幣。
點擊wallet查看該合約的余額,發現余額為5ether,說明我們的存款成功。
動態 | 2019年7月國內一級市場區塊鏈融資10強發布 區塊鏈行業的發展不斷向產業端深入:據中國金融信息網報道,8月8日,中國金融信息網與烯牛數據聯合發布2019年7月份國內一級市場區塊鏈項目融資10強榜單。從榜單來看,在整體融資大幅下滑的趨勢下,2019年7月份國內區塊鏈項目融資數量出現回升。監測數據顯示,數字貨幣和交易平臺類融資項目明顯增多,天秤幣白皮書的發布在一定程度上提振了市場預期,但是此類項目將面臨與天秤幣的直接競爭,其商業邏輯未來或將受到天秤幣嚴酷打壓。與實體經濟結合的項目依然占據著榜單的主流,分別涉及金融、大數據、交通運輸、電商、傳媒、產權、房地產和游戲領域。從連續發布的榜單來看,區塊鏈行業的發展不斷向產業端深入,應用端的開發落地越來越具體,與實體經濟結合發展的想象空間逐漸立體化。從技術角度來看,加密、數據庫、共識、P2P和智能合約的發展日益成熟,區塊鏈作為集成性創新技術的發揮邊界正在逐步拓展。[2019/8/8]
而下面的代碼則是針對上面存在漏洞的合約進行的攻擊:
使用另外一個賬戶(0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2)扮演攻擊者,復制存在漏洞的合約地址到Deploy的設置框內,點擊Deploy部署上面的攻擊合約。
Binance Labs主管Christy Choi:正與對區塊鏈和加密貨幣有深入見解的基金進行合作:今日Binance Labs主管Christy Choi在reddit的Ask Me Anything環節表示,幣安生態系統基金的目的是確定和支持對整個生態系統產生持久影響的項目。因此目前正在與關心整個行業、對投資負責、對區塊鏈和加密貨幣有深入見解的基金進行合作。只要關心生態系統并建立一個健康的產業,BNB最終會變得更好。[2018/6/7]
部署成功后先調用wallet()函數查看攻擊合約的余額為0。
攻擊者先存款1ether到漏洞合約中,這里設置VALUE為1ether,之后點擊攻擊合約的deposit進行存款。
再次調用合約的wallet函數查看漏洞合約的余額,發現已經變成了6ether。
五糧液牽手IBM 將在區塊鏈等方面展開深入合作:近日,在宜賓舉行的五糧液(000858.SZ)數字化轉型項目啟動大會上,五糧液和IBM雙方表示,將在區塊鏈、云計算、人工智能等領先科技方面進行深入的合作應用,借用IBM豐富的行業數字化轉型經驗和技術,按照“年輕化”“低度化”“數字化”“國際化”的創新思維,帶動酒業乃至及“大機械、大物流、大包裝、大金融、大健康”五大板塊快速有序發展,助力五糧液構建“智慧商業”模式,實現高質量發展。[2018/4/29]
攻擊者(0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2)調用攻擊合約的attack函數模擬攻擊,之后調用被攻擊合約的wallet函數去查看合約的余額,發現已經歸零,此時回到攻擊合約查看余額,發現被攻擊合約中的6ether已經全部提款到了攻擊者合約中,這就造成了重入攻擊。
04源碼分析
上面講解了如何進行重入攻擊已經漏洞原因,這里梳理了漏洞源碼和攻擊的步驟,列出了關鍵代碼。
相關案例
2016年6月17日,TheDAO項目遭到了重入攻擊,導致了300多萬個以太幣被從TheDAO資產池中分離出來,而攻擊者利用TheDAO智能合約中的splitDAO()函數重復利用自己的DAO資產進行重入攻擊,不斷的從TheDAO項目的資產池中將DAO資產分離出來并轉移到自己的賬戶中。下列代碼為splitDAO()函數中的部分代碼,源代碼在TokenCreation.sol中,它會將代幣從theparentDAO轉移到thechildDAO中。平衡數組uintfundsToBeMoved=(balances*p.splitData.splitBalance)/p.splitData.totalSupply決定了要轉移的代幣數量。
下面的代碼則是進行提款獎勵操作,每次攻擊者調用這項功能時p.splitData都是一樣的,并且p.splitData.totalSupply與balances的值由于函數順序問題,發生在了轉賬操作之后,并沒有被更新。
paidOut+=reward更新狀態變量放在了問題代碼payOut函數調用之后。
對_recipient發出.call.value調用,轉賬_amount個Wei,.call.value調用默認會使用當前剩余的所有gas。
解決辦法
通過上面對重入攻擊的分析,我們可以發現重入攻擊漏洞的重點在于使用了fallback等函數回調自己造成遞歸調用進行循環轉賬操作,所以針對重入攻擊漏洞的解決辦法有以下幾種。01使用其他轉賬函數
在進行以太幣轉賬發送給外部地址時使用Solidity內置的transfer()函數,因為transfer()轉賬時只會發送2300gas進行調用,這將不足以調用另一份合約,使用transfer()重寫原合約的withdraw()如下:
02先修改狀態變量
這種方式就是確保狀態變量的修改要早于轉賬操作,即Solidity官方推薦的檢查-生效-交互模式(checks-effects-interactions)。
03使用互斥鎖
互斥鎖就是添加一個在代碼執行過程中鎖定合約的狀態變量以防止重入攻擊。
04使用OpenZeppelin官方庫
OpenZeppelin官方庫中有一個專門針對重入攻擊的安全合約:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/security/ReentrancyGuard.sol
參考文獻
1.以太坊的幾次硬分叉:https://zhuanlan.zhihu.com/p/1114467922.以太坊智能合約安全漏洞(1):重入攻擊:https://blog.csdn.net/henrynote/article/details/821191163.區塊鏈的那些事—THEDAO攻擊事件源碼分析:https://blog.csdn.net/Flyhps/article/details/83095036
Tags:區塊鏈THEALLDAO區塊鏈運用的技術中不包括哪一項基本技術Mytheriatrustwallet支持usdt嗎Church Dao
波卡生態觀察,是我們針對Polkadot生態內的項目,以不同生態位的視角來觀察和分析的一個專題欄目.
1900/1/1 0:00:00本文來自Glassnode,Odaily星球日報|Moni編譯 2021年5月,在經歷了比特幣歷史上最具戲劇性的暴跌之后,投資者的信念開始受到考驗.
1900/1/1 0:00:00根據DefiLlama的數據,目前DeFi總鎖倉已經跌破1000億美元大關,頭部借貸項目AAVA、Comp的鎖倉量在一周內下跌了近23%,頭部去中心化交易所Uniswap也在近一周下跌了21%.
1900/1/1 0:00:00歐易OKEx情報局行業周報帶你快速回顧行業動態,厘清產業動向。目錄:行情概覽機構與公司動態加密貨幣市場Polkadot/DeFi/Layer2動態行業聲音行情概覽根據CoinGecko數據,截至.
1900/1/1 0:00:00“我是個數字資產的超級信仰者,改變世界是我的使命。”說完這句話,Neo大笑起來。從2015年接觸比特幣以來,Neo便義無反顧地跳入加密貨幣的“兔子洞”中.
1900/1/1 0:00:00PolkaWorld上周四舉辦了第5次的「不懂就問」線上視頻直播,統一回答了大家的問題,并將一些常見問題整理成文字版,方便大家查閱.
1900/1/1 0:00:00