以太幣交易所 以太幣交易所
Ctrl+D 以太幣交易所
ads

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

Author:

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

背景概述

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

前置知識

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

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

Matter Labs 將 Uniswap V2 智能合約和前端遷移至 zkSync 2.0 測試網:10月13日消息,Matter Labs 宣布將 Uniswap V2 智能合約和前端遷移至功能完備的 zkSync 2.0 測試網上,該端口名為 UniSync,為在 zkSync 2.0 上第一個遷移的 Solidity DApp。另外,Matter Labs 表示,UniSync 不隸屬于 Uniswap Labs,將在即將推出的 zkSync 2.0 主網啟動 Uniswap 實例。[2021/10/13 20:25:02]

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

瑞波沒有智能合約或由于代碼結果不確定、編程語言選擇等問題:在最近的一次研討會上,瑞波CTO David Schwartz和Coli CEO Stefan Thomas探討了為什么瑞波沒有智能合約。Stefan Thomas表示之前曾以谷歌本地客戶端為基礎推出過一個原型,但由于代碼不能產生確定性的結果,以及選擇何種編程語言等問題,他們沒有將智能合約整合進瑞波賬本。[2020/8/12]

漏洞示例

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

Cardano創始人回應BM的質疑:Cardano不是DPoS 智能合約和本地資產將在今年推出:8月1日,網友@crypto_spaced發推稱Cardano是DPoS,且EOS創始人Daniel Larimer(BM)在其很早前就稱Cardano是DPoS。Cardano創始人Charles Hoskinson回復稱:“我們不是DPoS。Ouroboros是一種全新的協議。”“BM說謊了,他還說我們的協議不起作用。他稱這是一件800磅重、擋不住子彈的防彈背心。我很抱歉,不管你信不信他,他說謊了,他把我們的協議說成DPoS是大錯特錯。”8月3日,BM回復Hoskinson稱:“你的協議不適用于貨幣以外的應用程序,對于大多數DeFi而言,確認等待時間太長,并且完全不適用于大多數用例。”Hoskinson對此表示:“智能合約和本地資產將在今年推出,我們的延遲比以太坊的更低。占主導地位的DeFi平臺hydra將把它帶到次秒級。引用中本聰的話:對不起,我沒有時間向你解釋。”[2020/8/3]

漏洞分析

金色財經現場報道 STBChain CEO劉海峰:智能合約對于區塊鏈公司是一項非常大的挑戰:金色財經現場報道,在4月3日舉辦的2018年世界區塊鏈峰會現場,STBChain CEO劉海峰表示:“區塊鏈里有一個很重要的概念,就是智能合約。目前來看,在做軟件開發的時候很多狀況下都無法把邏輯制定的特別完美,可能會存在一定的邏輯問題與bug,然而智能合約再發出之后便無法修改,仿若潑出去的水,無法再收回。而去中心化指的是移除了一個中心化的服務器,在智能合約的影響下可以讓數據可以在各節點進行存儲。從而確保了信息的安全性與不可篡改性,所以可以說智能合約非常重要,但由于其特性是后續無法更改,所以智能合約對于各區塊鏈公司來講,都是一個很大的挑戰。”[2018/4/3]

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

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:OREACKSTORSTOCcoreBLACKHOLEBerrystoreSTORM幣

比特幣價格實時行情
爆發中的6大公鏈平臺誰能超越以太坊成為年度黑馬_區塊鏈

區塊鏈經過一段時間的發展,終于有了能和以太坊相較量的公鏈平臺,這是非常不容易。由于以太坊的高gas費、共識機制等問題一直沒有得到很好地解決,在這樣的大環境下,其他公鏈的發展有了更廣闊的生存空間.

1900/1/1 0:00:00
元宇宙浪潮之下 數字身份至關重要_元宇宙

12月6日,國家語言資源監測與研究中心發布“2021年度十大網絡用語”,元宇宙一詞赫然于列。大廠入場元宇宙不足為奇,但元宇宙赫然成為網絡十大熱詞之一,可以想象該詞及背后的信息在網絡中被傳播所達到.

1900/1/1 0:00:00
反烏托邦的未來:元宇宙、Web 3.0和NFT游戲_NFT

從一開始所掀起的NFT游戲熱潮,再到火爆出圈的元宇宙概念,Web3.0世界的樣子終于在人們的腦海中逐步變得清晰起來.

1900/1/1 0:00:00
北京數字人民幣活動四大銀行各有“專精” 場景、方式各不相同_數字人

12月2日,據北京市地方金融監督管理局消息,按照穩妥有序推進北京冬奧會場景應用數字人民幣工作要求,為持續做好金融服務,建設安全便捷、優質高效的北京冬奧會支付服務環境.

1900/1/1 0:00:00
數據表明專業交易員目前更看好以太坊而非比特幣_LINK

今年以來,ETH的表現已經超過BTC230%。而且衍生品數據表明,交易員們認為這個山寨幣還有很大的上升空間。大多數交易員已經注意到,以太的價格已經遠遠領先于比特幣.

1900/1/1 0:00:00
鏈上社交能否迎來自己的SocialFi Summer?_CIA

幾天前,一句“求Monaco邀請碼!”刷屏了加密推特圈,一如當初Clubhouse的求碼熱潮,但狂歡僅維持了數天便偃旗息鼓,之后,甚至有不少的用戶倒戈相向,開始痛斥項目方.

1900/1/1 0:00:00
ads