以太坊交易所 以太坊交易所
Ctrl+D 以太坊交易所
ads
首頁 > Polygon > Info

智能合約安全審計入門篇 : 重入漏洞

Author:

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

背景概述

看了一個關于學習solidity的站,里面講了關于solidity智能合約的很多漏洞,考慮到現在針對智能合約的攻擊事件頻頻發生,不法分子盜取的加密資產越來越多,我就想寫一些與智能合約安全審計相關的文章給想了解智能合約安全審計的入門者閱讀,讓一些對智能合約安全審計感興趣的初學者可以學到如何識別一些常見的漏洞和如何利用這些漏洞去做什么事情。這次我們就一起先看一個很經典的漏洞——?重入漏洞。

前置知識

重入漏洞相信大家都有所耳聞了,那么什么是重入漏洞呢?

以太坊智能合約的特點之一是合約之間可以進行相互間的外部調用。同時,以太坊的轉賬不僅僅局限于外部賬戶,合約賬戶同樣可以擁有以太并進行轉賬等操作,且合約在接收以太的時候會觸發fallback函數執行相應的邏輯,這是一種隱藏的外部調用。

Immunefi:白帽黑客發現Polygon智能合約中PoS系統漏洞:2月21日消息,Immunefi 今日發布了一份關于Polygon共識機制的漏洞報告。報告顯示,1月15日, 白帽Niv Yehezkel在 Polygon 在以太坊上的智能合約中的權益證明 (PoS) 系統中發現了一個漏洞,這將允許攻擊者降低總權益,從而允許繞過共識,這可能會導致攻擊者流失來自存款經理的所有資金,進行無限制的提款,DoS等等。

由于漏洞利用的復雜性,該漏洞的嚴重性級別為 75,000 美元。 攻擊者要利用此漏洞,必須滿足特定的市場條件。例如,驗證者點必須是開放的,并且資本要求很高。使用 flashbots 直接支付給礦工留在驗證者位置的金額也很高。此外,Polygon 網絡的檢查點時間每 30-45 分鐘發生一次,攻擊者需要長時間維護驗證者位置,從而由??于時間要求增加了攻擊成本。[2022/2/21 10:06:16]

我們先給重入漏洞下個定義:可以認為合約中所有的外部調用都是不安全的,都有可能存在重入漏洞。例如:如果外部調用的目標是一個攻擊者可以控制的惡意的合約,那么當被攻擊的合約在調用惡意合約的時候攻擊者可以執行惡意的邏輯然后再重新進入到被攻擊合約的內部,通過這樣的方式來發起一筆非預期的外部調用,從而影響被攻擊合約正常的執行邏輯。

動態 | BTP將智能合約帶入亞馬遜量子分類賬數據庫:金色財經報道,Blockchain Technology Partners(BTP)今天宣布,由BTP的Sextant for DAML提供商業支持,DAML(由Digital Asset創建的開源智能合約語言)與亞馬遜量子分類賬數據庫(Amazon QLDB)的集成已全面上市。據悉,Amazon QLDB是Sextant for DAML商業支持的第三個平臺。Sextant for DAML是一個集成產品,可簡化DAML支持的分類賬的部署和管理。[2020/2/26]

漏洞示例

好了,看完上面的前置知識我相信大家對重入漏洞都有了一個大致的了解,那么在真實的環境中開發者寫出什么樣的代碼會出現重入漏洞呢,下面我們來看一個比較典型的有重入漏洞的代碼:

動態 | 普華集團憑借形式化智能合約技術獲“院士推優計劃”百強獎:近日,第三屆中國工業設計展覽會在武漢舉行,普華集團憑借基于區塊鏈技術創立的形式化智能合約技術,榮獲“2019年一帶一路創新設計榜院士推優計劃百強獎”。據悉,形式化智能合約技術是由普華集團研發的智能合約可視化增強技術,它由可視化視圖、模板與庫、指令規則集、視圖轉化器、指令編譯器等內容組成。(新浪財經)[2020/1/6]

漏洞分析

看到這里大家可能會有疑惑了,上面的代碼就是個普通的充提幣的合約,憑什么說他有重入攻擊呢?我們來看這個合約的withdraw函數,這個函數中的轉賬操作有一個外部調用,所以我們就可以認為這個合約是可能有重入漏洞的,但是具體能否產生危害還需要更深入的分析:

金色晨訊 | 康涅狄格州立法者尋求將區塊鏈智能合約合法化:1.德國計劃通過“電子注冊”方式對區塊鏈行業進行監管。

2.比特幣期貨收于3900美元之下。

3.SEC專員:沒有必要建立國家范圍的區塊鏈政策。

4.紐約檢察官已逮捕OneCoin領導者。

5.康涅狄格州立法者尋求將區塊鏈智能合約合法化。

6.Facebook擴大區塊鏈相關職位的招聘數量。

7. IBM再提交兩項區塊鏈專利申請。

8.美國CFTC希望成為一個潛在節點 以訪問區塊鏈中的信息。

9.美國法警尋求數字資產公司幫其處理被扣押加密貨幣。[2019/3/9]

