前言
智能合約的概念于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函數
順網科技與中數鏈簽訂合作協議:將在元宇宙等方面開展深入合作:7金色財經報道,日前,順網科技與中數鏈(上海)簽訂框架合作協議,公司旗下元宇宙瞬元智能鏈、Meta CJ將與對方展開包含資本性合作在內的全面深入合作。中數鏈是國版鏈的超級節點運營機構,是一家整合了專業的區塊鏈、web3.0應用技術,鏈接了豐富的文化數字化上下游生態資源的元宇宙技術及應用解決方案的機構。當下,順網科技則在不斷完善元宇宙算力基礎設施+應用層生態建設。[2022/7/23 2:33:07]
接著我們來講解下fallback回退函數。回退函數(fallbackfunction):回退函數是每個合約中有且僅有一個沒有名字的函數,并且該函數無參數,無返回值,如下所示:
回退函數在以下幾種情況中被執行:調用合約時沒有匹配到任何一個函數;沒有傳數據;智能合約收到以太幣。03漏洞代碼
下面的代碼就是存在重入攻擊的,實現的是一個類似于公共錢包的合約,所有的用戶都可以使用deposit()存款到Reentrance合約中,也可以從Reentrance合約中使用withdraw()進行提款,當然了所有人也可以使用balanceof()查詢自己或者其他人在該合約中的余額。
央行:加強科技支撐 深入開展“數字央行”建設:人民銀行2020年科技工作電視電話會議5月18日在北京召開。會議要求,加強科技支撐,深入開展“數字央行”建設,提升金融服務水平和金融監管能力;加強金融業網絡安全和信息化統籌指導,推動落實金融領域密碼應用與創新發展,筑牢金融網絡安全屏障;推動金融科技高質量發展,提升金融服務實體經濟能力;推進LEI應用,優化標準供給,提升金融標準治理水平。[2020/5/19]
首先使用一個賬戶(0x5B38Da6a701c568545dCfcB03FcB875f56beddC4)扮演受害者,將該合約在RemixIDE點擊Deploy按鈕進行部署。
在部署合約成功后在VALUE設置框中填寫5,將單位改成ether,點擊deposit存入5個以太幣。
點擊wallet查看該合約的余額,發現余額為5ether,說明我們的存款成功。
而下面的代碼則是針對上面存在漏洞的合約進行的攻擊:
聲音 | 中國科學院院士:深入貫徹落實密碼法 推動商用密碼標準制定與產業發展:中國科學院院士王小云針對深入貫徹落實密碼法、推動商用密碼標準制定與產業發展有以下幾點認識:1.密碼法準確界定了密碼的定義與內涵;2.加快推進商用密碼產業發展、頂層設計并完善商用密碼檢測認證體系;3.加大密碼核心關鍵技術的自主創新能力與標準制定,貢獻中國密碼的智慧與方案;4.加快雄安新區同步規劃與建設密碼防護體系;5.加快推進以密碼技術為支撐的區塊鏈技術研發以及試點工程,加快區塊鏈行業標準、國家標準以及國際標準制定進程;6.動密碼專業建設與學科發展,加大規模化密碼人才培養力度。(經濟參考報)[2019/11/21]
使用另外一個賬戶(0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2)扮演攻擊者,復制存在漏洞的合約地址到Deploy的設置框內,點擊Deploy部署上面的攻擊合約。
部署成功后先調用wallet()函數查看攻擊合約的余額為0。
現場 | 姜海:密碼學將隨著黎曼猜想等理論研究的深入迎來大發展:金色財經現場報道,今日,2018可信區塊鏈峰會在北京召開。在主題為“區塊鏈安全焦點關注”的區塊鏈安全論壇上,丁牛科技有限公司CEO姜海結合最近黎曼猜想被證明引起了密碼學界的高度關注,分析了黎曼猜想與區塊鏈密碼安全。他提出,盡管黎曼猜想的證明對于傳統密碼安全有極大的沖擊,但是區塊鏈技術的安全建立在SHA-256、橢圓曲線、算法校驗等基礎之上,在使用過程中能夠極大地抵抗密碼攻擊。盡管最近有很多的安全事件發生,而其根本原因在于程序的違規操作。未來隨著隨機發生器、量子計算機以及黎曼幾個等基礎理論的研究,密碼學將會有更大的發展空間。[2018/10/10]
攻擊者先存款1ether到漏洞合約中,這里設置VALUE為1ether,之后點擊攻擊合約的deposit進行存款。
再次調用合約的wallet函數查看漏洞合約的余額,發現已經變成了6ether。
德國證券交易所正深入研究是否推出比特幣期貨等相關產品:據ccn援引彭博社消息,德意志交易所(Deutsche Boerse)正在深入研究是否提供比特幣期貨和其他加密貨幣的相關產品。在一次行業盛會上,該公司的客戶,產品和核心市場負責人Jeffrey Tessler稱:“德意志交易所在推進比特幣之前,希望確保理解比特幣之下的交易,這不是最容易的一件事。我們正在深入地了解之中,希望了解波動性,想要確保客戶協調,及監管機構的協調。”Tessler表示,盡管CEM和CBOE在一個交易日期間比特幣期貨交易量多達6.7億美元,但目前沒有任何一家主要的歐洲交易所列出比特幣或其他加密貨幣的衍生產品。據悉,德意志交易所已經參與了區塊鏈實驗,他們今年3月份與流動性管理公司HQLAx合作,利用R3的Corda平臺開發基于區塊鏈的證券借貸平臺。[2018/5/24]
攻擊者(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:THEDAOALL區塊鏈The SwapperyTGDAO幣ALL BEST ICO SATOSHI區塊鏈技術通俗講解無中介
隨著區塊鏈技術的普及與應用,智能合約作為區塊鏈技術的底層技術之一,不論是在學術界還是產業界都引起了極大的關注.
1900/1/1 0:00:00NFT藝術拍賣——“METAVERSE:數字孿生” 部分NFT拍品 NFT內容創作者的收入較2022年峰值下降98%:金色財經報道,根據 Token Terminal 的數據.
1900/1/1 0:00:00自最近一輪牛市周期開始以來,Tether的USDT穩定幣已經經歷了巨大的供應量增長。與2017-2018年周期的高峰時期相比,當前的USDT流通量增加了一個數量級.
1900/1/1 0:00:00鏈上和價格數據可以用來預測我們在比特幣市場周期中所處的位置。本文,我們將回顧2020-2021牛市的第一輪,以及在市場引起的動蕩。之后,我們將建立一個案例,解釋為什么這個市場周期的頂端還沒到來.
1900/1/1 0:00:00跨界動態: 德國跑車巨頭保時捷數字子公司Forward31推出NFT初創公司Fanzone,專注于以足球為主題的NFT收藏品.
1900/1/1 0:00:00出處:區塊鏈情報速遞pro;作者:BrendaNgari;編譯:貝貝;星球日報經授權轉載薩爾瓦多這兩天徹底火了,除了要把比特幣作為國家法定貨幣.
1900/1/1 0:00:00