首页>项目 > >>正文

假EOS攻击再升级:EOSCast遭黑客“假EOS转账变种”攻击,损失超6万EOS

2018-11-01   09:02    PeckShield

10月31日凌晨,区块链媒体链金术接到开发者爆料称,类时时彩游戏平台EOSCast遭到黑客攻击,7万多EOS被黑客转走。

10月31日凌晨,区块链媒体链金术接到开发者爆料称,类时时彩游戏平台EOSCast遭到黑客攻击,7万多EOS被黑客转走。区块链安全公司PeckShield随即对相关账号链上数据展开深入分析发现,今晨00:15起,黑客“refundwallet”尝试对EOSCast游戏合约“eoscastdmgb1”实施攻击,黑客先以“假EOS”攻击方式进行转账攻击8次,未能得逞,后又采用“假EOS攻击变种”的方式成功攻击9次。

 

“假EOS转账变种”攻击原理:

 

 

“假EOS”攻击最早出现于EOSBet平台上。一般意义上的“假EOS”理解是,黑客创建了一种基于EOS的代币,并将其命名为“EOS”,开始大量给被攻击合约账号转账假EOS代币,由于合约没有检测EOS的发行方,误把“假EOS”转账视为真的,进而调用了合约中的transfer函数,按照开奖流程分配了奖金。这种“假EOS”攻击方式,关键点是合约函数没有检测发行代币的合约名。

黑客在盯上EOSCast游戏合约后,首先尝试用“假EOS”方式实施攻击。黑客efundwallet发行了大量假EOS代币,然后以每笔100个假EOS转账给游戏合约eoscastdmgb1进行攻击尝试,由于游戏合约对EOS系统合约(eosio.token)做了限定,黑客实施“假EOS“攻击未能得逞。

于是黑客改进了攻击策略,采用“假EOS转账变种”攻击方式再次尝试,其原理是强制调用游戏合约transfer,由于游戏合约eoscastdmgb1没有对transfer的调用来源进行检测,黑客将假转账通知写进了transfer函数中,如下图可以看出,transfer中的参数为"90558c86a7a997ba100e93296383305500e1f5050000000004454f530000000023656f7363617374646d6762312d6269672d6f64642d5b5d2d5b5d2d5b5d2d5b5d2d5b5d",通过EOS的RPC接口"v1/chain/abi_bin_to_json"解析可知为

{

"args": {

"from": "refundwallet",

"to": "eoscastdmgb1",

"quantity": "10000.0000 EOS",

"memo": "eoscastdmgb1-big-odd-[]-[]-[]-[]-[]"

}

}

 

Picture 1

 

(图示一:  攻击交易HASH页面详情  )

 

这样一来,黑客在没有进行“假EOS”转账的情况下,用伪造的transfer参数,把假EOS转账通知传递给了游戏合约,致使游戏合约误判断玩家进行了真实的EOS转账,从而依照开奖流程发放了奖金。值得一提的是,黑客为了转账隐蔽性也采用EOSBet假EOS转账攻击时用过的方法对transfer参数进行了编码处理,以此防止EOS浏览器的跟踪。

 

Picture 2

(图示二:黑客对transfer参数进行了加密操作)

在短短4分钟(4局游戏)内,进行了9次“假EOS转账变种”攻击。根据游戏规则,黑客每次攻击可得到198、9,800、19,600个不等的EOS,在实施最后一次攻击时,游戏方察觉到异常攻击,及时转走了奖金池仅剩的8,000个EOS。最终,黑客共计获利63,014.1个EOS

 

攻击后续:

 

 

在黑客refundwallet实施“假EOS转账变种”攻击得逞后。今天,中午时分,PeckShield态势感知监测平台发现,账号“xobkwdiifget”于11:03起在批量给多个EOS游戏合约发攻击测试,伺机找机会实施攻击,截止15:43分,该账号总共对168个游戏合约尝试进行攻击。

不过由于游戏合约的玩法中需要填入游戏自定义的memo信息格式,而xobkwdiifget 攻击的memo始终是空的,即使遇到存在该漏洞的游戏合约,也不会产生攻击效果。不过,可以看出,此类假EOS攻击事件愈加猖獗,对DApp生态产生了巨大威胁,PeckShield在此提醒广大游戏开发者警惕风险。

 

修复建议:

 

 

在apply过滤调用时,一方面是确认收到的EOS转账的合约是eosio.token,另一方面,要排除自己合约的transfer被调用的情况:

if((code == N(eosio.token) && action == N(transfer)) || ((code == self  && action != N(transfer))

 返回首页>>