摘要:重入攻擊本質上與編程里的遞歸調用類似,當合約將以太幣發送到未知地址時就可能會發生,威脅以太坊智能合約的安全性。知道創宇區塊鏈安全實驗室?從轉賬方法、fallback函數、漏洞代碼、源碼分析四個方面入手,深入分析攻擊原因,詳解?The?DAO事件。
前言
智能合約的概念于1995年由NickSzabo首次提出,它是一種旨在以信息化方式傳播、驗證或執行合同的計算機協議,它允許在沒有第三方的情況下進行可信交易,這些交易可追蹤且不可逆轉。
然而智能合約也并非是安全的,其中?重入(Re-Entrance)攻擊?漏洞是以太坊中的攻擊方式之一,早在2016年就因為TheDAO事件而造成了以太坊的硬分叉。
漏洞概述
在以太坊中,智能合約能夠調用其他外部合約的代碼,由于智能合約可以調用外部合約或者發送以太幣,這些操作需要合約提交外部的調用,所以這些合約外部的調用就可以被攻擊者利用造成攻擊劫持,使得被攻擊合約在任意位置重新執行,繞過原代碼中的限制條件,從而發生重入攻擊。重入攻擊本質上與編程里的遞歸調用類似,所以當合約將以太幣發送到未知地址時就可能會發生。
簡單的來說,發生重入攻擊漏洞的條件有2個:
調用了外部的合約且該合約是不安全的
外部合約的函數調用早于狀態變量的修改
下面給出一個簡單的代碼片段示例:
彭博社:美國聯邦貿易委員會對推特的隱私和安全問題進行更深入審查:12月21日消息,據知情人士透露,在Elon Musk收購推特后,美國聯邦貿易委員會(FTC)正在對推特的隱私和數據安全做法進行更深入的調查。在過去的一個月里,美國聯邦貿易委員會的律師詢問了兩名前高管,自Elon Musk上任以來,推特是否能夠遵守該機構2011年的同意令。Elon Musk的收購導致推特的許多法律、隱私和合規高管離職,引發了更為廣泛的調查。
據悉,這次調查標志著FTC至少第三次就其隱私和數據安全做法對推特進行審查,審查可能導致數百萬美元的罰款,以及FTC對馬斯克本人施加義務的新命令,這些義務將適用于他的公司,即使他卸任CEO或離開推特也仍然有效。(彭博社)[2022/12/21 21:57:50]
上述代碼片段就是最簡單的提款操作,接下來會給大家詳細分析重入攻擊造成的原因。
漏洞分析
在正式的分析重入攻擊之前,我們先來介紹幾個重點知識。
轉賬方法
由于重入攻擊會發送在轉賬操作時,而Solidity中常用的轉賬方法為
<address>.transfer(),<address>.send()和<address>.gas().call.vale()(),下面對這3種轉賬方法進行說明:
<address>.transfer():只會發送2300gas進行調用,當發送失敗時會通過throw來進行回滾操作,從而防止了重入攻擊。
<address>.send():只會發送2300gas進行調用,當發送失敗時會返回布爾值false,從而防止了重入攻擊。
云南省委宣傳部副部長:深入推進區塊鏈與各行業領域的深度融合:8月25日,云南省委宣傳部副部長、省新聞出版(版權)局局長楊潤,市委常委、市委宣傳部部長徐曉梅率隊到五華區調研“區塊鏈 ”大文創產業建設情況。云南省區塊鏈中心成立了產業聯盟,數十家國內外企業加入,以商招商的產業氛圍日漸濃厚。中心成立一年以來,以成熟領先的區塊鏈技術助力數字云南發展。上線云南區塊鏈平臺,為企業快速部署應用提供極大便利。楊潤表示,五華區要按照“以應用換市場、以市場換產業”思路,以區塊鏈技術應用為突破口,強化政策引領,加大招商引資力度,引進國內外優秀企業落地園區,聚焦場景應用,深入推進區塊鏈與各行業領域的深度融合,把五華區打造成區塊鏈技術應用試驗場、產業發展聚集區。(五華區委宣傳部)[2021/8/30 22:46:23]
<address>.gas().call.vale()():在調用時會發送所有的gas,當發送失敗時會返回布爾值false,不能有效的防止重入攻擊。
fallback函數
接著我們來講解下fallback回退函數。
回退函數(fallbackfunction):回退函數是每個合約中有且僅有一個沒有名字的函數,并且該函數無參數,無返回值,如下所示:
function()publicpayable{???
???...
}
回退函數在以下幾種情況中被執行:
調用合約時沒有匹配到任何一個函數;
沒有傳數據;
智能合約收到以太幣。
國家外匯管理局山西省分局:深入推進跨境金融區塊鏈服務平臺應用:從國家外匯管理局山西省分局了解到,今年以來,山西省外匯局系統指導銀行積極挖掘市場潛力,提升跨境貿易投融資便利化水平,為中小微外貿企業跨境結算與融資擴渠道、增便利。一季度,已為16家企業辦理融資業務116筆,累計放款7.67億美元。 該局提出11條措施精準幫扶中小微外貿企業。建立了覆蓋163家企業的重點中小微外貿企業庫,用足用準山西省155億元再貸款再貼現專用額度。深入推進跨境金融區塊鏈服務平臺應用,已有17家銀行加入平臺,為16家企業辦理融資業務。指導銀行機構精準對接中小微外貿企業融資需求,提供“一企一策”服務,緩解資金壓力。在提升外匯質效方面,暢通外匯業務辦理“綠色通道”,截至4月15日,全省借助“綠色通道”為35家疫情防疫相關企業快速辦理外匯業務64筆766.19萬美元。(瀟湘晨報)[2020/5/16]
漏洞代碼
下面的代碼就是存在重入攻擊的,實現的是一個類似于公共錢包的合約,所有的用戶都可以使用deposit()存款到Reentrance合約中,也可以從Reentrance合約中使用withdraw()進行提款,當然了所有人也可以使用balanceof()查詢自己或者其他人在該合約中的余額。
首先使用一個賬戶(0x5B38Da6a701c568545dCfcB03FcB875f56beddC4)扮演受害者,將該合約在RemixIDE?點擊Deploy按鈕進行部署。
央行上海總部:深入推進金融科技創新監管試點:5月12日,央行上海總部發布通知稱,下一步將加強對金融科技應用創新試點工程的組織領導,并會同上海市地方金融監管局等單位,深入推進金融科技創新監管試點,提升金融科技支撐能力。中國人民銀行于2020年4月26日支持在上海等6市(區)擴大金融科技創新監管試點,這標志著金融科技創新監管工作正式在上海啟動,也為加快推進上海金融科技中心建設再添助力。
近年來,人民銀行上海總部把大力發展金融科技作為推動上海國際金融中心和科技創新中心聯動發展的重要著力點,積極探索設計上海金融科技中心的建設與發展路徑,發布了《關于促進金融科技發展 支持上海建設金融科技中心的指導意見》(銀總部發〔2019〕67號)。
央行上海總部明確,下一步將以《發展規劃》為指引,加強對金融科技應用創新試點工程的組織領導,并會同上海市地方金融監管局等單位,深入推進金融科技創新監管試點,加大試點項目橫向交流和成果共享,深化金融市場科技應用,提升金融科技支撐能力,為把上海建設成為與國際金融中心地位相適應的金融科技中心提供有力支撐。(中新經緯APP)[2020/5/12]
在部署合約成功后在VALUE設置框中填寫5,將單位改成ether,點擊deposit存入5個以太幣。
點擊wallet查看該合約的余額,發現余額為5ether,說明我們的存款成功。
動態 | 北大光華成立金融科技聯合實驗室 向區塊鏈等五大領域深入研究:10月12日,北京大學光華管理學院與度小滿金融宣布合作成立金融科技聯合實驗室,并在北京大學為實驗室揭牌。聯合實驗室主任劉曉蕾表示實驗室將圍繞數字化資產配置、超大規模關聯網絡、在線機器人、監管科技、區塊鏈技術等五大領域深入研究,積極探索前沿技術在金融場景中的應用,同時推動跨學科人才的培養和輸出。[2018/10/12]
而下面的代碼則是針對上面存在漏洞的合約進行的攻擊:
使用另外一個賬戶(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:THE區塊鏈DAOALLPrometheus Trading鉑鏈幣區塊鏈下載DAOs價格mathwallet錢包怎么樣
作者?|Natemaddrey原標題:《CoinMetrics丨519暴跌中,穩定幣表現如何?》摘要:在過去幾周里,在一連串的負面新聞之后,加密貨幣市場受到了考驗.
1900/1/1 0:00:00據官方公告,從今天開始,Coinbase網站以及CoinbaseAndroid和iOS應用程序上線狗狗幣(DOGE).
1900/1/1 0:00:00以其獨特logo而聞名的生活方式和娛樂品牌《花花公子》,在一個名為“Raretoshi”的新NFT市場上推出了其首批5個動畫NFT.
1900/1/1 0:00:00本文來自Nansen,作者LingYoungLoon MasterChef.sol可能是DeFi中被分叉最多的合約之一。所謂分叉是指復制代碼庫,其大部分功能不變.
1900/1/1 0:00:00本文由中幣研究院原創編輯 熱點摘要: 1.Casa聯合創始人:每個國家最終都將承認比特幣就是金錢;2.推特CEO:如有必要.
1900/1/1 0:00:00原標題:以太坊Layer2匯總現在每天你都會聽到Layer2的聲音在你的耳邊環繞,仿佛整個世界都在談論它,由于以太坊L1在當前迭代中每秒處理大約15筆交易,這導致了許多問題:網絡經常變得擁擠.
1900/1/1 0:00:00