背景概述
看了一個關于學習 solidity 的站(https://solidity-by-example.org),里面講了關于 solidity 智能合約的很多漏洞,考慮到現在針對智能合約的攻擊事件頻頻發生,不法分子盜取的加密資產越來越多,我就想寫一些與智能合約安全審計相關的文章給想了解智能合約安全審計的入門者閱讀,讓一些對智能合約安全審計感興趣的初學者可以學到如何識別一些常見的漏洞和如何利用這些漏洞去做什么事情。這次我們就一起先看一個很經典的漏洞 —— 重入漏洞。
前置知識
重入漏洞相信大家都有所耳聞了,那么什么是重入漏洞呢?
以太坊智能合約的特點之一是合約之間可以進行相互間的外部調用。同時,以太坊的轉賬不僅僅局限于外部賬戶,合約賬戶同樣可以擁有以太并進行轉賬等操作,且合約在接收以太的時候會觸發 fallback 函數執行相應的邏輯,這是一種隱藏的外部調用。
義烏發布數字人民幣試點10舉措:加大智能合約應用探索力度:金色財經報道,義烏市數字人民幣試點工作領導小組聯合辦公室發布《深入推進義烏小商品市場數字人民幣試點工作方案》,《方案》提出全面提升市場數字人民幣受理環境、推廣數字人民幣硬件錢包、加大智能合約應用探索力度、探索開展數字人民幣跨境支付應用等10條具體措施。[2023/3/25 13:26:15]
我們先給重入漏洞下個定義:可以認為合約中所有的外部調用都是不安全的,都有可能存在重入漏洞。例如:如果外部調用的目標是一個攻擊者可以控制的惡意的合約,那么當被攻擊的合約在調用惡意合約的時候攻擊者可以執行惡意的邏輯然后再重新進入到被攻擊合約的內部,通過這樣的方式來發起一筆非預期的外部調用,從而影響被攻擊合約正常的執行邏輯。
漏洞示例
好了,看完上面的前置知識我相信大家對重入漏洞都有了一個大致的了解,那么在真實的環境中開發者寫出什么樣的代碼會出現重入漏洞呢,下面我們來看一個比較典型的有重入漏洞的代碼:
Curve智能合約中鎖定總價值超過3億美元:7月23日發文稱,DeFi鎖定的總價值仍在上升。自上周五以來,DeFi穩定幣交易平臺Curve在其智能合約的鎖定總價值中增加了2.26億美元,現已超過3億美元。按照鎖定總價值計算,Curve已成為第五大最受歡迎的DeFi協議。(Decrypt)[2020/7/23]
漏洞分析
看到這里大家可能會有疑惑了,上面的代碼就是個普通的充提幣的合約,憑什么說他有重入攻擊呢?我們來看這個合約的 withdraw 函數,這個函數中的轉賬操作有一個外部調用(msg.sender.call{value: bal}),所以我們就可以認為這個合約是可能有重入漏洞的,但是具體能否產生危害還需要更深入的分析:
1. 所有的外部調用都是不安全的且合約在接收以太的時候會觸發 fallback 函數執行相應的邏輯,這是一種隱藏的外部調用,這種隱藏的外部調用是否會造成危害呢?
多家西班牙銀行合作完成概念測試,驗證在區塊鏈網絡中執行智能合約觸發支付:Banco Sabadell、Banco Santander、Bankia、BBVA和CaixaBank等多家西班牙銀行已成功完成一項新的概念測試,以在區塊鏈網絡中執行智能合約觸發支付。
該計劃由西班牙支付系統(SNCE)管理公司Iberpay協調,測試確認了在支付行業應用區塊鏈技術的可行性,允許在滿足某些預先設定的條件時自動執行支付,如合同簽訂時自動付款或收發貨后自動付款。(Finextra)[2020/7/15]
2. 我們可以看到在 withdraw 函數中是先執行外部調用進行轉賬后才將賬戶余額清零的,那我們可不可以在轉賬外部調用的時候構造一個惡意的邏輯合約在合約執行 balance[msg.sender]=0 之前一直循環調用 withdraw 函數一直提幣從而將合約賬戶清空呢?
動態 | 智能合約平臺RSK母公司收購拉丁美洲社交網站Taringa:據Bitcoinmagazine消息, 和比特幣雙向錨定的智能合約平臺Rootstock(RSK)網絡的母公司IOV Labs,近日收購了拉丁美洲社交網站Taringa,交易金額未公開。Taringa是一個擁有3000萬用戶的強大網絡。此次收購有望為IOVLabs提供寶貴的數據和信息,這些數據和信息是IOVLabs大規模測試和去中心化基礎設施建設所必需的。[2019/9/28]
下面我們看看攻擊者編寫的攻擊合約中的攻擊手法是否與我們的漏洞分析相同:
攻擊合約
我們看到 EtherStore 合約是一個充提合約,我們可以在其中充提以太。下面我們將利用攻擊合約將 EtherStore 合約中用戶的余額清零的:
這里我們將引用三個角色,分別為:
用戶:Alice,Bob
攻擊者:Eve
1. 部署 EtherStore 合約;
2. 用戶 1(Alice)和用戶 2(Bob)都分別將 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 合約中的以太大于或等于 1 Attack.fallback 就會一直調用 EtherStore.withdraw 函數將 EtherStore 合約中的以太提取到 Attack 合約中,直到 EtherStore 合約中的以太小于 1 。這樣攻擊者 Eve 會得到 EtherStore 合約中剩下的 2 個以太幣(Alice、Bob 充值的兩枚以太幣)。
下面是攻擊者的函數調用流程圖:
修復建議
看了上面的攻擊手法相信大家對重入漏洞都會有一個自己的認知,但是只會攻擊可不行,我們的目的是為了防御,那么作為開發人員如何避免寫出漏洞代碼還有作為審計人員如何快速發現問題代碼呢,下面我們就以這兩個身份來分析如何防御重入漏洞和如何在代碼中快速找出重入漏洞:
(1)作為開發人員
站在開發者的角度我們需要做的是寫好代碼,避免重入漏洞的產生。
1. 寫代碼時需要遵循先判斷,后寫入變量在進行外部調用的編碼規范(Checks-Effects-Interactions);
2. 加入防重入鎖。
下面是一個防重入鎖的代碼示例:
(2)作為審計人員
作為審計人員我們需要關注的是重入漏洞的特征:所有涉及到外部合約調用的代碼位置都是不安全的。這樣在審計過程中需要重點關注外部調用,然后推演外部調用可能產生的危害,這樣就能判斷這個地方是否會因為重入點而產生危害。
參考資料請見后文。 請注意,大多數建立在Ergo之上的應用程序都是由社區運營的,與Ergo基金會沒有正式關系.
1900/1/1 0:00:00a16z 合伙人 Chris Dixon 在推特上總結了目前 NFT 的七種類型,分別包括:1、藝術:這些可以是諸如 Cryptopunks 和「無聊猿」BAYC 之類的收藏品.
1900/1/1 0:00:00從一開始所掀起的NFT游戲熱潮,再到火爆出圈的元宇宙概念,Web 3.0世界的樣子終于在人們的腦海中逐步變得清晰起來.
1900/1/1 0:00:0011月24日,工行首席技術官呂仲濤在“數字金融創新應用與發展”研討會上,分享工行在區塊鏈創新應用方面的實踐與思考.
1900/1/1 0:00:00來源:清華大學社會治理與發展研究院;中關村大數據產業聯盟;2021年12月 目錄 導讀 第一章 中國區塊鏈產業發展宏觀分析 一、 國際熱點與趨勢 二、 中國區塊鏈產業發展概況三、 中國區塊鏈產業.
1900/1/1 0:00:00逐漸被勾勒出外形的GameFi,正在以井噴的速度涌現出更多的新興勢力,與他們的前輩相比,他們在畫質、游戲性、場景方面不斷的進行升級迭代,這其中或多或少的還在延續P2E的玩法.
1900/1/1 0:00:00