摘要:重入攻擊本質上與編程里的遞歸調用類似,當合約將以太幣發送到未知地址時就可能會發生,威脅以太坊智能合約的安全性。知道創宇區塊鏈安全實驗室?從轉賬方法、fallback函數、漏洞代碼、源碼分析四個方面入手,深入分析攻擊原因,詳解?The?DAO事件。
前言
智能合約的概念于1995年由NickSzabo首次提出,它是一種旨在以信息化方式傳播、驗證或執行合同的計算機協議,它允許在沒有第三方的情況下進行可信交易,這些交易可追蹤且不可逆轉。
然而智能合約也并非是安全的,其中?重入(Re-Entrance)攻擊?漏洞是以太坊中的攻擊方式之一,早在2016年就因為TheDAO事件而造成了以太坊的硬分叉。
漏洞概述
在以太坊中,智能合約能夠調用其他外部合約的代碼,由于智能合約可以調用外部合約或者發送以太幣,這些操作需要合約提交外部的調用,所以這些合約外部的調用就可以被攻擊者利用造成攻擊劫持,使得被攻擊合約在任意位置重新執行,繞過原代碼中的限制條件,從而發生重入攻擊。重入攻擊本質上與編程里的遞歸調用類似,所以當合約將以太幣發送到未知地址時就可能會發生。
簡單的來說,發生重入攻擊漏洞的條件有2個:
調用了外部的合約且該合約是不安全的
外部合約的函數調用早于狀態變量的修改
下面給出一個簡單的代碼片段示例:
Bondly獲OKEx Blockdream Ventrues投資 雙方將深入探索NFT領域:據官方消息,Bondly已獲OKEx Blockdream Ventrues(OKEx BDV)投資,雙方將深入探索NFT領域,為NFT優質區塊鏈項目發展提供服務和資源支持。一方面,Bondly將通過NFT形式為OKEx BDV合作的優質項目提供LaunchPad服務;另一方面,雙方共同把優秀品牌帶到Bprotect,也將以NFT創新形式與OKExChain生態資產進行品牌合作。
Bondly是一種可互操作、透明、便捷的資產兌換協議,旨在徹底改變傳統的資產托管方法,并使每個藝術創作人都能進入自己的數字市場,旗下產品包括BSwap(NFT發售平臺)、Bondly LaunchPad(IDO平臺)、BProtect(NFT交易平臺)。OKEx BDV初始資金1 億美金,致力于發現和投資最前沿的產品技術創新類區塊鏈項目,投資方向包括基礎設施、交易及金融項目、公鏈生態類項目、應用類流量入口等。[2021/5/6 21:28:39]
上述代碼片段就是最簡單的提款操作,接下來會給大家詳細分析重入攻擊造成的原因。
漏洞分析
在正式的分析重入攻擊之前,我們先來介紹幾個重點知識。
轉賬方法
由于重入攻擊會發送在轉賬操作時,而Solidity中常用的轉賬方法為
<address>.transfer(),<address>.send()和<address>.gas().call.vale()(),下面對這3種轉賬方法進行說明:
北京方正公證處楊和平:與騰訊在多個方面達成深入合作:金色財經報道,4月17日,騰訊安全領御區塊鏈-北京方正公證取證平臺正式發布。在發布會上,北京方正公證處副主任楊和平表示:“區塊鏈作為一種可以在完全不信任的節點之間建立信任機制的技術,具有高可靠度、高透明度、可追溯、永久保存和無法篡改的特性,這些特性與公證的職業要求和行業發展需求具有天然的融合性、互補性,特別是在公證三大效力之一的證據效力方面雙方高度契合。騰訊安全與北京市方正公證處聯合打造的領御區塊鏈北京方正公證取證平臺,就是要在深度整合兩者優勢基礎上通過國家公信力+技術信任力的雙重增信,向社會提供電子證據安全存儲、取證維權、在線公證等智能化服務,從而形成一套規范和標準的互聯網數據公證服務新模式。”
此外,北京方正公證處副主任楊和平還介紹說,未來方正公證處與騰訊將在以下幾方面進行深度合作:1、構件新型公證法律服務業態上進行新的探索;2、拓展公證服務領域上取得新的突破;3、提升公證服務效率上再上新臺階;4、人才培養方面積累新經驗;5、體制機制建設上走出新路子;6、公證服務助力互聯網方面走出新天地。[2020/4/17]
<address>.transfer():只會發送2300gas進行調用,當發送失敗時會通過throw來進行回滾操作,從而防止了重入攻擊。
<address>.send():只會發送2300gas進行調用,當發送失敗時會返回布爾值false,從而防止了重入攻擊。
<address>.gas().call.vale()():在調用時會發送所有的gas,當發送失敗時會返回布爾值false,不能有效的防止重入攻擊。
聲音 | 華軟資本董事長:負利率是否會影響未來數字貨幣信用或可計算交易體系值得深入探索:12月18日,華軟資本董事長、華夏新供給經濟學研究院院長在第一財經發布評論文章。文章表示,負利率對下一階段的貨幣形態發展帶來新的不確定性,也許為“另辟蹊徑”提供某些啟發。隨著信息技術和互聯網的發展,貨幣及其價值傳遞方式出現了根本性的轉變,以信用卡、網銀和移動支付為代表的電子貨幣,以及數字貨幣、區塊鏈和加密資產等都在快速發展。特別是以Facebook籌備計劃推出Libra(天秤座)為代表,其目標是發展成為一種“不企求對美元匯率穩定而追求實際購買力穩定”的加密數字貨幣,這對未來數字貨幣的重要性、演化形態和利率價格等引發了全球關注。與此同時,中國央行主導的主權數字貨幣DCEP已有實質進展,歐洲央行也開始考慮發行公共數字貨幣的多種方案。數字化相當程度上加速了全球資金流動,可以部分解釋利率下行原因,但負利率是否會影響未來數字貨幣的信用或可計算交易體系,更值得深入探索的。[2019/12/19]
fallback函數
接著我們來講解下fallback回退函數。
回退函數(fallbackfunction):回退函數是每個合約中有且僅有一個沒有名字的函數,并且該函數無參數,無返回值,如下所示:
function()publicpayable{???
???...
}
回退函數在以下幾種情況中被執行:
調用合約時沒有匹配到任何一個函數;
沒有傳數據;
智能合約收到以太幣。
聲音 | 井通科技李軍:區塊鏈發展階段正在深入但預期一致可能引發黑天鵝:12月5日消息,井通科技副總裁李軍在談論區塊鏈未來時表示,區塊鏈發展第一階段已經過去,第二階段已經深入場景,隨著階段深入,底層核心技術擁有更加深遠的前景,但值得注意的是,預期一致往往會引發黑天鵝,需要各方警惕。[2019/12/5]
漏洞代碼
下面的代碼就是存在重入攻擊的,實現的是一個類似于公共錢包的合約,所有的用戶都可以使用deposit()存款到Reentrance合約中,也可以從Reentrance合約中使用withdraw()進行提款,當然了所有人也可以使用balanceof()查詢自己或者其他人在該合約中的余額。
首先使用一個賬戶(0x5B38Da6a701c568545dCfcB03FcB875f56beddC4)扮演受害者,將該合約在RemixIDE?點擊Deploy按鈕進行部署。
在部署合約成功后在VALUE設置框中填寫5,將單位改成ether,點擊deposit存入5個以太幣。
點擊wallet查看該合約的余額,發現余額為5ether,說明我們的存款成功。
聲音 | 張平文:區塊鏈等已經深入到市民生活的方方面面:月10日至11日,2019世界計算機大會在湖南長沙舉行,中國科學院院士張平文說,計算機包括5G、云計算、大數據、人工智能、區塊鏈等,已經深入到市民生活的方方面面。[2019/9/15]
而下面的代碼則是針對上面存在漏洞的合約進行的攻擊:
使用另外一個賬戶(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:THEALLDAO區塊鏈EthermonFootball BattleBoringDAO LTC區塊鏈專業怎么樣
據彭博報道,新加坡金融管理局首席金融科技官SopnenduMohanty近日在接受采訪時表示,自新加坡監管機構2020年1月頒布新的《支付服務法》以來.
1900/1/1 0:00:001.Kusama平行鏈插槽拍賣進入倒計時:眾貸項目進展如何?已經沒有任何已知的技術問題阻礙平行鏈上線了.
1900/1/1 0:00:00無論是幣圈業內人還是傳統領域圈外人,大凡關注區塊鏈行業時間長了,都會經受一次次的靈魂拷問:區塊鏈行業之于社會的核心價值到底是什么?一方面.
1900/1/1 0:00:00行情 | 美股區塊鏈概念股漲跌各異:今日美股收盤,美股區塊鏈概念股漲跌各異。柯達收跌0.02%,埃森哲收跌2.41%,Overstock.com收跌0.16%,Riot Blockchain收漲.
1900/1/1 0:00:00本文來自數字金融資產研究中心,作者鄒傳偉。 引言 在人類社會的數字化大遷徙中,分布式商業的影響越來越大.
1900/1/1 0:00:00受MicroStrategy將發行4億美元債券以購買更多比特幣的消息影響,比特幣周一日內曾逆轉周末頹勢小幅走高,然而北京時間周二凌晨05:15左右,比特幣突然跳水,數分鐘內跌超2000美元.
1900/1/1 0:00:00