加密貨幣交易所 加密貨幣交易所
Ctrl+D 加密貨幣交易所
ads

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

Author:

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

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

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

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

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

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

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

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

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

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

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

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

轉賬方法

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

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

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

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

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

fallback 函數

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

中央財經大學:與中國銀行在數字人民幣領域深入開展合作:金色財經報道,中央財經大學近日與中國銀行簽署戰略合作協議,雙方將圍繞數字經濟、數字人民幣等方面開展研究,推動合作項目落地實施。根據協議,雙方還將進一步在銀校系統對接、數字人民幣等領域深入開展合作。(中央財經大學官方公眾號)[2021/10/5 17:24:39]

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

function() public payable{???

? ? ? ...

}

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

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

沒有傳數據;

智能合約收到以太幣(為了接受以太幣,fallback 函數必被標記為 payable)。

漏洞代碼

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

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

南寧市深入推進“區塊鏈+”人社應用和“打包快辦”服務改革:8月20日,南寧市人社局召開專題黨組會,傳達學習市委十二屆十次全體(擴大)會議精神,并就抓好貫徹落實作出部署。會議強調,局系統廣大黨員干部要將思想認識統一到市委決策部署上來,將學習貫徹市委十二屆十次全體(擴大)會議精神和年度工作任務相結合,扎實推進各項中心工作;抓重點攻難點,切實保障和改善民生,千方百計保就業,兜住基本民生底線,深入推進“智慧人社”工作,深化“一門式”服務改革,深入推進“區塊鏈+”人社應用和“打包快辦”服務改革,確保完成全年目標任務。(南寧日報)[2020/8/23]

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

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

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

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

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

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

今晚8點袁煜明將做客《金色講堂》 深入解讀“什么是區塊鏈思維”:今晚20:00,火幣區塊鏈應用研究院院長袁煜明將做客《金色講堂》深入解讀“什么是區塊鏈思維”。袁煜明將從股份制的種種弊端出發對區塊鏈的出現給行業所帶來的改變進行一一講解。同時,袁煜明還會對區塊鏈機制目前所存在的問題進行全方位的解讀。詳情請關注今晚8:00的《金色講堂》。[2018/4/10]

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

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

攻擊者 (0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2) 調用攻擊合約的 attack 函數模擬攻擊,之后調用被攻擊合約的 wallet 函數去查看合約的余額,發現已經歸零,此時回到攻擊合約查看余額,發現被攻擊合約中的 6 ether 已經全部提款到了攻擊者合約中,這就造成了重入攻擊。

源碼分析

上面講解了如何進行重入攻擊已經漏洞原因,這里梳理了漏洞源碼和攻擊的步驟,列出了關鍵代碼。

2016 年 6 月 17 日,TheDAO 項目遭到了重入攻擊,導致了 300 多萬個以太幣被從 TheDAO 資產池中分離出來,而攻擊者利用 TheDAO 智能合約中的 splitDAO() 函數重復利用自己的 DAO 資產進行重入攻擊,不斷的從 TheDAO 項目的資產池中將 DAO 資產分離出來并轉移到自己的賬戶中。

下列代碼為 splitDAO() 函數中的部分代碼,源代碼在 TokenCreation.sol 中,它會將代幣從 the parent DAO 轉移到 the child DAO 中。平衡數組 uint fundsToBeMoved = (balances[msg.sender] * p.splitData.splitBalance) ?/ p.splitData.totalSupply 決定了要轉移的代幣數量。

下面的代碼則是進行提款獎勵操作,每次攻擊者調用這項功能時 p.splitData 都是一樣的(它是 p 的一個屬性,即一個固定的值),并且 p.splitData.totalSupply 與 balances[msg.sender] 的值由于函數順序問題,發生在了轉賬操作之后,并沒有被更新。

paidOut[_account] += reward 更新狀態變量放在了問題代碼 payOut 函數調用之后。

對 _recipient 發出 .call.value 調用,轉賬 _amount 個 Wei,.call.value 調用默認會使用當前剩余的所有 gas。

通過上面對重入攻擊的分析,我們可以發現重入攻擊漏洞的重點在于使用了 fallback 等函數回調自己造成遞歸調用進行循環轉賬操作,所以針對重入攻擊漏洞的解決辦法有以下幾種。

使用其他轉賬函數

在進行以太幣轉賬發送給外部地址時使用 Solidity 內置的 transfer() 函數,因為 transfer() 轉賬時只會發送 2300 gas 進行調用,這將不足以調用另一份合約,使用 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.?區塊鏈的那些事 — THE DAO 攻擊事件源碼分析:

https://blog.csdn.net/Fly_hps/article/details/83095036

Tags:THEALLDAOTRAEthereumMaxPolkallyPyramiDAOMetavault Trade

加密貨幣
Nansen:五個指標教你看懂加密貨幣市場_NAN:Yuan Finance

理解資金費率、未平倉合約、穩定幣資金流動、交易所資金流動以及恐懼與貪婪指數這五個指標,能更好地評估加密貨幣市場情緒.

1900/1/1 0:00:00
以太坊上的價值抽取:簡介與項目_MEV:以太坊

DeFi 領域之所以能煥發如此強勁的生命力和創新力,主要原因之一是人們可以在以太坊上編寫靈活的智能合約,并創建具有可組合性的貨幣積木.

1900/1/1 0:00:00
項目周刊 | Uniswap將在Arbitrum部署v3 “很快”重啟UNI流動性挖礦_以太坊:SWAP

金色周刊是金色財經推出的一檔每周區塊鏈行業總結欄目,內容涵蓋一周重點新聞、行情與合約數據、礦業信息、項目動態、技術進展等行業動態。本文是項目周刊,帶您一覽本周主流項目以及明星項目的進展.

1900/1/1 0:00:00
金色觀察 | ETH價格上漲11%后 DeFi代幣市場回暖_XRP:DEF

加密市場經歷過周末行情低迷后,有所回暖,ETH價格則有較大幅度的上漲。在過去24小時內ETH價格上漲了11%,達到2640美元高點。上周漲幅為24%.

1900/1/1 0:00:00
數字資產期權交易研究(一)_數字資產:數字資產合法嗎

在過去的2020年,DeFi的火爆使加密資產創下了前所未有的新高度,并催生出了新型的商業范式。然而,各類基于數字資產的金融衍生品也愈發脫離了實際合理的風險控制.

1900/1/1 0:00:00
牛市還能繼續嗎?盤整期巨鯨、散戶、機構、長期持有者都在如何操作_BTC:sbtc幣最新消息

自4月中旬開始,BTC帶領加密貨幣市場開啟了高位調整行情。根據CoinMarketCap的數據.

1900/1/1 0:00:00
ads