比特幣交易所 比特幣交易所
Ctrl+D 比特幣交易所
ads
首頁 > 幣贏 > Info

深入理解重入攻擊漏洞_DAO

Author:

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

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

前言

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

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

漏洞概述

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

G20會議:鼓勵繼續深入分析央行數字貨幣在促進跨境支付方面的潛在作用:10月31日, 二十國集團領導人第十六次峰會于10月30日至31日在意大利首都羅馬以線上線下相結合方式舉行。峰會通過了《二十國集團領導人羅馬峰會宣言》。摘要如下:

我們歡迎金融穩定理事會從金融穩定角度總結新冠肺炎疫情教訓的最終報告以及下步建議。我們鼓勵繼續深入分析央行數字貨幣在促進跨境支付方面的潛在作用及其對國際貨幣體系更廣泛的影響。(經濟日報)[2021/11/1 6:24:01]

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

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

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

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

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

漏洞分析

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

轉賬方法

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

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

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

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

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

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

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

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

動態 | 《加快推進上海金融科技中心建設實施方案》:推動區塊鏈等技術深入研發攻關:1月15日,上海市地方金融監督管理局會同國家在滬金融管理部門共同召開新聞通氣會,宣傳介紹《加快推進上海金融科技中心建設實施方案》(以下簡稱《實施方案》)。《實施方案》指出,全速推進金融科技關鍵技術研發。積極推動大數據、人工智能、區塊鏈、5G等新興技術深入研發攻關,推動技術創新與金融創新的融合發展。深化芯片、算法、云計算等基礎技術攻關,提升金融創新的基礎技術支撐能力。統籌布局安全、穩定、高效的信息基礎設施,積極爭取國家級金融科技重大項目和平臺在滬落地。(第一財經)[2020/1/15]

function()publicpayable{???

???...

}

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

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

沒有傳數據;

智能合約收到以太幣。

漏洞代碼

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

聲音 | 中國科學院院士:區塊鏈等已經深入到市民生活的方方面面:9月10日至11日,2019世界計算機大會在湖南長沙舉行,中國科學院院士張平文說,計算機包括5G、云計算、大數據、人工智能、區塊鏈等,已經深入到市民生活的方方面面。(中國新聞網)[2019/9/12]

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

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

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

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

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

安永與Coinbase達成長期深入合作,前者為后者IPO提供全方位輔導:據悉,全球四大會計師事務所之一的安永于近期與全球知名的數字貨幣交易所和錢包服務提供商Coinbase達成長期深入合作,安永將組建包括審計部門、咨詢部門、并購部門和稅務部門的跨條線的Fintech專家團隊為Coinbase提供第三方鑒證審計,同時為Coinbase的IPO提供全方位的輔導。[2018/3/27]

部署成功后先調用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:THEDAOALLTRATHEX價格AnteDAOFootball DecentralizedTRAVEL價格

幣贏
BKEX Global 關于上線GAL( Galatasaray Fan Token)的公告_KEX

尊敬的用戶:?????? ??? BKEXGlobal即將上線GAL,并上線GAL/USDT聚合交易對.

1900/1/1 0:00:00
加密市場安全事故頻發,我們有什么更好的解決辦法嗎?_DEF

全球范圍的加密市場盡管已經發展超過了10年,但這10年中并不是一帆風順,一方面是行業外部監管和政策的壓制,另一方面還來源于行業本身發生的一系列安全事件,尤其是交易所的安全事件,常常令人錯愕.

1900/1/1 0:00:00
HomiEx(紅米交易所)關于上線TAX/USDT交易對的公告_TPS

親愛的用戶: HomiEx將于2021年6月5日15:00(UTC8)上線TAX/USDT交易對.

1900/1/1 0:00:00
楚悅辰:6.4馬斯克配圖比特幣心碎,又要開始搞事情了?_比特幣

當前幣圈最無奈的事,無論比特幣的忠實信仰者以及老主流的支持者多么看不上狗狗幣和馬斯克,昨天的這一波上漲,也要將一定的功勞算給馬斯克和狗狗幣.

1900/1/1 0:00:00
元宇宙起源:通往數字文明之路_METAV

如果提到Metaverse,你第一反應是Roblox、堡壘之夜甚至是原神,基本說明你對它一無所知.

1900/1/1 0:00:00
比特幣向上調整到位,耐心等待新的中線空頭信號出現!_比特幣

比特幣周圖 今天有朋友心急火燎地問我:比特幣現在在上漲,我做了空單;我想你告訴我現在的空頭格局是否完整,空單是否需要離場,還是繼續拿著?其實我們的交易策略,每次都是提前寫在文章之中.

1900/1/1 0:00:00
ads