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
执行过程如下:
作者个人技术能力有限,如有错误请指点
尝试长按二维码关注公众号吧(^_^)
|**************************************************
* 本文来自CSDN博主"爱踢门",喜欢请点关注
* 转载请标明出处:http://blog.csdn.net/itleaks
***************************************************|
如果你对EOS,ETH技术及开发感兴趣,请入QQ群讨论: 829789117
如需实时查看最新文章,请关注公众号"区块链斜杠青年",一起探索区块链未来