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