以太坊交易所 以太坊交易所
Ctrl+D 以太坊交易所
ads
首頁 > XRP > Info

深入理解重入攻擊漏洞_區塊鏈:ALL

Author:

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

摘要:重入攻擊本質上與編程里的遞歸調用類似,當合約將以太幣發送到未知地址時就可能會發生,威脅以太坊智能合約的安全性。知道創宇區塊鏈安全實驗室?從轉賬方法、fallback函數、漏洞代碼、源碼分析四個方面入手,深入分析攻擊原因,詳解?The?DAO事件。

前言

智能合約的概念于1995年由NickSzabo首次提出,它是一種旨在以信息化方式傳播、驗證或執行合同的計算機協議,它允許在沒有第三方的情況下進行可信交易,這些交易可追蹤且不可逆轉。

然而智能合約也并非是安全的,其中?重入(Re-Entrance)攻擊?漏洞是以太坊中的攻擊方式之一,早在2016年就因為TheDAO事件而造成了以太坊的硬分叉。

漏洞概述

在以太坊中,智能合約能夠調用其他外部合約的代碼,由于智能合約可以調用外部合約或者發送以太幣,這些操作需要合約提交外部的調用,所以這些合約外部的調用就可以被攻擊者利用造成攻擊劫持,使得被攻擊合約在任意位置重新執行,繞過原代碼中的限制條件,從而發生重入攻擊。重入攻擊本質上與編程里的遞歸調用類似,所以當合約將以太幣發送到未知地址時就可能會發生。

多鏈DeFi平臺Rubic正在深入研究允許RBC被用作稅收資產:官方消息,多鏈DeFi平臺Rubic宣布,作為一個額外的用例,正在深入研究允許RBC被用作稅收資產。此外,Rubic表示,在新UI的工作接近完成后,BSC Polygon橋等將在不久后啟動。[2021/6/24 0:02:35]

簡單的來說,發生重入攻擊漏洞的條件有2個:

調用了外部的合約且該合約是不安全的

外部合約的函數調用早于狀態變量的修改

下面給出一個簡單的代碼片段示例:

上述代碼片段就是最簡單的提款操作,接下來會給大家詳細分析重入攻擊造成的原因。

漏洞分析

在正式的分析重入攻擊之前,我們先來介紹幾個重點知識。

轉賬方法

由于重入攻擊會發送在轉賬操作時,而Solidity中常用的轉賬方法為

.transfer(),.send()和.gas().call.vale()(),下面對這3種轉賬方法進行說明:

對沖基金Third Point CEO:一直在深入研究加密貨幣:美國紐約對沖基金Third Point 首席執行官Daniel Loeb表示其一直在深入研究加密貨幣。(U.Today)[2021/3/1 18:05:03]

.transfer():只會發送2300gas進行調用,當發送失敗時會通過throw來進行回滾操作,從而防止了重入攻擊。

.send():只會發送2300gas進行調用,當發送失敗時會返回布爾值false,從而防止了重入攻擊。

.gas().call.vale()():在調用時會發送所有的gas,當發送失敗時會返回布爾值false,不能有效的防止重入攻擊。fallback函數

接著我們來講解下fallback回退函數。

回退函數(fallbackfunction):回退函數是每個合約中有且僅有一個沒有名字的函數,并且該函數無參數,無返回值,如下所示:

function()publicpayable{???

聲音 | 河北辛集副市長:大力推進“區塊鏈+智能制造”的深入融合:12月27日,河北省鋼鐵行業“區塊鏈+智能制造”主題峰會在石家莊辛集市舉行,峰會由河北省冶金行業協會、中國電信河北分公司、長城新媒體集團主辦。辛集市副市長牛軍波表示,冶金行業的發展對于辛集市的經濟建設起到舉足輕重的作用,目前鋼鐵行業的自動化、信息化的發展已具有良好的基礎。大力推進“區塊鏈+智能制造”的深入融合,可以為鋼鐵行業帶來全面的提升,在提高企業競爭力、打造優質產品方面提供有力支持。(長城網)[2019/12/27]

???...

}

