摘要:重入攻擊本質上與編程里的遞歸調用類似,當合約將以太幣發送到未知地址時就可能會發生,威脅以太坊智能合約的安全性。知道創宇區塊鏈安全實驗室?從轉賬方法、fallback函數、漏洞代碼、源碼分析四個方面入手,深入分析攻擊原因,詳解?The?DAO事件。
前言
智能合約的概念于1995年由NickSzabo首次提出,它是一種旨在以信息化方式傳播、驗證或執行合同的計算機協議,它允許在沒有第三方的情況下進行可信交易,這些交易可追蹤且不可逆轉。
然而智能合約也并非是安全的,其中?重入(Re-Entrance)攻擊?漏洞是以太坊中的攻擊方式之一,早在2016年就因為TheDAO事件而造成了以太坊的硬分叉。
漏洞概述
在以太坊中,智能合約能夠調用其他外部合約的代碼,由于智能合約可以調用外部合約或者發送以太幣,這些操作需要合約提交外部的調用,所以這些合約外部的調用就可以被攻擊者利用造成攻擊劫持,使得被攻擊合約在任意位置重新執行,繞過原代碼中的限制條件,從而發生重入攻擊。重入攻擊本質上與編程里的遞歸調用類似,所以當合約將以太幣發送到未知地址時就可能會發生。
G20會議:鼓勵繼續深入分析央行數字貨幣在促進跨境支付方面的潛在作用:10月31日, 二十國集團領導人第十六次峰會于10月30日至31日在意大利首都羅馬以線上線下相結合方式舉行。峰會通過了《二十國集團領導人羅馬峰會宣言》。摘要如下:
我們歡迎金融穩定理事會從金融穩定角度總結新冠肺炎疫情教訓的最終報告以及下步建議。我們鼓勵繼續深入分析央行數字貨幣在促進跨境支付方面的潛在作用及其對國際貨幣體系更廣泛的影響。(經濟日報)[2021/11/1 6:24:01]
簡單的來說,發生重入攻擊漏洞的條件有2個:
調用了外部的合約且該合約是不安全的
外部合約的函數調用早于狀態變量的修改
下面給出一個簡單的代碼片段示例:
上述代碼片段就是最簡單的提款操作,接下來會給大家詳細分析重入攻擊造成的原因。
漏洞分析
在正式的分析重入攻擊之前,我們先來介紹幾個重點知識。
轉賬方法
由于重入攻擊會發送在轉賬操作時,而Solidity中常用的轉賬方法為
教育部等六部門:深入應用區塊鏈等信息技術,推動教育數字轉型:7月21日消息,教育部等六部門發布《關于推進教育新型基礎設施建設構建高質量教育支撐體系的指導意見》。指導意見提出,深入應用5G、人工智能、大數據、云計算、區塊鏈等新一代信息技術,充分發揮數據作為新型生產要素的作用,推動教育數字轉型。利用區塊鏈技術保護知識產權,探索個性化資源購買使用和后付費機制。通過用戶評價和第三方評估相結合的方式,推動數字資源迭代更新。(教育部官網)[2021/7/21 1:07:07]
.transfer(),.send()和.gas().call.vale()(),下面對這3種轉賬方法進行說明:
.transfer():只會發送2300gas進行調用,當發送失敗時會通過throw來進行回滾操作,從而防止了重入攻擊。
.send():只會發送2300gas進行調用,當發送失敗時會返回布爾值false,從而防止了重入攻擊。
.gas().call.vale()():在調用時會發送所有的gas,當發送失敗時會返回布爾值false,不能有效的防止重入攻擊。fallback函數
工行業務總監:區塊鏈等技術在金融行業得到深入應用:工商銀行信息科技業務總監呂仲濤在接受記者采訪時表示,從技術基礎上看,中國正在躋身全球金融科技發展的“第一梯隊”,人工智能、大數據、區塊鏈等新技術在金融行業得到深入應用,很多銀行都在積極建設新技術平臺。從實踐運用上看,各行也紛紛加強金融科技的頂層設計和實施運用。他表示,經此一疫,各行業將加快生產要素、生產關系的重組升級和生產方式的變革突破,推動產業互聯網建設,進而推動金融服務供需關系的重塑。(經濟參考報)[2020/5/21]
接著我們來講解下fallback回退函數。
回退函數(fallbackfunction):回退函數是每個合約中有且僅有一個沒有名字的函數,并且該函數無參數,無返回值,如下所示:
function()publicpayable{???
???...
}
回退函數在以下幾種情況中被執行:
調用合約時沒有匹配到任何一個函數;
沒有傳數據;
外匯管理局山西省分局深入推進跨境金融區塊鏈服務平臺應用:外匯管理局山西省分局近日出臺了《國家外匯管理局山西省分局關于千方百計支持中小微外貿企業復工復產健康發展的指導意見》,提出多項具體措施精準幫扶中小微外貿企業。在緩解融資難題方面,深入推進跨境金融區塊鏈服務平臺應用,為中小微外貿企業跨境結算與融資擴渠道、增便利。(生活晨報)[2020/5/8]
智能合約收到以太幣。
漏洞代碼
下面的代碼就是存在重入攻擊的,實現的是一個類似于公共錢包的合約,所有的用戶都可以使用deposit()存款到Reentrance合約中,也可以從Reentrance合約中使用withdraw()進行提款,當然了所有人也可以使用balanceof()查詢自己或者其他人在該合約中的余額。
首先使用一個賬戶(0x5B38Da6a701c568545dCfcB03FcB875f56beddC4)扮演受害者,將該合約在RemixIDE?點擊Deploy按鈕進行部署。
在部署合約成功后在VALUE設置框中填寫5,將單位改成ether,點擊deposit存入5個以太幣。
聲音 | 中國銀行支付清算部總經理:商業銀行借助區塊鏈等技術,深入分析客戶行為以提升支付效率:金色財經報道,11月28日,中國銀行支付清算部總經理范耀勝在第八屆中國支付清算論壇上指出,如今數字化轉型已經成為商業銀行共同關注融入和推動的行業趨勢,主要體現在一智能化,借助大數據、機器學習、區塊鏈等技術,深入分析客戶行為,提升支付效率,實現安全便捷的統一。[2019/11/29]
點擊wallet查看該合約的余額,發現余額為5ether,說明我們的存款成功。
而下面的代碼則是針對上面存在漏洞的合約進行的攻擊:
使用另外一個賬戶(0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2)扮演攻擊者,復制存在漏洞的合約地址到Deploy的設置框內,點擊Deploy部署上面的攻擊合約。
部署成功后先調用wallet()函數查看攻擊合約的余額為0。
攻擊者先存款1ether到漏洞合約中,這里設置VALUE為1ether,之后點擊攻擊合約的deposit進行存款。
再次調用合約的wallet函數查看漏洞合約的余額,發現已經變成了6ether。
攻擊者(0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2)調用攻擊合約的attack函數模擬攻擊,之后調用被攻擊合約的wallet函數去查看合約的余額,發現已經歸零,此時回到攻擊合約查看余額,發現被攻擊合約中的6ether已經全部提款到了攻擊者合約中,這就造成了重入攻擊。
源碼分析
上面講解了如何進行重入攻擊已經漏洞原因,這里梳理了漏洞源碼和攻擊的步驟,列出了關鍵代碼。
相關案例
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等函數回調自己造成遞歸調用進行循環轉賬操作,所以針對重入攻擊漏洞的解決辦法有以下幾種。
使用其他轉賬函數
在進行以太幣轉賬發送給外部地址時使用Solidity內置的transfer()函數,因為transfer()轉賬時只會發送2300gas進行調用,這將不足以調用另一份合約,使用transfer()重寫原合約的withdraw()如下:
先修改狀態變量
這種方式就是確保狀態變量的修改要早于轉賬操作,即Solidity官方推薦的檢查-生效-交互模式(checks-effects-interactions)。
使用互斥鎖
互斥鎖就是添加一個在代碼執行過程中鎖定合約的狀態變量以防止重入攻擊。
使用?OpenZeppelin官方庫
OpenZeppelin官方庫中有一個專門針對重入攻擊的安全合約:
https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/security/ReentrancyGuard.sol
參考文獻
1.以太坊的幾次硬分叉:
https://zhuanlan.zhihu.com/p/111446792
2.以太坊智能合約安全漏洞(1):重入攻擊:
https://blog.csdn.net/henrynote/article/details/82119116
3.?區塊鏈的那些事—THEDAO攻擊事件源碼分析:
https://blog.csdn.net/Fly_hps/article/details/83095036
Tags:THEDAOALLTRAethereal深層含義GroupDaoAllianceBlock NexeraTrazable
尊敬的用戶: WBF即將在動物園專區上線ZLJ/USDT交易對,具體上線時間為:充值時間:2021/6/314:31提幣時間:2021/6/314:31交易時間:2021/6/313:31 項目.
1900/1/1 0:00:00大家好,我是來自CKcoin平臺首席分析師老崔說幣,也是你們的朋友老崔說幣lcsb18888,老崔說幣公眾號同步專注數字貨幣行情分析,爭取為廣大幣友傳遞最有價值的幣市信息.
1900/1/1 0:00:00在一次比特幣歷史上最糟糕的下跌之后,許多人懷疑加密市場是否已經達到頂峰。一次又一次的市場恐懼心理沖擊著市場,極度恐慌之后,對一些持有者產生了負面影響.
1900/1/1 0:00:006月3日14:00,KavaLabs中國區市場負責人Ticky?做客金色微訪談直播間,本次直播由金色財經花花主持,主題為“跨鏈再升級,Kava如何打造全覆蓋生態”.
1900/1/1 0:00:00尊敬的歐易OKEx用戶:2020年6月1日至2020年8月31日,OKB啟動了新一季度的回購銷毀.
1900/1/1 0:00:00四年一遇的減半行情已經結束了嗎?這是投資、挖礦、玩DeFi的用戶當前最大的疑問。繼今年4月份,比特幣價格創下64000多美元的高位以來,比特幣的價格一度縮水一半.
1900/1/1 0:00:00