(图片来源于网络)12月05日,新上线的又一款EOS竞猜类游戏Fastwin遭到黑客攻击,区块链安全公司PeckShield态势感知平台捕捉到了该攻击行为并率先进行了安全播报披露。数据显示,当天凌晨03:18—04:15之间,黑客(ha4tsojigyge)向Fastwin游戏合约(fastwindice3)发起124次攻击,共计获利1,929.17个EOS。PeckShield安全人员分析发现,该攻击行为是黑客利用Fastwin的合约在校验合约调用方时存在的漏洞,导致“内联反射(inlineReflex)”攻击成功。据PeckShield此前发布的《浅析DApp生态安全》的报告显示,截止11月底,已经发生了超27起EOSDApp安全事件,主要集中在假EOS攻击、随机数问题等攻击方式,且在不断升级演变。而这次看似较小的攻击事件背后却暴露出了一个较以往危害性可能更大的新型漏洞:EOSIO官方系统对调用合约自身函数存在不校验权限的问题。
声音 | Beosin(成都链安)预警:某EOS竞猜类游戏遭受攻击 损失超1200枚EOS:根据成都链安区块链安全态势感知系统Beosin-Eagle Eye检测发现,今日上午 8:53:15开始,黑客yunmen****对EOS竞猜类游戏th****sgames发起攻击。截止到现在,该黑客已经获利超过1200枚EOS。Beosin建议游戏项目方应该加强项目运维工作,在收到安全公司的安全提醒之后第一时间排查项目安全性,才能及时止损,同时也呼吁项目开发者应该重视游戏逻辑严谨性及代码安全性。Beosin提醒类似项目方全方面做好合约安全审计并加强风控策略,必要时可联系第三方专业审计团队,在上链前进行完善的代码安全审计,防患于未然。[2019/4/3]
(图一:PeckShield与Block.one邮件沟通)PeckShield认为这是一个非常严重的漏洞,并第一时间通知了Block.one团队。Block.one官方团队接受了该漏洞提议,并告知我们有其他研究团队也事先独立汇报了该漏洞,最终于周四(12月13日)更新了紧急补丁以补救防御,同时次日新发布1.5.1和1.4.5两个版本,完成了该漏洞修复,避免了更多攻击事件的发生及可能造成的资产损失。“内联反射(inlineReflex)”攻击原理正常的转账流程如图所示:玩家通过调用系统合约(eosio.token),将EOS转账给游戏合约,触发游戏合约的分发逻辑(apply),进而调用相关函数实现开奖。
声音 | PeckShield: 12月份多起竞猜类游戏攻击者系同一黑客:突发的各类EOS竞猜类黑客攻击事件,不仅给开发者带来庞大的数字资产损失,还严重影响DApp生态的平衡,如何追缴受损资金成为摆在安全公司、ECAF社区、交易所等面前的难题。最近,PeckShield安全盾风控平台DAppShield通过持续黑名单库扫描和链上数据追踪发现,去年12月份以来先后攻击过EOS竞猜游戏LuckBet、EOS Buff、ggeos等多个EOS竞猜游戏的4个黑客帐号之间存在关联,确定系同一黑客。数月以来,该黑客通过攻击各类EOS竞猜类游戏已经持续获利上万个EOS。PeckShield安全盾正全面布控追踪近段时间遭黑客攻击损失的资金流向,且正积极寻求各大相关交易所协助,希望尽可能帮助游戏开发者追缴受损资金。[2019/1/11]
而此次的攻击者(ha4tsojigyge),在自己帐号部署的合约中包含了与游戏合约相同的操作函数,在转账完成后,自行开奖获得奖金。如图所示:
分析 | EOS CPU资源吃紧 竞猜类TOP10游戏消耗全网CPU资源84.15%:随着DApp应用的爆发式增长,EOS主网一直存在CPU资源使用紧张的状况,使得CPU抵押价格存在较大幅度的波动。据 DAppTotal 数据显示,12月12日(昨天)EOS上的CPU资源消耗排行前十的DApp分别为:BetDice、EOS Max、Fastwin、MyEosVegas、ToBet、Fishjoy、EOSJacks、Endless Dice、BIG GAME、BLACKJACK - EOS Poker。其中排名第1位的BetDice CPU消耗量达到了2,345,147.01ms,占全网CPU总消耗的32.32%,Top 10 DApps消耗的CPU占据了全网CPU资源的84.15%,且全部都是竞猜类DApp游戏。受此影响,昨天的CPU抵押价格最高达到了3个EOS每毫秒,意味着玩家玩一次游戏约需要抵押4个EOS(以BetDice为例)。
不难看出,现有CPU资源的上限,可能会成为制约更大规模DApps应用普及的一大因素,DApp开发者需要注意优化CPU资源使用。此前因DApp导致的CPU资源紧张问题,EOS主网已经进行了3次上限调整,最新CPU资源为初始值10%的2.5倍。[2018/12/13]
从图中可以看出,攻击者在自身合约的函数(pushck)中,内联调用了与游戏合约开奖同名的函数(check),再通过通知(require_recipient)的方式将信息发送到了游戏合约。此时游戏合约的分发逻辑(apply)没有过滤掉此信息,并调用了开奖函数(check)。总之,攻击者利用了EOSIO系统中对调用合约自身函数不校验权限的漏洞,进而使用游戏合约(fastwindice3)的帐号权限发起内联调用,致使绕过游戏合约在敏感函数中校验调用者权限的方法(require_auth),从而获取了游戏合约发放的奖励。修复方法从上述分析能够发现,攻击者合约的通知信息中,实际调用的合约是攻击者合约(ha4tsojigyge),而非游戏合约(fastwindice3),因此在游戏合约的分发逻辑(apply)中过滤掉此类信息即可。而且从系统定义的宏(EOSIO_ABI或者EOSIO_DISPATCH,如图四)中能够看到,分发逻辑处理了此问题。因此PeckShield在此提醒开发者在定制化自己的分发逻辑时,需要特别注意其中的调用来源。
深层次及兼容性问题需要强调的是:这个问题属于EOS公链层的较大漏洞,攻击者在内联调用中可以伪造任意帐号的权限执行,但这个修复可能会给部分开发者造成兼容性问题,如合约内联调用函数,而执行者帐号(actor)不是自己的时候,会导致整个交易(transaction)执行失败,如需解决兼容性问题请给合约赋予执行者帐号的eosio.code权限。
郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。