资金盘FairWin漏洞系统详解:项目方可以撇开“作恶”嫌疑了?

PeckShield
PeckShield 机构得得号

Sep 30, 2019 PeckShield是面向全球的业内顶尖区块链安全团队。

摘要: 因被曝存在智能合约安全漏洞, FairWin被推上风口浪尖,一时间引来大众对于类 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() 接口,其实现数字资产迁移的大体流程如下:

  • 确保 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 在此提醒广大用户应谨慎参与此类资金盘项目,避免因其潜在不稳定性造成不可挽回的损失。

(作者:PeckShield,内容来自链得得内容开放平台“得得号”;本文仅代表作者观点,不代表链得得官方立场)

链得得仅提供相关信息展示,不构成任何投资建议
本文系作者 PeckShield 授权链得得发表,并经链得得编辑,转载请注明出处、作者和本文链接

更多精彩内容,关注链得得微信号(ID:ChainDD),或者下载链得得App

分享到:

相关推荐

    评论(0

    Oh! no

    您是否确认要删除该条评论吗?

    分享到微信