比特幣行情 比特幣行情
Ctrl+D 比特幣行情
ads
首頁 > ADA > Info

THE:深入理解重入攻擊漏洞

Author:

Time:1900/1/1 0:00:00

前言

智能合約的概念于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函數

三星宣布啟動Discord服務器以深入Web3.0領域:6月7日消息,三星(Samsung)宣布啟動Samsung US Discord官方服務器,以加深與消費者的聯系并培養創作者社區。在Samsung US Discord中,粉絲、游戲玩家和創作者能夠互動,并可以獲得對產品、活動、NFT等的獨家訪問權。在6月7日的前24小時內,服務器的早期采用者將獲得OG角色。[2022/6/7 4:09:03]

接著我們來講解下fallback回退函數。回退函數(fallbackfunction):回退函數是每個合約中有且僅有一個沒有名字的函數,并且該函數無參數,無返回值,如下所示:

回退函數在以下幾種情況中被執行:調用合約時沒有匹配到任何一個函數;沒有傳數據;智能合約收到以太幣。03漏洞代碼

下面的代碼就是存在重入攻擊的,實現的是一個類似于公共錢包的合約,所有的用戶都可以使用deposit()存款到Reentrance合約中,也可以從Reentrance合約中使用withdraw()進行提款,當然了所有人也可以使用balanceof()查詢自己或者其他人在該合約中的余額。

首先使用一個賬戶(0x5B38Da6a701c568545dCfcB03FcB875f56beddC4)扮演受害者,將該合約在RemixIDE點擊Deploy按鈕進行部署。

國務院辦公廳:深入推進人工智能社會實驗,開展區塊鏈創新應用試點:1月6日消息,國務院辦公廳發布關于印發要素市場化配置綜合改革試點總體方案的通知,通知指出,發揮領軍企業和行業組織作用,推動人工智能、區塊鏈、車聯網、物聯網等領域數據采集標準化。深入推進人工智能社會實驗,開展區塊鏈創新應用試點。[2022/1/6 8:29:41]

在部署合約成功后在VALUE設置框中填寫5,將單位改成ether,點擊deposit存入5個以太幣。

點擊wallet查看該合約的余額,發現余額為5ether,說明我們的存款成功。

而下面的代碼則是針對上面存在漏洞的合約進行的攻擊:

全國政協原副主席陳元:深入推進區塊鏈創新發展 積小勝為大勝:金色財經現場報道,2020年8月14日,全球區塊鏈創新發展大會于江西贛州開幕,會上全國政協原副主席、國家開發銀行董事長陳元致辭表示,贛州搶抓區塊鏈技術發展機遇,是一件非常有意義的事情,是前景光明的新方向。目前區塊鏈已經廣泛運用在多個領域,希望贛州和各界持續貫徹區塊鏈發展精神,深入推進區塊鏈創新發展,積小勝為大勝。[2020/8/14]

使用另外一個賬戶(0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2)扮演攻擊者,復制存在漏洞的合約地址到Deploy的設置框內,點擊Deploy部署上面的攻擊合約。

部署成功后先調用wallet()函數查看攻擊合約的余額為0。

攻擊者先存款1ether到漏洞合約中,這里設置VALUE為1ether,之后點擊攻擊合約的deposit進行存款。

山西深入推進跨境金融區塊鏈服務平臺應用:國家外匯管理局山西省分局深入推進跨境金融區塊鏈服務平臺應用,為中小微外貿企業跨境結算與融資擴渠道、增便利。目前,山西省已有17家銀行加入該平臺,為16家企業辦理融資業務116筆,累計放款7.67億美元。(中國新聞網)[2020/5/3]

再次調用合約的wallet函數查看漏洞合約的余額,發現已經變成了6ether。

攻擊者(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決定了要轉移的代幣數量。

聲音 | 香港金融發展局董事:香港金融服務的質量將隨著區塊鏈等應用的深入進一步提升:據新華網報道,中共中央、國務院日前印發了《粵港澳大灣區發展規劃綱要》,大灣區共同家園投資有限公司總裁、香港金融發展局董事胡章宏表示,伴隨新的政策出臺,大灣區建設國際科技創新中心,香港打造一系列新的中心、平臺以及發展特色金融等目標的推進,香港金融體系的結構將愈發豐富。隨著區塊鏈等科技應用的深入以及金融科技等新業態的不斷培育,香港金融服務的質量和效率也將進一步提升。[2019/2/21]

下面的代碼則是進行提款獎勵操作,每次攻擊者調用這項功能時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:THE區塊鏈DAOALLAthena Returns Olea區塊鏈技術通俗講解pptNil DAOEuroFootball AI

ADA
比特幣:彭博社長篇報告:為什么牛市還未結束?

原標題:BloombergCryptoOutlook–DiscountedandRefreshed;報告作者:MikeMcGlone|彭博BI高級商品策略分析師;編譯及整理:MaryLiu.

1900/1/1 0:00:00
BIT:賬戶地址是什么?| 不一樣的「DFINITY」詞貼

DFINITY互聯網計算機由于底層的區塊鏈技術,其賬戶系統算法與比特幣等公鏈項目類似。DFINITY賬戶的驗證機制也是從中種子派生公私鑰對,并通過公鑰處理編碼為字符串地址,通過私鑰簽名發送消息,

1900/1/1 0:00:00
MIX:MixMarvel提供百萬福利回饋用戶,火箭協議完成120萬美元融資|五月要聞

上月回顧 上月,MixMarvel與DAOSquare達成戰略合作,并參加了多場AMA活動,向全球用戶展示了MixMarvel孵化與合作的多個項目.

1900/1/1 0:00:00
BAY:IC Drive是什么? |不一樣的「DFINITY」詞貼

Web2.0時代中心化存儲在安全性、隱私性以及所有權等方面存在的弊端已經逐漸突顯,各類分布式存儲項目應運而生.

1900/1/1 0:00:00
NFT:支付寶發售的NFT不轉移作品版權,這合理嗎?

撰文:0x13,律動BlockBeats近日,支付寶推出的基于螞蟻鏈的付款碼NFT皮膚引起了社會各界的廣泛關注.

1900/1/1 0:00:00
STA:Starling Lab如何建立對人類數據的信任

在大數據飛速發展的時代背景下,互聯網上的信息除了具備數據量大、結構多樣性等特點之外,還有一個重要的特點就是真假難辨.

1900/1/1 0:00:00
ads