资金盘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() 这一操作当前处于开放状态;
- 根据参数还原用户的投注数据,并保存到新合约的数据库之中。
不过,这一方法能否调用成功,取决于其中的 actStu 参数是否为 0,PeckShield 安全人员分析 FairWin 新合约代码发现了新的问题:
closeAct() 方法添加了 onlyOwner 限制,而 remedy() 却没有加这一限制。
由于上述限制条件存在的不一致性,倘若合约 Owner 没有通过 closeAct() 关闭 actStu 时,任何用户都可以通过 remedy() 接口修改投注数据,进而实现在0投入的情况下,伪造大量资金投入,并通过 userWithDraw() 将合约余额奖金取出。
值得庆幸的是,截至目前,尚没有已知攻击发生,且 FairWin 合约 owner 已经将actStu 关闭,潜在威胁暂时得以排除。
漏洞后续影响
此外,在 FairWin 合约被曝存在安全问题后,有舆论声音质疑称,这可能是“项目方事先预留的后门并从中空手套白狼”,但,PeckShield 安全人员通过追踪新旧合约的交互行为发现,项目方除了将旧合约已投注资金问题向新合约迁移之外,对于用户投注错误的资金也给予了原路返还:
如下,在08月01日出现了一次调用:
对用户而言,即使这样也并不意味着参与 FairWin 之后就可以“高枕无忧”了。毕竟,资金盘终归是资金盘,当你在凝视深渊的时候,深渊也正在凝视着你。
(FairWin 合约地址余额变动情况,来源:etherscan.io)
PeckShield 安全人员通过分析 ETH 的地址余额曲线(如上图)发现,在被曝出现漏洞威胁后,FairWin 合约的余额有了明显的下滑,可见漏洞问题给项目方带来了一定的信任危机,大量的用户开始撤出资金。考虑到资金盘的机制,短期余额持续下滑的状况可能会埋下一个“暴雷”的种子,PeckShield 在此提醒广大用户应谨慎参与此类资金盘项目,避免因其潜在不稳定性造成不可挽回的损失。