作者:Beosin安全研究專家Sivan
上一篇文章我們介紹了近期區塊鏈生態中發生的騙局類資金安全問題,包括後門以及貔貅盤。除了這些騙局事件,近期安全事件也對整個區塊鏈生態造成了巨大的影響。
最近發生大量的安全攻擊事件,這些事件對於項目方來說具有重大影響。攻擊事件的發生主要原因之一是業務邏輯設計不當,其中可能存在漏洞或弱點,被黑客利用進行攻擊。另外,價格操控也是導致安全攻擊事件的因素之一,黑客可能通過操縱價格或市場行爲來實施攻擊。
本篇文章我們一起來盤點一下近期常見攻擊都有些什么特點,以及項目方如何避免這些問題。
一、業務邏輯設計不當
Pair代幣意外銷毀
近期因爲業務邏輯設計不當發生的安全事件,大多都是由於pair代幣余額異常導致的。
一些代幣項目,會在業務設計中添加交易手續費或代幣通縮的功能,也就是在代幣轉移過程中,會收取相關比例的手續費或者直接銷毀部分轉移的代幣。這本是一個項目的創收或激勵用戶持有代幣或其他有助於項目發展的業務邏輯,但如果代碼設計不夠完善,便會出現嚴重的問題。
例如,在轉账過程中,有些項目進行額外代幣扣除時,沒考慮到pair意外扣除將導致嚴重後果。該類項目的轉账函數邏輯一般是發送方和接收方進行正常的代幣轉移,並且額外扣除某個地址部分費用,用於手續費或銷毀。但額外扣除地址爲pair時,會導致pair中其中一個代幣余額通過非交易的方式變少,k值異常變化,從而使用少量代幣便能兌換出大量另一個代幣。
以下列項目代碼爲例:
該代幣合約中存在意外銷毀pair余額的問題,當代幣轉移發起者不是pair合約時,會進行更新池子的操作,該更新池子的方式是將pair的代幣余額扣除交易金額的1%,再更新儲備量。黑客可以通過調用transfer函數自己給自己轉账,反復操作,將會使得pair中的一個代幣消耗得極少,最後利用極少代幣將pair中大量的價值幣兌換出來。
以下是真實安全事件過程:
首先使用2555枚WBNB兌換了1390億枚Bamboo代幣;
不斷通過transfer將代幣發送給自己,導致pair中Bamboo代幣異常減小;
使用139B枚Bamboo代幣兌換回2772枚WBNB,完成攻擊。
再以另一個意外銷毀pair代幣的例子說明一下,如下圖代碼。合約會判斷當前交易類型,如果爲2(to地址爲pair合約,相當於賣幣),合約會記錄一個交易量的20%作爲銷毀數量,後續可以調用goDead()函數將pair中這個累積數量銷毀,該功能對穩定幣價能起部分作用。
但是合約沒考慮到一些特殊情況,例如直接向pair裏面轉幣,這時會使得合約誤以爲用戶是在賣幣,這部分幣可以通過pair的skim函數全部提取出來。相當於pair沒有任何變化,再次調用goDead()函數時,卻能使得pair中的代幣意外減少,重復操作,便能耗盡pair其中一種代幣。
以下同樣是真實安全事件過程:
不停通過transfer與skim操作,將amountToDead值控制得異常大。
調用goDead()函數將pair中的代幣銷毀掉。
使用少量代幣兌換了大量的USDT。
總結:
代幣的transfer函數一定要認真設計代幣轉移邏輯,一定要避免pair余額意外扣除的情況,pair余額僅在添加流動性、移除流動性以及交易過程中才能改變,並且改變數量盡量不要大於或小於傳入數量,才能保障pair資金健康。
二、價格操控問題
對於價格操控的攻擊事件,主要是由於項目方合約在獲取價格的時候沒有考慮到價格被意外控制的情況。特別是對於存在兩個逆向計算的業務邏輯函數,如stake&unstake、deposit&withdraw等,兩種操作一般都使用相同的參數但相反的計算邏輯。
而在這兩種操作之間,如果能通過其他函數或合約將其中的部分或全部參數進行不對等的控制,那么兩種操作之間便可能存在價格差,從而導致資產被盜。
1、只讀重入
重入一直是區塊鏈生態中最常見也是危害最大的漏洞之一。在以太坊最开始盛行的時候,重入攻擊大多是因爲以太坊轉账調用的目標函數fallback()中再次發起了對該項目合約的調用,此時項目合約變量還未更新,可以繞過相關檢查,如DAO事件。
隨着以太坊生態越來越豐富,各個項目方更加注重這一方面的防護以及solidity0.8.0版本之後對溢出的主動檢查,現在更多的攻擊事件是通過重入來控制某些價格或參數,來達到攻擊的目的。
例如近期發生頻繁的只讀重入,便是通過重入前後變量未修改完全,使得重入中調用的計算價格的函數出現異常,從而導致資產被盜。
2、Pair余額依賴
Pair可以最直觀的表現出代幣價格變化,也是最准確的價格獲取渠道,但pair中的價格是瞬時價格,並且可以通過大量代幣兌換來控制,導致瞬間暴漲或暴跌。如果依賴pair中的價格作爲業務中的參數參與計算,那么便可能導致異常的結果。
如下代碼,burnForEth函數通過依賴pair中能兌換出的數量來作爲本合約發送給調用者的ETH數量,該數量是通過pair中兩種代幣余額來進行計算。正常情況下這是一個最准確的價格,但是如果提前使用ETH將pair中的另一個代幣大量兌換出來,會導致ETH在該pair中的價格暴跌,從而計算出能兌換的ETH就會異常大,使得合約給調用者發送更多的ETH。最後,調用者通過pair將ETH兌換回來,使價格恢復正常。
以下是真實安全事件過程:
攻擊者使用閃電貸的ETH將大量WAX代幣兌換出來,導致WAX價格暴漲。
攻擊者不斷調用burnForEth函數,銷毀WAX來取出ETH,此時使用的WAX價格時暴漲過後的,可以獲得更多的ETH。
最後,攻擊者將ETH兌換出來,歸還閃電貸並獲利。
總結:
安全事件一直都是區塊鏈生態最大的威脅之一,需要項目方時刻保持警惕。對於需要計算價格的業務邏輯要有嚴格的流程把控,盡量避免直接使用pair余額進行價格計算,調用外部函數獲取價格也需要考慮其是否能被操控。項目方也可以與專業的安全合作夥伴合作,及時發現並應對潛在的安全威脅。
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播信息之目的,不構成任何投資建議,如有侵權行為,請第一時間聯絡我們修改或刪除,多謝。