背景概述
看了一個關于學習solidity的站,里面講了關于solidity智能合約的很多漏洞,考慮到現在針對智能合約的攻擊事件頻頻發生,不法分子盜取的加密資產越來越多,我就想寫一些與智能合約安全審計相關的文章給想了解智能合約安全審計的入門者閱讀,讓一些對智能合約安全審計感興趣的初學者可以學到如何識別一些常見的漏洞和如何利用這些漏洞去做什么事情。這次我們就一起先看一個很經典的漏洞——?重入漏洞。
前置知識
重入漏洞相信大家都有所耳聞了,那么什么是重入漏洞呢?
以太坊智能合約的特點之一是合約之間可以進行相互間的外部調用。同時,以太坊的轉賬不僅僅局限于外部賬戶,合約賬戶同樣可以擁有以太并進行轉賬等操作,且合約在接收以太的時候會觸發fallback函數執行相應的邏輯,這是一種隱藏的外部調用。
VentureFlow宣布支持波卡智能合約平臺Moonbeam:5月24日消息,VentureFlow宣布將為Moonbeam提供一站式Web3 Saas服務工具和解決方案,幫助其更高效地管理生態項目和融資需求,提高生態項目曝光度并加速生態發展。VentureFlow是專為Web3 VC 設計的SaaS工具平臺,包含提供項目融資信息、投前投后管理,到可視化投資回報分析的一站式服務,旨在為投資人提供更便捷的投資管理及團隊協作工具。
Moonbeam是一個智能合約平臺,用于構建跨鏈互連應用程序,能夠訪問任何鏈上的用戶、服務等。通過將來自以太坊、Cosmos、波卡等功能整合到一個平臺中,Moonbeam解決了當今用戶體驗碎片化的問題,解鎖了互操作性。[2023/5/24 15:23:07]
我們先給重入漏洞下個定義:可以認為合約中所有的外部調用都是不安全的,都有可能存在重入漏洞。例如:如果外部調用的目標是一個攻擊者可以控制的惡意的合約,那么當被攻擊的合約在調用惡意合約的時候攻擊者可以執行惡意的邏輯然后再重新進入到被攻擊合約的內部,通過這樣的方式來發起一筆非預期的外部調用,從而影響被攻擊合約正常的執行邏輯。
API3推出智能合約隨機數生成器,可在Avalanche、Moonbeam等區塊鏈上使用:5月3日消息,一種依賴量子力學來生成由區塊鏈技術支持的智能合約驅動數據集的隨機數生成器已經在十幾個加密貨幣協議上推出。
API3與澳大利亞國立大學量子光學組的一組研究人員合作,將其新產品ANU GRNG稱為第一個“真正的”智能合約隨機數生成器。
API3表示,公司正在啟動的13個區塊鏈中,有10個還沒有可用的隨機數生成器。其中一些協議使用不使用量子技術的隨機數生成器,這意味著它們的數據集是有限的,或者用行業術語來說是“偽隨機數”。
新服務可在包括Avalanche、Fantom、Moonbeam、Polygon和RSK在內的區塊鏈上使用,并計劃在未來進行更多集成。
該公司并不靠隨機數生成器盈利,而是將其引入其他產品線,比如預言機解決方案和數據集成服務,包括一個依賴于質押原生代幣運行的驗證池。(Blockworks)[2022/5/4 2:48:24]
漏洞示例
智能合約協議Plasm集成Chainlink喂價:金色財經報道,基于Polkadot的Substrate框架構建的智能合約協議Plasm集成了Chainlink(LINK)的喂價。據悉,Chainlink有可能很快就會成為Polkadot的平行鏈。Plasm首席執行官Sota Watanabe表示,打算將Chainlink的數據預言機用于Plasm的代幣分發機制Lockdrop。Sota稱,當Chainlink成為Polkadot平行鏈,Plasm就可以獲取數據并將數據從Chainlink區塊鏈發送到Plasm網絡。[2020/8/13]
好了,看完上面的前置知識我相信大家對重入漏洞都有了一個大致的了解,那么在真實的環境中開發者寫出什么樣的代碼會出現重入漏洞呢,下面我們來看一個比較典型的有重入漏洞的代碼:
螞蟻集團:區塊鏈有望通過智能合約使網絡互助流程更加自動化:最近,螞蟻集團發布全國首份《網絡互助行業白皮書》。白皮書也指出,未來10年,關鍵核心的數字技術將在網絡互助行業獲得更深層次應用,如大數據、知識圖譜等技術將使智能賠付流程更加精準化,未來區塊鏈技術也有望通過智能合約使網絡互助流程更加自動化。(科技日報)[2020/7/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.加入防重入鎖。
下面是一個防重入鎖的代碼示例:
作為審計人員
作為審計人員我們需要關注的是重入漏洞的特征:所有涉及到外部合約調用的代碼位置都是不安全的。這樣在審計過程中需要重點關注外部調用,然后推演外部調用可能產生的危害,這樣就能判斷這個地方是否會因為重入點而產生危害。
北京時間12月8日晚11?點,題為“數字資產和金融的未來:了解美國金融服務的挑戰和好處”聽證會舉行,此次聽證會出席證人包含:JeremyAllaire.
1900/1/1 0:00:0012月6日,科技部發布了國家重點研發計劃“區塊鏈”重點專項2021年度擬立項項目安排公示的通知,并公示了10個項目.
1900/1/1 0:00:0012月6日,國家語言資源監測與研究中心發布“2021年度十大網絡用語”,元宇宙一詞赫然于列。大廠入場元宇宙不足為奇,但元宇宙赫然成為網絡十大熱詞之一,可以想象該詞及背后的信息在網絡中被傳播所達到.
1900/1/1 0:00:00比特幣在過去幾年的回報率遠遠高于通貨膨脹率,目前通貨膨脹率超過6%,預計未來幾個月還會增長更多。這鞏固了該資產作為通脹最佳對沖工具的地位。然而,比特幣找到了另一個競爭對手.
1900/1/1 0:00:00由《商業周刊/中文版》主辦的TheYearAhead展望2022峰會,2021年12月9-10日在上海浦東陸家嘴國際金融中心麗思卡爾頓酒店精彩呈現.
1900/1/1 0:00:00新冠疫情是人類社會進入21世紀后經歷的一場全球性的重大危機,其對全球現狀與未來的改變已經不能簡單地用“黑天鵝事件”來形容。目前,疫情依舊在全球肆虐,多個國家的確診病例和死亡病例仍然屢創新高.
1900/1/1 0:00:00