前言
智能合約的概念于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函數
彭博社:美CFTC和SEC正在深入調查三箭資本:金色財經報道,兩位知情人士透露,美國商品期貨交易委員會(CFTC)和證券交易委員會(SEC)目前正在深入調查三箭資本(Three Arrows Capital),以確定該公司是否違反了規則,在資產負債表方面誤導投資者,并且沒有在兩家監管機構注冊。兩家機構均拒絕置評,但其審查可能導致對公司和個人處以罰款和其他處罰。
此前報道,總部位于新加坡的三箭公司于7月申請破產,稱其業務“在加密貨幣市場劇烈波動后崩潰”,三箭聯合創始人Su Zhu和Kyle Davies目前仍下落不明,導致該破產案的清算人及其律師無法追蹤,清算人向法院申請通過二人的電子郵件地址、Twitter帳戶及其律師的電子郵件地址送達傳票。(彭博社)[2022/10/18 17:29:38]
接著我們來講解下fallback回退函數。回退函數(fallbackfunction):回退函數是每個合約中有且僅有一個沒有名字的函數,并且該函數無參數,無返回值,如下所示:
回退函數在以下幾種情況中被執行:調用合約時沒有匹配到任何一個函數;沒有傳數據;智能合約收到以太幣。03漏洞代碼
下面的代碼就是存在重入攻擊的,實現的是一個類似于公共錢包的合約,所有的用戶都可以使用deposit()存款到Reentrance合約中,也可以從Reentrance合約中使用withdraw()進行提款,當然了所有人也可以使用balanceof()查詢自己或者其他人在該合約中的余額。
吉林省法院部署2020年工作:要深入推進區塊鏈技術創新應用:2月28日,吉林省法院召開網絡安全和信息化領導小組2020年第一次會議,聽取2019年全省法院網絡安全和信息化建設情況匯報,研究部署2020年工作。會議要求,要以重點任務為抓手,全面加快智慧法院建設工作。深入推進區塊鏈技術創新應用,全面加快業務場景的創新應用研發。(新浪網)[2020/2/29]
首先使用一個賬戶(0x5B38Da6a701c568545dCfcB03FcB875f56beddC4)扮演受害者,將該合約在RemixIDE點擊Deploy按鈕進行部署。
在部署合約成功后在VALUE設置框中填寫5,將單位改成ether,點擊deposit存入5個以太幣。
點擊wallet查看該合約的余額,發現余額為5ether,說明我們的存款成功。
聲音 | 大連港:將繼續開拓區塊鏈技術 深入開展創新工作:金色財經報道,大連港(601880)被提問“除了區塊鏈電子放貨平臺之外,接下來還有什么區塊鏈項目落地”時表示,目前,大連港利用區塊鏈的去中心化、不可篡改、共享賬本等特征所建立的區塊鏈信任機制,使業務信息公開透明公正,借助區塊鏈的數據加密作用強化數據信息安全功能,確保數據的安全性、完整性和一致性,使船、輪駁公司、智慧港口平臺各方都能實時、安全、無縫地傳遞拖輪作業信息,實現全程留痕和全程可追溯,滿足輪駁業務的安全性和準確性要求。未來大連港還將繼續開拓區塊鏈技術業務實現場景,深入開展創新工作,在全港口領域推行區塊鏈技術應用落地。(上證e互動)[2019/10/30]
而下面的代碼則是針對上面存在漏洞的合約進行的攻擊:
使用另外一個賬戶(0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2)扮演攻擊者,復制存在漏洞的合約地址到Deploy的設置框內,點擊Deploy部署上面的攻擊合約。
聲音 | 平安銀行高管:運用區塊鏈等深入生態場景重塑征信模型:據人民網報道,在“金蟬獎”頒獎典禮上,平安銀行交易銀行事業部副總裁許紅輝表示,平安銀行正在實現貸前、貸中和貸后風險的全程閉環控制。運用大數據、區塊鏈、物聯網等技術,深入生態場景重塑征信模型,并基于真實貿易背景跟單放款,確保銀行融資能夠真正支持實體經濟。[2018/12/30]
部署成功后先調用wallet()函數查看攻擊合約的余額為0。
攻擊者先存款1ether到漏洞合約中,這里設置VALUE為1ether,之后點擊攻擊合約的deposit進行存款。
再次調用合約的wallet函數查看漏洞合約的余額,發現已經變成了6ether。
攻擊者(0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2)調用攻擊合約的attack函數模擬攻擊,之后調用被攻擊合約的wallet函數去查看合約的余額,發現已經歸零,此時回到攻擊合約查看余額,發現被攻擊合約中的6ether已經全部提款到了攻擊者合約中,這就造成了重入攻擊。
北京市委書記蔡奇:深入研究區塊鏈技術及應用,打造產業集群:昨天上午,北京市召開網絡安全和信息化工作會議,北京市委書記蔡奇強調,堅持以信息化培育新動能推動新發展,使信息化成為首都發展的新動能、城市治理的新手段、公共服務的新方式,切實增強人民群眾的獲得感幸福感安全感。大力發展數字經濟,深入實施大數據和云計算發展行動計劃,深入研究區塊鏈技術及應用,打造產業集群。優化電子政務,推進全市統一的基礎公共云平臺建設,進一步打破信息壁壘、提升服務效率,讓百姓少跑腿、信息多跑路。[2018/5/26]
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區塊鏈證據保全怎么操作視頻Not Another Shit AltcoinCBDAOMallcoin
這幾天一連用了好幾篇文章和大家分享我對元宇宙的理解。在文章的末尾有讀者感覺對這個概念和文章中介紹的項目非常陌生,甚至覺得有點玄幻.
1900/1/1 0:00:00今天下午,備受期待的幣安NFT市場如期上線。作為首個由交易所推出的中心化NFT平臺,幣安NFT市場吸引了眾多社區NFT愛好者和收藏家關注.
1900/1/1 0:00:00收錄于話題#每日期權播報 播報數據由Greeks.live數據實驗室和Deribit官網提供。40000美元作為一個重要價格點位,值得多震蕩一段時間.
1900/1/1 0:00:00來源:EthereumCatHerders;作者:TimBeiko 在過去數月里,以太坊核心開發者一直在進行倫敦網絡升級的工作。它是繼柏林升級后的一次升級.
1900/1/1 0:00:00Bonus是基于DFINITY互聯網計算機的品牌忠誠度激勵系統,曾在2020年9月份DFINITY舉辦的Tungsten演示日中亮相.
1900/1/1 0:00:00在互聯網上,內容的可持續性面臨著兩個基本的問題:尋址和永續性。尋址指的是互聯網用戶在線上尋找內容的方式。現有的互聯網傾向于位置尋址或通過內容的存放位置尋找內容,而不是依賴于內容尋址.
1900/1/1 0:00:00