作者:Jagjit Singh,CoinTelegraph;編譯:五銖,金財經
一、智能合約中的潛在漏洞
儘管智能合約具有開創性,但它並非不受惡意方可能利用的缺陷的影響。
輸入驗證不足是一個普遍的弱點,使攻擊者能夠透過提供意外的輸入來影響合約的執行。此外,業務邏輯的不當應用可能會在合約中產生意外行為或邏輯差距,從而導致漏洞。此外,如果處理不當,不安全的外部呼叫(例如涉及與外部資料來源或其他合約的介面的呼叫)可能會造成漏洞。
重入攻擊是一個合約在完成其自身狀態變更之前從外部呼叫另一個合約時發生的弱點。這允許被呼叫合約重新進入呼叫合約,並可能再次執行其某些操作。這可能會導致意外的行為,並允許攻擊者改變合約的狀態,從而耗盡資金或產生其他負面影響。
考慮到此類攻擊的可能性,開發人員在使用外部合約或資料來源時也應謹慎行事,確保正確處理外部調用,以避免意外行為和漏洞。他們可以透過密切關注智能合約測試等安全程序來幫助保護智能合約免受不斷變化的威脅。
二、什麼是智能合約中的重入攻擊?
在智能合約中,當合約在完成自己的狀態變更之前從外部呼叫另一個合約或函數時,就會發生重入攻擊。
這允許被呼叫合約重新進入呼叫合約,並可能再次執行其部分操作,這可能會導致不可預見且頻繁的惡意行為。例如,合約A 呼叫合約B 發送資金,然後修改自己的狀態。
合約B 的程式碼可能包含一個回呼函數,允許其重新進入合約A,並可能在合約A 完成其狀態變更之前重新執行傳輸函數。這將使攻擊者能夠在完成初始交易之前多次從合約中獲取資金。
2016 年臭名昭著的以太坊區塊鏈上的去中心化自治組織(DAO) 駭客攻擊是另一個眾所周知的例子。攻擊者利用智慧合約程式碼中的重入缺陷,遞歸地從DAO 中刪除資金,最終導致價值數百萬美元的以太坊(ETH) 被盜。
此外,包括Uniswap、Lendf.Me、BurgerSwap、SURGEBNB、Cream Finance 和Siren Protocol 在內的多個去中心化金融(DeFi) 協議由於可重入漏洞而蒙受了重大財務損失。這些違規行為造成了350 萬美元至2,500 萬美元的損失,凸顯了DeFi 領域可重入漏洞帶來的持續威脅。
三、重入攻擊如何運作
重入攻擊利用智慧合約函數的順序執行和外部呼叫形成一個循環,攻擊者可以在完成之前多次執行特定函數,這可能會導致惡意行為和未經批准的資金提取。
在受害者完成狀態修改之前,攻擊者的合約有效地「欺騙」受害者的合約回調攻擊者的合約。此操作可能會導致重複提款或其他疏忽行為。
上圖示範了對智能合約的重入攻擊。攻擊者的合約呼叫受害者的「withdraw()」函數,該函數在更新餘額之前發送以太坊。然後,攻擊者的後備函數被觸發,再次遞歸調用withdraw()以從受害者合約中耗盡資金。這種攻擊利用了受害者在發送資金之前未能更新餘額的情況。
讓我們使用一個簡化的範例來分解重入攻擊的工作原理:
具有「提現」功能的智慧合約
假設有一個允許用戶提取資金的數位錢包智能合約。除了追蹤用戶餘額之外,該合約還具有提款功能,方便資金提取。提款功能通常允許用戶將他們的代幣或以太坊從智能合約提取到他們的個人錢包。
使用者互動和功能執行
用戶自行要求從錢包提款。他們使用提款功能輸入所需的提款金額。
提款函數會在呼叫時驗證使用者是否有足夠的資金進行提款。如果滿足要求,它將所需的資金轉移到用戶選擇的地址。
外部調用
這就是弱點顯現出來的地方。在提款反映在用戶的餘額中之前,合約會對另一個合約或帳戶進行外部呼叫。
遞迴調用
如果外部合約的程式碼包含可以再次呼叫原始合約的函數(例如另一個提款函數),則會建立一個遞歸循環。這使得可以在完成之前再次呼叫withdraw方法。
可重入利用
然後,攻擊者使用惡意合約來利用此循環。攻擊者合約在錢包合約呼叫外部合約期間,在餘額更新之前,快速再次呼叫錢包的提現函數。
回退功能
在某些情況下,智慧合約的回退功能(一種獨特的功能,當合約收到沒有任何資料或以太坊的呼叫時啟動)可能會被攻擊者使用。重入攻擊可以透過在資金仍在處理過程中重複調用回退函數來進行。
操縱和反覆提款
攻擊者的合約可以在同一筆交易中重複使用提款功能,因為錢包合約會延遲更新餘額,直到收到外部呼叫後。因此,這使得資金更容易在未經授權的情況下被取出,從而使攻擊者能夠竊取超出其合法權利的資金。隨後,它給錢包合約的用戶造成了巨大的經濟損失。
四、重入攻擊的後果
重入攻擊會對智慧合約用戶產生嚴重影響,因為它們有可能造成重大財務損失。
重入攻擊最直接的後果之一是未經授權提取或操縱易受影響的智能合約中保存的現金。攻擊者利用該漏洞反覆從合約中提取資金,耗盡合約餘額,並可能對在受影響合約中投資或儲存資產的用戶造成重大財務損失。
此外,重入攻擊可能會削弱用戶對智慧合約和區塊鏈技術安全性和完整性的信心。重入漏洞可能會產生災難性的影響,2016 年以太坊區塊鏈上的DAO 駭客事件等備受矚目的事件就證明了這一點,該事件造成了巨大的經濟損失並損害了社區的聲譽。
除了短期財務後果之外,重入攻擊還可能產生長期影響,例如監管和法律關注、投資者信任度下降以及對區塊鏈平台和專案聲譽的損害。容易受到攻擊的認知可能會導致用戶在與智慧合約互動或投資去中心化應用程式(DApp)時保持謹慎,從而阻礙區塊鏈技術的採用和擴展。
五、如何減輕重入攻擊
在智慧合約創建和稽核方面實施最佳實務對於減輕重入威脅是必要的。
這包括使用具有安全記錄的知名程式碼庫,這是實現這一目標的一種方法。這些庫經過了廣泛的測試和同行評審,這降低了引入漏洞的機會。
開發人員還應該使用「檢查-效果-互動」設計等安全檢查,透過確保狀態修改以原子方式發生,最大限度地減少重入攻擊的機會。如果可用的話,可以使用可重入安全的智慧合約開發框架來新增針對此類漏洞的額外防線。
開發人員不太可能手動添加安全保護,因為這些框架通常包含專門設計用於避免重入攻擊的內建方法和保護措施。然而,由於區塊鏈安全仍在發展,開發人員必須繼續尋找新的威脅和弱點。