一行代码蒸发了5,300,000元

2018-10-16  本文已影响13人  helloEOS

本文转载自dapdap区块链,昨日 EOSBet 被盗14万 EOS,文中分析了 EOSBet 3次被黑客攻击的过程。

**EOSBet **是利用区块链技术,运行在 EOS 公链上的一款菠菜游戏。上线两个月,盈利近百万的 EOSBet 昨日又因营销活动推向了一个小高潮,日活突破千人, 稳坐 EOS DAPP 当日榜首。

不过刚高兴了一天的 EOSBet, 却因代码漏洞,再次被黑客攻击了。

这是 EOSBet 上线以来第三次被攻击了!

无论表面数据如何风光,但菠菜类游戏始终有极大的风险,想要入场的朋友请谨慎。我们今天不谈其他,仅从技术角度来分析,EOS 开发者的现状到底如何,EOSBet 为何屡次被黑客攻击,我们到底需要什么样的机制。

01 复盘 EOSBet 三次被黑客攻击

1****黑客对 EOSBet 的第一次攻击:****

早在游戏上线第二天,EOSBet 就被黑客利用 EOS 网络本身缺陷,吸取了很多内存。当日团队紧急的作出修复,而且 EOSIO 已经在着手修复该漏洞。

可能是对自己的代码不自信,也可能是为了防止被攻击,或是有什么隐藏的后门,EOSBet 项目代码尚未开源。可即使代码未开源,EOSBet 也难逃被黑客再次攻击。

2****黑客对 EOSBet 的第二次攻击:****

就在上个月,EOS 上多个菠菜类 DAPP 接连被黑客攻击,累计被薅走数百万。EOSBet 也是那次攻击中损失最惨重的。

9月14日上午11点左右,EOS 账号 aabbccddeefg 在未进行投注的情况下,却以中奖的方式, 在20多分钟的时间内,赢得了4.2万个 EOS(总价值约为150万人民币)及投注产生的1千多个平台代币BET。

据分析,EOSBet 被攻击,是因为代码中并没有检查收到的 EOS 是不是eosio.token 产生的 EOS,黑客通过自己创建的名字同为 EOS 的“假币”,套取了真的 EOS。

那次黑客事件的详细复盘链接:****https://bihu.com/article/1378930

3黑客对 EOSBet 的第三次攻击:

接连两次被攻击,EOSBet 也更加注重安全审计。

EOSBet 已经将奖池的30万 EOS 转入冷钱包,同时将每把游戏上限由1%提升到4%,保持最大押注额不变,以保障大户的游戏体验。EOSBet 表示会尽最大努力,保障最基本也是最重要的安全问题。

可惜,第三次攻击还是发生了,而且损失金额更大! 就在刚刚,EOSBet 再次被黑客攻击,直接损失了14万 EOS!!!

02 第三次黑客攻击来龙去脉

EOSBet 这次的攻击是因为下面的这段代码:

attribute((eosio_action))

void transfer(account_name from, account_name to, asset quantity, string memo){

require_recipient(RECIPIENT_CONTRACT);

}

主要问题是出在没有判断用户的转账是转给了其他账户,还是转给了 EOSBet的合约。

image

以上图片引用自慢雾科技文章 <EOS DApp 充值“假通知”漏洞分析>

简单来说,就是黑客自己创建了两个账户,攻击账户A和无关账户B,而B是一个合约账户,每次转账成功之后,B账户就会自动发个通知给EOSBet的合约说转账收到了。

EOSBet 的合约收到这个通知后,没有检查自己是否真的收到了 EOS,误把账户A对账户B的转账判断成了账户A对 EOSBet 合约账户的转账。也就是把账户A当成了 EOSBet 下注了的玩家,给玩家开奖。

黑客于是就用这个漏洞,空手套白狼,不断开奖,给自己开了14万 EOS 的奖!

那么这个漏洞该如何修复呢?其实很简单,只需要加一句判断,**if (to != _self) return ; **来判断传来的转账通知是不是转给自己的。

于是, 就因为缺少了一句判断,EOSBet 这次被黑客提走14万 EOS。EOS 现价约为5.48USD(转换成人民币大概在38元),14万个 EOS 累计530万人民币!!!

****03 CPU 告急,大户人家的游戏****

EOS 的开发者除了要担心合约被黑客攻击之外,被爆 CPU 也是常有的事。

转账是执行区块链 DAPP 智能合约的基本功能,在以太坊上的转账是要消耗 Gas 的,用户支付越高的 Gas 费用,交易越容易被矿工优先记录和执行。EOS 的转账交易虽然是免费的,但同时需要占用和消耗少量的资源来保证系统的安全。

EOS 执行交易主要是依靠三种资源:ram、带宽、CPU。

其中 ram 是需要购买和消耗的,带宽和 CPU 是通过抵押 EOS 来获得的。通常 DAPP 开发者会为用户抵押一定的带宽和 CPU 资源,来降低用户入场门槛。如果 DAPP 开发者没有抵押足够的资源给用户,同时用户自己也没有抵押足够的资源的话,是无法与合约进行交互的。

举个例子,假设全网一共抵押了100个 EOS 来置换 CPU 资源,那么抵押了1个 EOS 的账号则被分配全网1%的 CPU。这个候,有个账号抵押了100个 EOS 的 CPU,那么之前抵押了 EOS 的账号被分配的 CPU 就被稀释了一半。此时再来一个大户抵押10000个 EOS,那么之前抵押了 EOS 的账号被分配的CPU 就被严重稀释,导致不够资源来执行操作。

ITE4是一种早期入场回报极高,后期砸盘极快的游戏,获得盈利要拼“入场早”和“跑得快”。该资金盘游戏上线前,有人大量质押和租赁 CPU 资源,导致项目上线时,各账号的 CPU 资源占比被大大的稀释。大部分玩家在开局时没有足够的 CPU 资源入场买进,而有幸买进入场的用户在项目砸盘时也没有足够的 CPU 资源离场,坐等被收割。

因为 EOS 上 CPU 资源总量有限,导致大户在抵押 EOS 换取资源上有着很强的优势。所以最近每当有一些大型 DAPP 搞活动或者新资金盘游戏上线时,便会有大量的 EOS 用于抵押 CPU,稀释小户的 CPU 占比,导致大量 DAPP 瘫痪。

难怪有人说,EOS 是大户人家玩的游戏。

04 总结——开源的力量

EOS 上线仅4个月,很多开发者刚刚进入到这个领域,开发者没有太多成熟案例可以参考和借鉴,必然会经历一段踩坑期。EOSBet 合约尚未开源,屡次被攻击都是因为缺少一行简单的判断代码,而酿成重大损失。

我们一直希望开源能够让世界变得更好,这是因为我们相信透明的机制的力量,相信透明的规则能够让信任的成本降到最低,让合作的效率变得更高。

目前大部分项目方怕被黑客攻击选择不开源,而实际的结果只能是掩耳盗铃。黑客往往能够根据 wasm 和 abi 文件还原出合约的信息,很多时候封闭的代码只会隐藏自己的错误反而给黑客可乘之机——而 EOSBet 就是最好的例子。

End

image
上一篇 下一篇

猜你喜欢

热点阅读