背景概述
看了一個關于學習solidity的站,里面講了關于solidity智能合約的很多漏洞,考慮到現在針對智能合約的攻擊事件頻頻發生,不法分子盜取的加密資產越來越多,我就想寫一些與智能合約安全審計相關的文章給想了解智能合約安全審計的入門者閱讀,讓一些對智能合約安全審計感興趣的初學者可以學到如何識別一些常見的漏洞和如何利用這些漏洞去做什么事情。這次我們就一起先看一個很經典的漏洞——?重入漏洞。
前置知識
重入漏洞相信大家都有所耳聞了,那么什么是重入漏洞呢?
以太坊智能合約的特點之一是合約之間可以進行相互間的外部調用。同時,以太坊的轉賬不僅僅局限于外部賬戶,合約賬戶同樣可以擁有以太并進行轉賬等操作,且合約在接收以太的時候會觸發fallback函數執行相應的邏輯,這是一種隱藏的外部調用。
DAO Maker將推出DAO Farm、單一資產質押以及DAO Vesting三個多鏈智能合約服務產品:8月17日消息,加密Launchpad平臺DAO Maker展示三個多鏈智能合約服務產品,包括DAO Farm、單一資產質押以及DAO Vesting。其中,DAO Farm允許想要建立挖礦池的項目或公司在申請后在DAO Farm上線;單一資產質押還為用戶提供有關代幣歸屬時間表的詳細信息;DAO Vesting允許客戶提前定義其歸屬合約選項,添加鎖倉(cliff)、線性、非線性和epoch或所有這些的組合。[2022/8/17 12:31:40]
我們先給重入漏洞下個定義:可以認為合約中所有的外部調用都是不安全的,都有可能存在重入漏洞。例如:如果外部調用的目標是一個攻擊者可以控制的惡意的合約,那么當被攻擊的合約在調用惡意合約的時候攻擊者可以執行惡意的邏輯然后再重新進入到被攻擊合約的內部,通過這樣的方式來發起一筆非預期的外部調用,從而影響被攻擊合約正常的執行邏輯。
Algorand發布最新的協議升級,改進智能合約開發:據官方公告,Algorand發布最新的協議升級,改進智能合約開發。最新的協議更新使開發人員能夠通過Algorand虛擬機 (AVM) 構建快速、強大且具有成本效益的去中心化應用程序 (Dapps),它的用例包括Web 3.0、DeFi和NFT。
AVM促進了可訪問語言的智能合約開發,如Python和Reach,該項目還致力于開放使用Clarity、C、c++、Go、Rust、Haskell、JavaScript等語言編寫代碼。和圖靈完備語言一樣,AVM支持新的操作碼、更大的程序規模,并允許開發人員使用循環、函數和遞歸。
Algorand的首席產品官Paul Riegle解釋說:“已經在Algorand上編寫和部署智能合約的開發人員通過使用Teal與AVM的早期版本進行交互,并給我們反饋,這使我們能夠快速迭代和改進AVM。我們很高興這個版本對開發者社區開放,并期待在未來的幾個月里有更多的改進。”
以太坊合約可以在升級后更容易地移植到Algorand,從而實現更精確的應用。AVM還提供了一些新功能,比如允許交易費用共享的原子轉賬,以多種方式最大化區塊鏈存儲,以及創建自動做市商(AMM)。[2021/7/5 0:28:42]
漏洞示例
動態 | Cobbs Allen合作Data Gumb 為其智能合約提供保險:伯明翰風險管理機構Cobbs Allen已與總部位于休斯頓的區塊鏈公司Data Gumbo達成合作,為其區塊鏈智能合約提供保險。(Birmingham Business Journal)[2019/12/27]
好了,看完上面的前置知識我相信大家對重入漏洞都有了一個大致的了解,那么在真實的環境中開發者寫出什么樣的代碼會出現重入漏洞呢,下面我們來看一個比較典型的有重入漏洞的代碼:
漏洞分析
看到這里大家可能會有疑惑了,上面的代碼就是個普通的充提幣的合約,憑什么說他有重入攻擊呢?我們來看這個合約的withdraw函數,這個函數中的轉賬操作有一個外部調用,所以我們就可以認為這個合約是可能有重入漏洞的,但是具體能否產生危害還需要更深入的分析:
動態 | TRON-IDE編譯工具支持開發者完成智能合約的編譯及部署工作:據官方最新消息,TRON-IDE編譯工具已經可以支持開發者簡易快捷的完成智能合約的編譯及部署工作。TRON-IDE是一款基于波場TRON公鏈開發供開發者使用的智能合約編譯工具,經過多個版本迭代和不間斷的灰度發布,到目前為止,TRON-IDE已經達到面向全量用戶發布的標準,可以支持開發者簡易快捷的完成智能合約的編譯及部署工作。[2019/12/19]
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.加入防重入鎖。
下面是一個防重入鎖的代碼示例:
作為審計人員
作為審計人員我們需要關注的是重入漏洞的特征:所有涉及到外部合約調用的代碼位置都是不安全的。這樣在審計過程中需要重點關注外部調用,然后推演外部調用可能產生的危害,這樣就能判斷這個地方是否會因為重入點而產生危害。
本篇筆記,來自葦草智酷主辦的智酷沙龍119期。在吳桐帶來關于元宇宙的思考之后,引發了多位學者的討論。本期筆記上半部分是吳桐對胡泳老師觀點的回應,下半部分是胡延平老師對元宇宙的批判.
1900/1/1 0:00:00近段時間,元宇宙概念可謂席卷了各位的微信和朋友圈,仿佛不懂元宇宙就不好意思去跟別人來聊天,連Facebook也借著這股風向.
1900/1/1 0:00:00為什么下一次熊市不會像上一次那樣?事實上,我們可能根本沒有熊市或者我們可能有半個熊市,不管如何定義市場狀態,這取決于您的看法。從廣義上說,加密貨幣有兩個群體,分別是貨幣加密和技術加密.
1900/1/1 0:00:002021年11?30?,據慢霧區消息,DeFi平臺MonoXFinance遭遇攻擊,本次攻擊中約合1820萬美元的?WETH和1050萬美元的MATIC被盜.
1900/1/1 0:00:00元宇宙應用,DeFi和NFT的結合——Gamefi最近一個月,GameFi之上的元宇宙以及個別概念幣種,仿佛接過了去年DeFi點燃整個市場行情的大棒,讓大家意識到了其背后的潛力.
1900/1/1 0:00:00不知不覺,距離《復仇者聯盟4:終局之戰》上映已經過了近兩年半的時間。 漫威宇宙已經正式進入第四階段,并且播出了包括《旺達幻視》《黑寡婦》《洛基》等一系列作品.
1900/1/1 0:00:00