買比特幣 買比特幣
Ctrl+D 買比特幣
ads

TRA:深入理解重入攻擊漏洞_ALL

Author:

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

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

前言

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

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

漏洞概述

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

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

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

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

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

上海:深入應用區塊鏈提升在線跨境結算功能:金色財經報道,上海市人民政府今日印發《關于本市加快發展外貿新業態新模式的實施意見》,其中指出將探索區塊鏈技術在貿易細分領域中的應用,建設數字貿易交易促進平臺,深入應用區塊鏈、大數據技術,提升在線跨境結算功能。[2021/10/15 20:32:30]

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

漏洞分析

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

轉賬方法

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

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

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

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

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

fallback函數

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

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

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

function()publicpayable{???

???...

}

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

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

沒有傳數據;

智能合約收到以太幣。

漏洞代碼

動態 | 區塊鏈等技術在物流、營銷、質量追溯等領域應用日趨深入:前瞻產業研究院發布《中國零售行業市場前瞻與投資戰略規劃分析報告》,其顯示,近年來,隨著電商環境、技術平臺和網購習慣的普及與完善,中國的零售業發生了翻天覆地的變化。例如,各大電商平臺的線下門店落地,與傳統零售商聯盟化趨勢加強,將線上線下資源進一步整合;人工智能、大數據、區塊鏈等技術在物流、營銷、質量追溯等領域應用日趨深入;電商流量加速分化,拼購模式、小程序電商、內容電商等新模式交易規模呈指數增長。[2019/5/10]

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

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

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

政策 | 人民銀行副行長范一飛:要深入推進央行數字貨幣研發:據中國人民銀行消息,人民銀行黨委委員、副行長范一飛強調,要加大改革創新力度,深入推進央行數字貨幣研發,進一步完善紀念幣發行機制,探索多元化發行基金倉儲模式,推動鈔票處理業務轉型。四是著力維護現金流通秩序,繼續推動大額現金管理先行先試,建立整治拒收現金長效機制,健全現金機具管理機制,進一步推進反假貨幣工作重心前移,加強虛擬貨幣監測監管。[2019/2/22]

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

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

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

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

貴陽高新區黨工委副書記黃昌祥:深入推進區塊鏈等技術與實體經濟深度融合:貴陽網6月4日報道, 日前,高新區黨工委副書記、管委會主任黃昌祥率隊對區內大數據創新平臺進行調研。黃昌祥要求,大力實施“千企引進”“萬企融合”“千企改造”等工程,推進“智力收割機”計劃,深入推進物聯網、人工智能、區塊鏈以及大數據與實體經濟深度融合,引領大數據技術創新、加快大數據產業聚集,構筑大數據產業生態體系,以大數據引領全區經濟實現高質量發展。[2018/6/4]

攻擊者先存款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:THEDAOALLTRAtogetherbnb完整攻略圖文DAO Makermathwallet錢包怎么轉幣Kasa Central

火必下載
以太坊:中幣行情看點:谷歌取消關于禁止加密交易所和錢包投放廣告的政策_CRU

本文由中幣研究院原創編輯 熱點摘要: 1.波卡智能合約平臺Clover先行網Sakura平行鏈競拍預眾貸已開啟;2.Winklevoss兄弟:以太坊年底價格將達5千至1萬美元.

1900/1/1 0:00:00
ETH:阻力重重 礦業終結只是時間問題?_SPILLWAYS

經過5月19日的暴跌后,全球加密市場并未完全恢復元氣。內蒙古對礦業的禁令、特斯拉CEO馬斯克多次責備BTC挖礦不環保等等,幣價萎靡不振,不少業內人士認為熊市已經來臨,而加密礦業也岌岌可危.

1900/1/1 0:00:00
加密貨幣:彭博社分析師:“打折”的比特幣在2021年更有可能達到10萬美元,而不是2萬美元_加密貨幣市場還有未來嗎

彭博社高級大宗商品策略師MikeMcGlone表示,盡管比特幣(BTC)在5月份大幅下跌,但比特幣牛市似乎還在,10萬美元的目標價格比回調到2萬美元的可能性更大.

1900/1/1 0:00:00
數字貨幣:數字貨幣教父-David Chaum_AUM幣

導讀: 大衛·喬姆是一位在40多年里不斷推動網絡隱私保護和價值互聯網的全球頂尖的密碼學家,公認的“加密貨幣之父”和區塊鏈奠基人。以他至今已取得的成就和傳奇經歷,一大厚本傳記來講述都不夠.

1900/1/1 0:00:00
DEF:2021加密藝術之舞:在這里,看到NFT的趨勢、未來與投資機遇_EFI

杭州首個元宇宙小型線下展——巴比特、CryptoC聯合主辦的《2021加密藝術之舞:趨勢、未來與投資機遇》于本月5日在中國杭州未來區塊鏈創新中心成功舉辦.

1900/1/1 0:00:00
ETH:深度 | 從四個維度重新認識以太坊及其價值_泰達幣區塊鏈交易查詢

以太坊是近期加密市場最關注的話題,EIP1559和ETH2.0使得以太坊的敘事即將迎來根本性轉折,那么這將對行業帶來哪些影響?海外媒體人PackyMcCormick近日也撰文談及以太坊.

1900/1/1 0:00:00
ads