EOS Eosbet 再遭攻击,亟待官方的权威开发指南

itleaks · 2018年10月16日 · 366 次阅读
本帖已被设为精华帖!

Eosbet上次遭受所谓的“假EOS”攻击被盗(被薅走5w EOS),这次又爆出假EOS转账通知(被卷走14w EOS),真是让大家对Eosbet的专业技术能力产生质疑。当然具体真相如何,只有官方最清楚。下面就来简单描述下这两个BUG

“假EOS”攻击

“假EOS“攻击是攻击者在自己的智能合约里创建一个假EOS代币,并给Eosbet账号转账假的eos代币,并主动通知Eosbet智能合约,这样系统就会调用Eosbet合约的transfer函数,Eosbet合约没有检测通知来源,误当做真的EOS转账,于是仍按照真的开奖流程开奖,由于价EOS不值钱,而Eosbet合约开的奖是真EOS,所以攻击者假钱换真钱,无成本薅羊毛。 这个bug通过检测code来源即可修复。

“假EOS通知”攻击

“假EOS通知”攻击是指攻击者通过eosio.token给自己的智能合约账号(eosbethack)转真EOS, eosio.token合约会通过require_receipt代码调用攻击者的智能合约eosbethack,由于攻击者在eosbethack通过require_receipt主动调用eosbet, 导致eosbet的transfer函数被调用,但合约的code还是eosio.token,从而合法的通过了上述"eosio.token"检测逻辑。具体原理如下:

第一步(伪造转账通知):

第二步(eosbet没有检测to)

EOS权威开发指南缺失

上次的“假EOS” bug可以理解为真正的bug ,而这次的假EOS转账通知,我觉得EOS开发团队也要负一点点小的责任。理论上eosbethack通过require_receipt进入eosbet合约时, 上下文环境应该切换为eosbethack, 而不应该仍然是eosio.token。也就是code的值应该为eosbethack而不应该是eosio.token。这有点像函数A调用B,B又调用C, 结果C检测到是A调用C(A->C), 所以说目前EOS的这种上下文规则有点违背编程思维习惯,估计除非有官方文档(事实上缺失详细文档)或者查看源码,否则一般的开发人员很容易掉坑。require_receipt这里已经出现了3个bug, 恶意消耗RAM,假EOS攻击,假EOS通知攻击。10月1日,慢雾同学出版了安全开发手册,但是该bug也没有涉及到。当然如果通过专业审计审核的代码还是会考虑各种corner case的,也会避免这个bug,比如pixelmaster的游戏代码就加了这个检测。

但是这种反常理未明确提示的使用方法及规则,一般开发人员很容易入坑,所以Dapp开发,开发人员要多一份敬畏,毕竟Dapp离钱这么近,小小错误损失的可不是体验,用户而是大量金钱。

攻击回放实践

大家可以参考如下源码实践

https://github.com/itleaks/eos-contract/tree/master/eosbethack-exp

执行过程如下:

作者个人技术能力有限,如有错误请指点
尝试长按二维码关注公众号吧(^_^)

公众号:区块链斜杠青年 欢迎大家加我微信:itleaks

共收到 0 条回复
vianull 将本帖设为了精华贴 10月16日 16:14
dposclub001 一张图演绎 EOS DApp 各种攻击方法 中提及了此贴 12月05日 16:23
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册