摘要:重入攻擊本質上與編程里的遞歸調用類似,當合約將以太幣發送到未知地址時就可能會發生,威脅以太坊智能合約的安全性。知道創宇區塊鏈安全實驗室?從轉賬方法、fallback函數、漏洞代碼、源碼分析四個方面入手,深入分析攻擊原因,詳解?The?DAO事件。
前言
智能合約的概念于1995年由NickSzabo首次提出,它是一種旨在以信息化方式傳播、驗證或執行合同的計算機協議,它允許在沒有第三方的情況下進行可信交易,這些交易可追蹤且不可逆轉。
然而智能合約也并非是安全的,其中?重入(Re-Entrance)攻擊?漏洞是以太坊中的攻擊方式之一,早在2016年就因為TheDAO事件而造成了以太坊的硬分叉。
漏洞概述
在以太坊中,智能合約能夠調用其他外部合約的代碼,由于智能合約可以調用外部合約或者發送以太幣,這些操作需要合約提交外部的調用,所以這些合約外部的調用就可以被攻擊者利用造成攻擊劫持,使得被攻擊合約在任意位置重新執行,繞過原代碼中的限制條件,從而發生重入攻擊。重入攻擊本質上與編程里的遞歸調用類似,所以當合約將以太幣發送到未知地址時就可能會發生。
教育部等六部門:深入應用區塊鏈等信息技術,推動教育數字轉型:7月21日消息,教育部等六部門發布《關于推進教育新型基礎設施建設構建高質量教育支撐體系的指導意見》。指導意見提出,深入應用5G、人工智能、大數據、云計算、區塊鏈等新一代信息技術,充分發揮數據作為新型生產要素的作用,推動教育數字轉型。利用區塊鏈技術保護知識產權,探索個性化資源購買使用和后付費機制。通過用戶評價和第三方評估相結合的方式,推動數字資源迭代更新。(教育部官網)[2021/7/21 1:07:07]
簡單的來說,發生重入攻擊漏洞的條件有2個:
調用了外部的合約且該合約是不安全的
外部合約的函數調用早于狀態變量的修改
下面給出一個簡單的代碼片段示例:
上述代碼片段就是最簡單的提款操作,接下來會給大家詳細分析重入攻擊造成的原因。
漏洞分析
在正式的分析重入攻擊之前,我們先來介紹幾個重點知識。
轉賬方法
由于重入攻擊會發送在轉賬操作時,而Solidity中常用的轉賬方法為
“中國數谷”發布《三年行動計劃》:深入推進區塊鏈等前沿研究探索落地:今日,貴陽國家高新區正式發布《貴陽國家高新區建設“中國數谷之心”三年行動計劃(2018-2020年)》。《三年行動計劃》明確,深入推進物聯網、人工智能、區塊鏈以及大數據+實體經濟等前沿研究探索落地全面推進中國數谷之心建設行動。[2018/4/20]
.transfer(),.send()和.gas().call.vale()(),下面對這3種轉賬方法進行說明:
.transfer():只會發送2300gas進行調用,當發送失敗時會通過throw來進行回滾操作,從而防止了重入攻擊。
.send():只會發送2300gas進行調用,當發送失敗時會返回布爾值false,從而防止了重入攻擊。
.gas().call.vale()():在調用時會發送所有的gas,當發送失敗時會返回布爾值false,不能有效的防止重入攻擊。fallback函數
接著我們來講解下fallback回退函數。
Facebook創始人稱要深入的學習和了解加密貨幣技術:扎克伯格在Facebook發帖稱,2018年他的新挑戰是解決Facebook存在的一些問題,并且還要深入了解和學習加密技術和加密貨幣,并運用到Facebook的服務中去。[2018/1/5]
回退函數(fallbackfunction):回退函數是每個合約中有且僅有一個沒有名字的函數,并且該函數無參數,無返回值,如下所示:
function()publicpayable{???
???...
}
回退函數在以下幾種情況中被執行:
調用合約時沒有匹配到任何一個函數;
沒有傳數據;
智能合約收到以太幣。
漏洞代碼
下面的代碼就是存在重入攻擊的,實現的是一個類似于公共錢包的合約,所有的用戶都可以使用deposit()存款到Reentrance合約中,也可以從Reentrance合約中使用withdraw()進行提款,當然了所有人也可以使用balanceof()查詢自己或者其他人在該合約中的余額。
全球的規則制定者將深入研究數字貨幣:擔任G20金融穩定委員會(FSB)主席和英格蘭銀行行長的馬克·卡尼(Mark Carney)表示,鑒于去年數字貨幣的爆炸式增長,全球的規則制定者將深入研究數字貨幣。卡尼先生告訴財政部特別委員會說,他希望金融穩定委員會能夠討論分布式分類賬技術,這是加密貨幣和數字貨幣本身的基礎。他還表示,收緊有關ICO的規定是十分必要的。卡尼先生被委員會問及如何看待比特幣,他重復了英國官員之前的言論,盡管比特幣的價值在上漲,但當局并不認為這會成為英國整體金融穩定的風險。他補充說,英國央行認為支撐比特幣的分布式賬本技術可以最好地應用于大規模的結算,但仍然需要正確部署接下來的道路。[2017/12/21]
首先使用一個賬戶(0x5B38Da6a701c568545dCfcB03FcB875f56beddC4)扮演受害者,將該合約在RemixIDE?點擊Deploy按鈕進行部署。
在部署合約成功后在VALUE設置框中填寫5,將單位改成ether,點擊deposit存入5個以太幣。
點擊wallet查看該合約的余額,發現余額為5ether,說明我們的存款成功。
英國金融監管機構發出承諾 將對新興的ICO市場進行深入審查:金融市場行為監管局周五表示,將對ICO市場進行審查,以此作為更多監管行動的前奏。它已經告誡消費者與投資ICO有關的“非常高的風險”。“在初始投幣(ICO)市場上,FCA將收集進一步的證據,并對快速發展進行更深入的研究。調查結果將有助于確定在9月份發布的消費者警告之外是否需要在這方面進一步采取監管行動。“FCA在一份聲明中表示。[2017/12/15]
而下面的代碼則是針對上面存在漏洞的合約進行的攻擊:
使用另外一個賬戶(0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2)扮演攻擊者,復制存在漏洞的合約地址到Deploy的設置框內,點擊Deploy部署上面的攻擊合約。
部署成功后先調用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:THEDAOALLTRAFROGGO The Last PepeVIDT DAOSuper WalletTranche Finance
幣圈風云變幻,市場暴跌之后是熊市的來臨還是牛市的蓄力?Gate.io將推出特別投票項目——牛熊預測投票對決,歡迎全平臺玩家一同參與.
1900/1/1 0:00:00以太坊聯合創始人VitalikButerin在香港的一次會議上就Eth2路線圖的障礙發表了評論.
1900/1/1 0:00:00尊敬的用戶: WBF將于新加坡時間2021年6月4日02:00-03:00進行系統升級,升級期間將影響用戶登錄/注冊,現貨交易,充提幣等功能,請您提前做好相應安排,有任何疑問可以聯系在線客服.
1900/1/1 0:00:00目前智能量化交易策略庫包含網格交易、合約網格、MACD(指數平滑移動平均線)、雙均線、MACD-RSI、雙均線-RSI六種量化策略,用戶可自由選擇使用。杠桿倍數設置可放大本金,獲取多倍收益.
1900/1/1 0:00:00本文由中幣研究院原創編輯,下載全球領先的數字貨幣交易所中幣APP:www.zb.today 熱點摘要: 1.加密貨幣5月調整后鏈上交易量創歷史新高;2.英偉達:GeForce顯卡的價格可能會因新.
1900/1/1 0:00:00親愛的用戶: HomiEx將于2021年6月4日15:00(UTC8)上線AKT/USDT交易對.
1900/1/1 0:00:00