1.所有的外部調用都是不安全的且合約在接收以太的時候會觸發fallback函數執行相應的邏輯,這是一種隱藏的外部調用,這種隱藏的外部調用是否會造成危害呢?

2.我們可以看到在withdraw函數中是先執行外部調用進行轉賬后才將賬戶余額清零的,那我們可不可以在轉賬外部調用的時候構造一個惡意的邏輯合約在合約執行balance=0之前一直循環調用withdraw函數一直提幣從而將合約賬戶清空呢?

下面我們看看攻擊者編寫的攻擊合約中的攻擊手法是否與我們的漏洞分析相同:

攻擊合約

我們看到EtherStore合約是一個充提合約,我們可以在其中充提以太。下面我們將利用攻擊合約將EtherStore合約中用戶的余額清零的:

這里我們將引用三個角色,分別為:

用戶:Alice,Bob

攻擊者:Eve

1.部署EtherStore合約;

2.用戶1和用戶2都分別將1個以太幣充值到EtherStore合約中;

3.攻擊者Eve部署Attack合約時傳入EtherStore合約的地址;

4.攻擊者Eve調用Attack.attack函數,Attack.attack又調用EtherStore.deposit函數,充值1個以太幣到EtherStore合約中,此時EtherStore合約中共有3個以太,分別為Alice、Bob的2個以太和攻擊者Eve剛剛充值進去的1個以太。然后Attack.attack又調用EtherStore.withdraw函數將自己剛剛充值的以太取出,此時EtherStore合約中就只剩下Alice、Bob的2個以太了;

5.當Attack.attack調用EtherStore.withdraw提取了先前Eve充值的1個以太時會觸發Attack.fallback函數。這時只要EtherStore合約中的以太大于或等于1Attack.fallback就會一直調用EtherStore.withdraw函數將EtherStore合約中的以太提取到Attack合約中,直到EtherStore合約中的以太小于1。這樣攻擊者Eve會得到EtherStore合約中剩下的2個以太幣。

下面是攻擊者的函數調用流程圖:

修復建議

看了上面的攻擊手法相信大家對重入漏洞都會有一個自己的認知,但是只會攻擊可不行,我們的目的是為了防御,那么作為開發人員如何避免寫出漏洞代碼還有作為審計人員如何快速發現問題代碼呢,下面我們就以這兩個身份來分析如何防御重入漏洞和如何在代碼中快速找出重入漏洞:

作為開發人員

站在開發者的角度我們需要做的是寫好代碼,避免重入漏洞的產生。

1.寫代碼時需要遵循先判斷,后寫入變量在進行外部調用的編碼規范;

2.加入防重入鎖。

下面是一個防重入鎖的代碼示例:

作為審計人員

作為審計人員我們需要關注的是重入漏洞的特征:所有涉及到外部合約調用的代碼位置都是不安全的。這樣在審計過程中需要重點關注外部調用,然后推演外部調用可能產生的危害,這樣就能判斷這個地方是否會因為重入點而產生危害。

Tags:THESTOREETHETHEtothezenithBerrystoreETHS幣togetherbnb更新了嗎

Polygon
新研究表明 以太坊可能成為比比特幣更好的通脹對沖工具_LOC:BROADCASTING

比特幣在過去幾年的回報率遠遠高于通貨膨脹率,目前通貨膨脹率超過6%,預計未來幾個月還會增長更多。這鞏固了該資產作為通脹最佳對沖工具的地位。然而,比特幣找到了另一個競爭對手.

1900/1/1 0:00:00
金色觀察|LV創意總監Virgil Abloh去世:曾大膽暢想web3應用_區塊鏈:ILA

北京時間11月29日凌晨,LVMH集團發表聲明:LOUISVUITTON男裝藝術總監、OFF-WHITE主理人VirgilAbloh,于周日因癌癥逝世。?年僅41歲.

1900/1/1 0:00:00
SEC主席:DeFi可能可以提供“真正的創新”,但需要監管合規_GEN:GENS價格

金色財經報道,美國證券交易委員會主席GaryGensler認為,DeFi可以提供“真正的創新”,但他相信如果沒有監管合規,該行業將無法生存.

1900/1/1 0:00:00
金色早報 | 微策略購入1434枚比特幣_區塊鏈:EOS

頭條 ▌MicroStrategy:以8240萬美元購買了1434枚比特幣12月9日消息,MicroStrategyCEOMichaelSaylor發推稱.

1900/1/1 0:00:00
有人稱2022年將會是DAO的元年_以太坊:AirdropToken

每個人都會開始或加入其中。以下是我們需要知道的。 什么是DAO? DAO是去中心化自治組織的縮寫。它是企業或組織的web3結構。 誰可以開始一個DAO? 任何人都可以開始一個DAO.

1900/1/1 0:00:00
BitMex CEO對DAO的理解_ETH:serum幣變成10億

在香港度過了我生命的三分之一后,我的粵語仍然是垃圾。我可以用可接受的口音說出我的地址,但除此之外別無他法.

1900/1/1 0:00:00
ads