回退函數在以下幾種情況中被執行:

調用合約時沒有匹配到任何一個函數;

沒有傳數據;

智能合約收到以太幣。

漏洞代碼

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

聲音 | 法中委員會秘書長林碧溪:中法兩國深入區塊鏈及人工智能合作:據人民網消息,2018年第五屆中法團隊合作創新獎即將在巴黎揭幕,法中委員會秘書長林碧溪表示,今年提交的候選項目中,區塊鏈、人工智能、數字化工具的項目明顯增加,且涉及領域非常廣泛,覆蓋核電站老化預測的解決方案、區塊鏈學歷認證及智慧城市能源管理等領域。林碧溪指出,中法兩國創新合作的多樣性,體現在創新合作的跨領域特征中。當今世界技術革新非常迅速,從區塊鏈、人工智能到數字應用,都需要中法合作團隊及時掌握并適應形勢,才能致力于開發未來的新技術。[2018/11/30]

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

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

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

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

現場 | 姜海:密碼學將隨著黎曼猜想等理論研究的深入迎來大發展:金色財經現場報道,今日,2018可信區塊鏈峰會在北京召開。在主題為“區塊鏈安全焦點關注”的區塊鏈安全論壇上,丁牛科技有限公司CEO姜海結合最近黎曼猜想被證明引起了密碼學界的高度關注,分析了黎曼猜想與區塊鏈密碼安全。他提出,盡管黎曼猜想的證明對于傳統密碼安全有極大的沖擊,但是區塊鏈技術的安全建立在SHA-256、橢圓曲線、算法校驗等基礎之上,在使用過程中能夠極大地抵抗密碼攻擊。盡管最近有很多的安全事件發生,而其根本原因在于程序的違規操作。未來隨著隨機發生器、量子計算機以及黎曼幾個等基礎理論的研究,密碼學將會有更大的發展空間。[2018/10/10]

使用另外一個賬戶(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:THE區塊鏈DAOALLKILLTHEZERO區塊鏈上班都是干什么的Metaverse-Daomathwalletspro

XRP
燕子窠肉桂|武夷正巖,名門“桂”族_比特幣:NET

在武夷山有個叫燕子窠的地方,這里青山披翠、景色宜人,是武夷巖茶中上品“正巖茶”的主產區之一。今年3月,它走進全國人民的視線,作為武夷山首選“視”茶產地,迅速帶火“燕子窠”肉桂.

1900/1/1 0:00:00
幣虎6月8日上線PIKA_NFT:URG

尊敬的用戶: 幣虎將上線PIKA,并在創新區開通PIKA/USDT交易市場,具體詳情如下:1.開放充幣:2021年6月8日14:00;2.開放交易:2021年6月8日18:00;3.開放提幣:2.

1900/1/1 0:00:00
關于TORO延遲上線的公告_TPS:FTX

尊敬的用戶: 由于項目調整,TORO將延遲上線,充提業務也將延遲開啟。具體上線時間待定,后續會以公告告知。請您留意公告內容。為您帶來不便,敬請諒解.

1900/1/1 0:00:00
WEB支持快捷買幣_UNB:NFT

尊敬的合作伙伴: 為使您在為全球用戶提供數字貨幣交易服務時,打造更完善、便捷的入金體驗,OKEx云在原有OTC法幣交易系統外,上線了快捷買幣功能,目前已支持web端的功能配置.

1900/1/1 0:00:00
MATIC交易持倉競賽 贏10000USDT清涼壕禮_MAT:泰達幣USDT發行

尊敬的用戶: 夏日炎炎,WBF推出“MATIC交易&持倉競賽贏10000USDT清涼獎勵”,讓您在六月酷暑中享受片刻清涼.

1900/1/1 0:00:00
CyberFM Radio是什么?_CYB:Numbers Protocol

大家好!QDeFiRating和NOAH的ARK很高興提出我們團隊進行的另一項評論。訂閱我們的B站頻道,觀看實用的教程和精彩訪談,隨時在其中找到最新的DeFi排名和評論.

1900/1/1 0:00:00
ads