買以太坊 買以太坊
Ctrl+D 買以太坊
ads
首頁 > DYDX > Info

TRA:深入理解重入攻擊漏洞_srnArt Gallery

Author:

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

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

前言

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

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

漏洞概述

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

國務院辦公廳盧向東:區塊鏈等新技術與政府業務深入融合:10月12日,第三屆數字中國建設峰會數字政府分論壇在福州召開。國務院辦公廳電子政務辦公室主任盧向東表示,黨中央、國務院作出推進數字政府建設的重要決策部署,意義重大,影響深遠。目前推進數字政府建設已經具備良好的支撐條件。當前,5G網絡覆蓋范圍不斷拓展,云計算統籌優化基礎設施資源,物聯網、大數據、人工智能、區塊鏈等新技術與政府業務深入融合,新一代信息技術為數字政府建設提供了強有力的技術保障。(經濟參考報)[2020/10/15]

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

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

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

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

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

漏洞分析

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

轉賬方法

聲音 | 陳思劼:區塊鏈等技術不斷深入應用,推動產業發生深刻變革:12月13日下午,第一財經2019杰出商界領軍者高峰論壇在上海舉行。上海第一財經傳媒有限公司總經理陳思劼在會上致辭。陳思劼表示:新一輪的科技革命正在悄然到來,眾多產業被新科技激發活力,比如人工智能、大數據、區塊鏈和云計算等技術,在行業不斷深入應用,推動產業發生深刻變革。新技術的發展在新經濟時代勢不可擋,企業的創新升級勢在必行。[2019/12/13]

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

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

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

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

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

聲音 | 央行研究局局長:將深入研究完善金融科技監管制度框架等問題:據財聯社消息,央行研究局局長王信今日在數字金融開放研究計劃首屆學術研討會上表示,央行高度總是金融科技應用的相關研發,下一階段值得深入研究的課題包括:Libra等加密數字貨幣有關問題,如是否會形成法定數字貨幣、少數數字穩定幣并存格局;探索數字金融更好地支持實體經濟發展,應開發多元化、全方位金融服務;完善金融科技監管制度框架,發展監管科技,如何將科技巨頭納入宏觀審慎監管框架;加強數字金融基礎設施建設,加強數字金融領域的國際協調合作等。[2019/7/8]

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

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

function()publicpayable{???

???...

}

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

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

動態 | 金融時報:未來區塊鏈等技術與銀行業的融合一定會越來越深入:據金融時報今日刊文指出,銀行業“變革的思維”,還體現在科技與傳統銀行的結合上。未來,云計算、大數據、區塊鏈與銀行業的融合一定會越來越深入。數據和信息會成為未來銀行的生命線。擁有數據和信息,就能精準勾畫出消費者所需要的場景,從而提高銀行服務和產品的覆蓋范圍與個性化程度,進而滿足金融消費者的獲得感、幸福感和安全感。并且,數字技術與普惠金融、小微金融、消費金融相結合,可以產生事半功倍的效果,因為小微企業與消費者是最需要數字技術所帶來的金融服務便利性的客戶群體。[2018/9/8]

沒有傳數據;

智能合約收到以太幣。

漏洞代碼

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

北京市委書記蔡奇:深入研究區塊鏈技術及應用,打造產業集群:昨天上午,北京市召開網絡安全和信息化工作會議,北京市委書記蔡奇強調,堅持以信息化培育新動能推動新發展,使信息化成為首都發展的新動能、城市治理的新手段、公共服務的新方式,切實增強人民群眾的獲得感幸福感安全感。大力發展數字經濟,深入實施大數據和云計算發展行動計劃,深入研究區塊鏈技術及應用,打造產業集群。優化電子政務,推進全市統一的基礎公共云平臺建設,進一步打破信息壁壘、提升服務效率,讓百姓少跑腿、信息多跑路。[2018/5/26]

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

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

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

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

使用另外一個賬戶(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:THEDAOALLTRA2getherAnteDAOsrnArt GalleryTracto

DYDX
虎符將于6月3日15:00正式上線BUSY(Busy DAO)

尊敬的虎符用戶: 虎符創新區將于2021年6月3日15:00(UTC8)重磅上線BUSY/USDT交易對。 充值、提現已開啟.

1900/1/1 0:00:00
ROB:灰度(Grayscale)將于 6月10日與Rob和Liat舉辦網絡研討會_Shib Original Vision

灰度?將于6月10日與Rob和Liat舉辦網絡研討會。點擊下方鏈接注冊參與,因為它的注冊人上限為3000人:https://go.grayscale.com/e/652383/ster-WN-d.

1900/1/1 0:00:00
BAN:Kusama 公投 114 通過,跨鏈 DeFi 有哪些點可以提前埋伏?_defibox幣有價值嗎

北京時間6月3日,波卡先行網Kusama的公投114通過,這意味Kusama上原本只有區塊添加和最終確認驗證的Shell平行鏈成為了可以進行通證發行和資產托管的Statemine平行鏈.

1900/1/1 0:00:00
SPA:SpaceX將與SpaceChain合作,將第一個以太坊節點送至國際空間站_SPACE

據雅虎財經消息,SpaceX將于7月3日向國際空間站發射一個以太坊節點,為首次將以太坊節點送入太空.

1900/1/1 0:00:00
CEB:Layer 2 解決方案 AllianceBlock 發布去中心化網橋 AllianceBridge 測試網_ANC

鏈聞消息,Layer2解決方案AllianceBlock發布AllianceBridge的測試網。AllianceBridge是一個去中心化的網橋,擁有自己的EVM兼容網橋運營商網絡.

1900/1/1 0:00:00
MYNFT:NFT 藝術品——手繪保時捷911 | 不一樣的「NFT」 -- N詞貼_CHE

Porsche911Carrera?NFT?藝術品——手繪保時捷911抽象藝術家和世界知名豪華汽車設計師RichB.Caliente以保時捷911Carrera為題,手繪打造全新外觀.

1900/1/1 0:00:00
ads