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