以太坊交易所 以太坊交易所
Ctrl+D 以太坊交易所
ads

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

Author:

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

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

前言

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

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

漏洞概述

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

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

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

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

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

加拿大央行正在招聘深入了解數字貨幣的經濟學家:10月19日消息,加拿大央行正在招聘一位對金融技術和數字貨幣有深入了解的經濟學家,這可能是加拿大央行邁向數字貨幣(CBDC)一系列舉措的最新一步。根據官方頁面,經濟學家的職責將是監測和分析與電子資金和支付有關的最新發展,實施研究項目,編寫分析說明并致力于“ CBDC的潛在發展”。申請人必須滿足一系列要求,其中包括對比特幣、以太坊和其他主要加密貨幣平臺的深入了解,以及熟悉傳統支付系統。(Cointelegraph)[2020/10/19]

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

漏洞分析

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

轉賬方法

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

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

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

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

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

聲音 | 物美集團創始人張文中:區塊鏈僅靠熱度不能解決問題 須針對場景做深入開發:物美集團創始人張文中近日在接受采訪時表示,新技術對現有技術企業都會有比較大的影響。比如,最近大家談論比較多的區塊鏈對企業影響是必然的。但我們也應該清醒認識到,區塊鏈僅靠熱度不能解決問題,它必須針對所面對的場景做深入開發和挖掘,比如在食品追溯方面,如果能夠追溯源頭,這也能助力實體企業轉型。(聯商網)[2019/11/6]

fallback函數

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

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

function()publicpayable{???

???...

}

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

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

沒有傳數據;

智能合約收到以太幣。

漏洞代碼

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

聲音 | 科藍軟件:與螞蟻金服在區塊鏈方面已有廣泛深入的合作:科藍軟件(SZ300663)董秘在互動平臺回復投資者就“恒生減持公司股票,對科藍和螞蟻金服的影響及數字金融行業公司有那些進展”提問表示,科藍與螞蟻在互聯網銀行的前臺、中臺、后臺產品和項目以及區塊鏈方面已經有廣泛深入的合作,雙方是戰略層面的合作,并且還在繼續深化以及向其他領域擴展。 根據恒生電子(75.300,?1.19,1.61%)9月26日發布的公告:“(恒生)公司所持的科藍軟件股票的前期浮動盈利已計入公司本年度凈利潤中,本次出售使得科藍軟件股票部分前期浮動盈利已經轉化為現金收益”,恒生在科藍屬于財務性投資,正常減持。恒生和科藍都屬金融科技公司,因細分領域不同,所以沒有產品和項目合作關系,其減持對科藍發展沒有任何影響!在正在召開的云棲大會上,公司剛剛獲頒“阿里云專有云首批行業ISV合作伙伴認證”,與螞蟻共創的“電子渠道逸平臺解決方案”也在上月通過了V3版本兼容性測試認證。毋庸置疑,國內數字金融行業正在起飛,公司未來會與螞蟻一起,將更多創新的產品提供給客戶。[2019/9/27]

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

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

動態 | 區塊鏈等技術的疊加作用下已經深入生活各領域:據中國日報網消息,近日,“互聯網新勢力峰會”在杭州舉辦,峰會上主辦方公布了最能代表2018年互聯網產業新發展趨勢的9大“新勢力”,涵蓋辦公、旅游、音樂、出行、金融、社交、媒體、區塊鏈、母嬰9大場景。現場嘉賓認為,互聯網經過20年發展,在大數據、人工智能、區塊鏈等技術的疊加作用下已經深入生活各領域。時下互聯網經濟正處于消費互聯網下半場和產業互聯網上半場的轉型升級期,互聯網的下一個20年將深刻影響產業發展。[2019/1/23]

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

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

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

Binance Labs主管Christy Choi:正與對區塊鏈和加密貨幣有深入見解的基金進行合作:今日Binance Labs主管Christy Choi在reddit的Ask Me Anything環節表示,幣安生態系統基金的目的是確定和支持對整個生態系統產生持久影響的項目。因此目前正在與關心整個行業、對投資負責、對區塊鏈和加密貨幣有深入見解的基金進行合作。只要關心生態系統并建立一個健康的產業,BNB最終會變得更好。[2018/6/7]

部署成功后先調用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:THEALLDAO區塊鏈Mexican Peso Tetherallin幣圈DuckDaoDime鉑鏈幣區塊鏈下載

芝麻開門交易所下載
DeFi之道丨Nansen分析師:投資加密貨幣時常用的市場指標_EFI:DEFI S

本文來自Nansen,作者Yuffie?ユフィ我們可以用什么樣的指標來衡量加密貨幣市場的普遍興趣/情緒水平?市場是否過度看漲或看跌?CT上一些有影響力的交易員最近談到了指標水平的重要性.

1900/1/1 0:00:00
觀察 | 從matic的表現看Layer2的潛行與爆發_TIC:matic幣今日價格

原標題:《Layer2:潛行與爆發丨目擊》市場行情震蕩,加密社區正在尋找下一個潛力板塊。在項目分類上,投資者將投資標的簡單分為「共識幣」及「應用幣」兩個大類,共識幣以BTC、LTC、BCH為主,

1900/1/1 0:00:00
比特幣正式成為薩爾瓦多國法定貨幣,這意味著什么?_OIN:比特幣以太行情

北京時間6月9日消息,薩爾瓦多總統NayibBukele宣布其撰寫的《比特幣法》已得到薩爾瓦多國會絕大多數議員的批準,這意味著該法案將在90天后生效,而比特幣也將成為該國的法定貨幣.

1900/1/1 0:00:00
替代、橋接、DAO與價值捕獲 傳統金融狗眼中的DeFi投資第一性原理_EFI:比特幣

作為傳統金融狗,尤其還是一名二級市場行業研究人員,在科技新興產業領域的研究經歷讓我形成了從第一性原理出發開始思考的習慣,因此要在面對區塊鏈復雜的技術、機制、各類新名詞、新概念.

1900/1/1 0:00:00
BSC鏈上項目PancakeHunny被黑事件簡析_CAKE:KCAKE幣

事件概覽 北京時間6月3日11時11分,鏈必安-區塊鏈安全態勢感知平臺輿情監測顯示,BSC鏈上項目PancakeHunny遭遇黑客攻擊。據統計,此次攻擊事件中,黑客總共獲利43ETH.

1900/1/1 0:00:00
深度丨從黃金的演變看 BTC 的雙重應用曲線_比特幣:Bitget平臺幣

作者?|MichaelLevin摘要:在過去的十二年里,比特幣已經捕獲了人類的想象力。比特幣的故事也許比之前的任何高科技創新更誘人。它為人類的基礎層之一帶來了最前沿的創新:貨幣.

1900/1/1 0:00:00
ads