資金盤FairWin漏洞系統詳解:專案方可以撇開“作惡”嫌疑了?

買賣虛擬貨幣

近日,一個名為“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 部署了0x11f5 開頭的合約,分析其合約原始碼發現,存在以下的呼叫:

不難發現,sendFeeToAdmin() 這一方法可以被任何使用者呼叫,一旦呼叫之後,FairWin 合約中的餘額就會被轉移至指定的 admin 地址之中。這一問題被 ConsenSys 的安全研究人員 Daniel Luca 發現,隨後專案方於07月27日部署了 0x01ea 開頭的新版合約,對該問題進行了修復。

如下圖,透過分析新版合約的程式碼發現,sendFeeToAdmin() 方法已被設定為 private

這樣的話,上述方法就無法被外部直接呼叫,上述問題也得到解決,但 PeckShield 安全人員深入分析發現,問題並沒有那麼簡單:由於區塊鏈的不可篡改特性,DApp 從舊合約升級到新合約,但使用者之前的投注記錄依然儲存於舊合約,專案方需要想辦法將使用者的投注記錄遷移至新合約。

為了解決這個問題,FairWin 團隊引入了remedy() 介面,用以將使用者的資產直接匯入到新合約之中:

新合約漏洞原理分析

透過分析 remedy() 介面,其實現數字資產遷移的大體流程如下:

  1. 確保 remedy() 這一操作當前處於開放狀態;

  2. 根據引數還原使用者的投注資料,並儲存到新合約的資料庫之中。

PeckShield 安全人員透過分析 Ethereum 鏈上資料發現,remedy() 在新合約上線之後一共被呼叫了 503 次,一共給 500 位投資者完成了資產遷移,並且這一呼叫方法均由 FairWin 管理員發起

不過,這一方法能否呼叫成功,取決於其中的 actStu 引數是否為 0,PeckShield 安全人員分析 FairWin 新合約程式碼發現了新的問題:

  1. actStu 預設為 0,也就是 remedy() 方法可以呼叫;

  2. closeAct() 方法將 actStu 設為 1,也就是關閉 remedy() 通道。

問題的關鍵就在於此:

closeAct() 方法新增了 onlyOwner 限制,而 remedy() 卻沒有加這一限制。

由於上述限制條件存在的不一致性,倘若合約 Owner 沒有透過 closeAct()  關閉 actStu 時,任何使用者都可以透過 remedy()  介面修改投注資料,進而實現在0投入的情況下,偽造大量資金投入,並透過 userWithDraw()  將合約餘額獎金取出。

值得慶幸的是,截至目前,尚沒有已知攻擊發生,且 FairWin 合約 owner 已經將actStu 關閉,潛在威脅暫時得以排除。

漏洞後續影響

FairWin 短期內依然保持較大的熱度,基於其也產生了諸如 EtherHonor、HyperFair 等仿盤,不排除這類仿盤也存在潛在問題的可能。

此外,在 FairWin 合約被曝存在安全問題後,有輿論聲音質疑稱,這可能是“專案方事先預留的後門並從中空手套白狼”,但,PeckShield 安全人員透過追蹤新舊合約的互動行為發現,專案方除了將舊合約已投注資金問題向新合約遷移之外,對於使用者投注錯誤的資金也給予了原路返還:

如下,在08月01日出現了一次呼叫:

  1. 0xa584 開頭的賬號(使用者)在區塊高度為 8263419 中向 FairWin 舊合約投注了 11ETH,

  2. 投注的金額被 0xcb10 在區塊高度 8264604 轉移到 FairWin 0x854d 管理員賬號之中,

  3. 之後在區塊高度為  8264613  的時候,管理員賬號又將這 11ETH 轉回給 0xa584 賬號(使用者)。

從鏈上行為初步看來,專案方是可以撇開“作惡”的嫌疑了。針對以上漏洞威脅, PeckShield 安全人員建議,對於智慧合約的敏感操作,應當新增相應的訪問許可權限制,對於上述的 remedy() 操作需要新增 onlyOwner 限制,以避免被其它人惡意使用。另外,對於使用者的數字資產,應當保持充分的敬畏之心。

對開發者而言,與此同時也暴露出一個問題,在合約升級過程中很可能冒出各種“新”的問題,專案方應第一時間針對問題進行應急響應,並可尋求第三方安全公司幫助其進行上線前潛在漏洞排查。

對使用者而言,即使這樣也並不意味著參與 FairWin 之後就可以“高枕無憂”了。畢竟,資金盤終歸是資金盤,當你在凝視深淵的時候,深淵也正在凝視著你。

(FairWin 合約地址餘額變動情況,來源:etherscan.io)

PeckShield 安全人員透過分析 ETH 的地址餘額曲線(如上圖)發現,在被曝出現漏洞威脅後,FairWin 合約的餘額有了明顯的下滑,可見漏洞問題給專案方帶來了一定的信任危機,大量的使用者開始撤出資金。考慮到資金盤的機制,短期餘額持續下滑的狀況可能會埋下一個“暴雷”的種子,PeckShield 在此提醒廣大使用者應謹慎參與此類資金盤專案,避免因其潛在不穩定性造成不可挽回的損失。

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;