近日,一個名為“FairWin”的資金盤專案尤為引人矚目,受其影響,以太坊網路 Gas 消耗量持續處於高飽和的狀態,其單個 DApp 的 Gas 利用率就達到了以太坊網路可承載 Gas總量的近半數。
然而,因被曝存在智慧合約安全漏洞, FairWin被推上風口浪尖,一時間引來大眾對於類 FairWin 遊戲命運乃至整體以太坊網路穩定性的擔憂。
概述
北京時間2019年09月27日,PeckShield 安全人員在深入分析 FairWin 智慧合約時發現,FairWin 智慧合約存在一些因管理許可權問題引發的致命缺陷,舊合約中的餘額可被使用者任意操作並轉移,且在升級後的新合約又存在一個新問題,使得使用者可以製造虛假投注來撈取獎池剩餘資金。
FairWin 合約問題的由來
經 PeckShield 旗下 DApp 資料服務平臺 DAppTotal.com 最新監測資料顯示,自08月26日以來,以太坊網路每日 Gas 消耗量持續處於高度飽和的狀態,即每日 Gas 消耗量佔以太坊網路可承載 Gas 總量的90%以上,整體網路狀況異常擁堵。
造成持續擁堵原因為,最近橫空出世了一個名為 FairWin 的資金盤專案,其每日 Gas 消耗量佔比達到了以太坊網路可承載總量的近半數(如下圖)
PeckShield 安全人員透過分析FairWin智慧合約程式碼發現,在06月17日,FairWin 部署了
不難發現,sendFeeToAdmin()
這一方法可以被任何使用者呼叫,一旦呼叫之後,FairWin 合約中的餘額就會被轉移至指定的 admin 地址之中。這一問題被 ConsenSys 的安全研究人員 Daniel Luca 發現,隨後專案方於07月27日部署了
如下圖,透過分析新版合約的程式碼發現,:
這樣的話,上述方法就無法被外部直接呼叫,上述問題也得到解決,但 PeckShield 安全人員深入分析發現,問題並沒有那麼簡單:由於區塊鏈的不可篡改特性,DApp 從舊合約升級到新合約,但使用者之前的投注記錄依然儲存於舊合約,專案方需要想辦法將使用者的投注記錄遷移至新合約。
為了解決這個問題,FairWin 團隊引入了 介面,用以將使用者的資產直接匯入到新合約之中:
新合約漏洞原理分析
透過分析 remedy() 介面,其實現數字資產遷移的大體流程如下:
確保 remedy() 這一操作當前處於開放狀態;
根據引數還原使用者的投注資料,並儲存到新合約的資料庫之中。
PeckShield 安全人員透過分析 Ethereum 鏈上資料發現,remedy()
在新合約上線之後一共被呼叫了 503 次,一共給 500 位投資者完成了資產遷移,並且這一呼叫方法均由 FairWin 管理員發起。
不過,這一方法能否呼叫成功,取決於其中的 actStu
引數是否為 0,PeckShield 安全人員分析 FairWin 新合約程式碼發現了新的問題:
actStu 預設為 0,也就是 remedy() 方法可以呼叫;
closeAct() 方法將 actStu 設為 1,也就是關閉 remedy() 通道。
問題的關鍵就在於此:
closeAct()
方法新增了 onlyOwner
限制,而 remedy()
卻沒有加這一限制。
由於上述限制條件存在的不一致性,倘若合約 Owner 沒有透過 closeAct() 關閉 actStu 時,任何使用者都可以透過 remedy() 介面修改投注資料,進而實現在0投入的情況下,偽造大量資金投入,並透過 userWithDraw() 將合約餘額獎金取出。
值得慶幸的是,截至目前,尚沒有已知攻擊發生,且 FairWin 合約 owner 已經將actStu 關閉,潛在威脅暫時得以排除。
漏洞後續影響
FairWin 短期內依然保持較大的熱度,基於其也產生了諸如 EtherHonor、HyperFair 等仿盤,不排除這類仿盤也存在潛在問題的可能。
此外,在 FairWin 合約被曝存在安全問題後,有輿論聲音質疑稱,這可能是“專案方事先預留的後門並從中空手套白狼”,但,PeckShield 安全人員透過追蹤新舊合約的互動行為發現,專案方除了將舊合約已投注資金問題向新合約遷移之外,對於使用者投注錯誤的資金也給予了原路返還:
如下,在08月01日出現了一次呼叫:
0xa584 開頭的賬號(使用者)在區塊高度為 8263419 中向 FairWin 舊合約投注了 11ETH,
投注的金額被 0xcb10 在區塊高度 8264604 轉移到 FairWin 0x854d 管理員賬號之中,
之後在區塊高度為 8264613 的時候,管理員賬號又將這 11ETH 轉回給 0xa584 賬號(使用者)。
從鏈上行為初步看來,專案方是可以撇開“作惡”的嫌疑了。針對以上漏洞威脅, PeckShield 安全人員建議,對於智慧合約的敏感操作,應當新增相應的訪問許可權限制,對於上述的 remedy() 操作需要新增 onlyOwner 限制,以避免被其它人惡意使用。另外,對於使用者的數字資產,應當保持充分的敬畏之心。
對開發者而言,與此同時也暴露出一個問題,在合約升級過程中很可能冒出各種“新”的問題,專案方應第一時間針對問題進行應急響應,並可尋求第三方安全公司幫助其進行上線前潛在漏洞排查。
對使用者而言,即使這樣也並不意味著參與 FairWin 之後就可以“高枕無憂”了。畢竟,資金盤終歸是資金盤,當你在凝視深淵的時候,深淵也正在凝視著你。
(FairWin 合約地址餘額變動情況,來源:etherscan.io)
PeckShield 安全人員透過分析 ETH 的地址餘額曲線(如上圖)發現,在被曝出現漏洞威脅後,FairWin 合約的餘額有了明顯的下滑,可見漏洞問題給專案方帶來了一定的信任危機,大量的使用者開始撤出資金。考慮到資金盤的機制,短期餘額持續下滑的狀況可能會埋下一個“暴雷”的種子,PeckShield 在此提醒廣大使用者應謹慎參與此類資金盤專案,避免因其潛在不穩定性造成不可挽回的損失。