比特幣價格 比特幣價格
Ctrl+D 比特幣價格
ads

THE:深入理解重入攻擊漏洞_區塊鏈工程專業學什么及就業方向

Author:

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

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

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

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

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

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

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

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

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

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

共為2020 | Block.one首席執行官:區塊鏈深入數據,更好為用戶服務:金色財經現場報道,2020年6月21日,由金色財經主辦的共為2020·區塊鏈創新應用論壇在深圳拉開帷幕。Block.one首席執行官Brendan Blumer、金色財經CEO安鑫鑫就《Block.one、EOSIO和區塊鏈未來》進行現場連線。Block.one首席執行官Brendan Blumer指出:大家看到周圍的事物往往只是表面,但往下深挖是很大的數據庫。比如現在社交媒體上有很多廣告,這些廣告下面是數據,很多公司用算法和技術方法把廣告推送到我們身邊。區塊鏈技術可以深入其中,提高更好的透明度,看是否為用戶服務,讓用戶能更好的掌控。[2020/6/21]

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

轉賬方法

由于重入攻擊會發送在轉賬操作時,而 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,不能有效的防止重入攻擊。

聲音 | 井通科技李軍:區塊鏈發展階段正在深入但預期一致可能引發黑天鵝:12月5日消息,井通科技副總裁李軍在談論區塊鏈未來時表示,區塊鏈發展第一階段已經過去,第二階段已經深入場景,隨著階段深入,底層核心技術擁有更加深遠的前景,但值得注意的是,預期一致往往會引發黑天鵝,需要各方警惕。[2019/12/5]

fallback 函數

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

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

function() public payable{???

? ? ? ...

}

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

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

沒有傳數據;

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

漏洞代碼

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

動態 | 未來區塊鏈等金融科技在農村金融領域的應用將會持續深入推廣:據中國金融新聞網消息,日前,央行等五部委聯合發布《關于金融服務鄉村振興的指導意見》(以下簡稱《指導意見》),其中,在強化金融產品和服務方式創新方面,鼓勵推動新技術的運用。業內人士認為,未來金融科技在農村金融領域的應用將繼續深入推廣。正如上述《指導意見》提出,積極運用大數據、區塊鏈等技術,提高涉農信貸風險的識別、監控、預警和處置水平;鼓勵開發針對農村電商的專屬貸款產品和小額支付結算功能,打通農村電商資金鏈條等。[2019/2/16]

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

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

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

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

德國證券交易所正深入研究是否推出比特幣期貨等相關產品:據ccn援引彭博社消息,德意志交易所(Deutsche Boerse)正在深入研究是否提供比特幣期貨和其他加密貨幣的相關產品。在一次行業盛會上,該公司的客戶,產品和核心市場負責人Jeffrey Tessler稱:“德意志交易所在推進比特幣之前,希望確保理解比特幣之下的交易,這不是最容易的一件事。我們正在深入地了解之中,希望了解波動性,想要確保客戶協調,及監管機構的協調。”Tessler表示,盡管CEM和CBOE在一個交易日期間比特幣期貨交易量多達6.7億美元,但目前沒有任何一家主要的歐洲交易所列出比特幣或其他加密貨幣的衍生產品。據悉,德意志交易所已經參與了區塊鏈實驗,他們今年3月份與流動性管理公司HQLAx合作,利用R3的Corda平臺開發基于區塊鏈的證券借貸平臺。[2018/5/24]

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

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

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

攻擊者先存款 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:THEALL區塊鏈DAOEther DataCoinAll Token區塊鏈工程專業學什么及就業方向Asgard Dao

幣安app下載
DEF:聚合器會是DeFi里最大的價值捕獲者嗎?_DEFI

撰文:李畫 聚合器,比如Google、Facebook、Uber、Airbnb,是互聯網上最大的價值捕獲者。當一個產業被數字化后,該產業的利潤會大量地流向這個產業在網絡上的聚合者.

1900/1/1 0:00:00
比特幣:監管高壓下的比特幣礦業眾生相:集體觀望 出海風險難測_馬斯克

一直在中國偏遠地區默默挖礦的比特幣礦工們可能沒有想到,自己會成為金融監管首當其沖的打擊對象。監管高壓之下,出海?退圈?何去何從成為礦業從業者們集體面臨的難題.

1900/1/1 0:00:00
區塊鏈:金色前哨|《區塊鏈應用操作員國家職業技能標準》正式頒發_BTC

金色財經訊,6月8日,《區塊鏈應用操作員國家職業技能標準(2021年版)》日前已由人社部辦公廳、工信部辦公廳正式頒發施行.

1900/1/1 0:00:00
以太坊:金色觀察丨從DeFi到DEX:以太坊協議發展簡史_區塊鏈幣圈幣種知識大全

金色財經 區塊鏈5月31日訊? ?如今的去中心化金融 (DeFi) 已經成為一個持續發展的行業,與其他具有競爭產品的經濟體一樣,不少去中心化金融協議也經歷過起起落落,有的協議在短時間內走上巔峰.

1900/1/1 0:00:00
區塊鏈:金色觀察丨一文讀懂什么是完全圖靈完備協議_Flare

金色財經 區塊鏈6月1日訊? 目前,存在于公共區塊鏈中的75%的市值無法以可靠的方式在智能合約中使用,這對整個行業的構建是至關重要的.

1900/1/1 0:00:00
DOT:DOT及KSM價格在吸引3000萬美元資金后暴漲_polkadotted讀音

在Master Ventures宣布成立3000萬美元的Polkadot生態系統基金之后,DOT和KSM價格迎來大漲.

1900/1/1 0:00:00
ads