竞猜类游戏Fastwin遭黑客攻击背后:Block.one官方悄然做了重大更新

12月05日,新上线的又一款EOS竞猜类游戏 Fastwin 遭到黑客攻击,区块链安全公司 PeckShield 态势感知平台捕捉到了该攻击行为并率先进行了安全播报披露。数据显示,当天凌晨03:18—04:15之间,黑客(ha4tsojigyge)向Fastwin游戏合约(fastwindice3)发起124次攻击,共计获利1,929.17个 EOS。PeckShield 安全人员分析发现,该攻击行为是黑客利用 Fastwin 的合约在校验合约调用方时存在的漏洞,导致“内联反射(inlineReflex)”攻击成功。

据 PeckShield 此前发布的《浅析DApp生态安全》的报告显示,截止11月底,已经发生了超27起 EOS DApp 安全事件,主要集中在假 EOS 攻击、随机数问题等攻击方式,且在不断升级演变。而这次看似较小的攻击事件背后却暴露出了一个较以往危害性可能更大的新型漏洞:EOSIO 官方系统对调用合约自身函数存在不校验权限的问题。

                                                                            (图一:PeckShield 与 Block.one 邮件沟通)

PeckShield 认为这是一个非常严重的漏洞,并第一时间通知了 Block.one 团队(CVE-2018-20163)。Block.one 官方团队接受了该漏洞提议,并告知我们有其他研究团队也事先独立汇报了该漏洞,最终于周四(12月13日)更新了紧急补丁以补救防御,同时次日新发布1.5.1和1.4.5两个版本,完成了该漏洞修复,避免了更多攻击事件的发生及可能造成的资产损失。

“内联反射(inlineReflex)”攻击原理

正常的转账流程如图所示:玩家通过调用系统合约(eosio.token),将 EOS 转账给游戏合约,触发游戏合约的分发逻辑(apply),进而调用相关函数实现开奖。 

而此次的攻击者(ha4tsojigyge),在自己帐号部署的合约中包含了与游戏合约相同的操作函数,在转账完成后,自行开奖获得奖金。如图所示: 

从图中可以看出,攻击者在自身合约的函数(pushck)中,内联调用了与游戏合约开奖同名的函数(check),再通过通知(require_recipient)的方式将信息发送到了游戏合约。此时游戏合约的分发逻辑(apply)没有过滤掉此信息,并调用了开奖函数(check)。

总之,攻击者利用了 EOSIO 系统中对调用合约自身函数不校验权限的漏洞,进而使用游戏合约(fastwindice3)的帐号权限发起内联调用,致使绕过游戏合约在敏感函数中校验调用者权限的方法(require_auth),从而获取了游戏合约发放的奖励。

修复方法

从上述分析能够发现,攻击者合约的通知信息中,实际调用的合约是攻击者合约(ha4tsojigyge),而非游戏合约(fastwindice3),因此在游戏合约的分发逻辑(apply)中过滤掉此类信息即可。而且从系统定义的宏(EOSIO_ABI或者EOSIO_DISPATCH,如图四)中能够看到,分发逻辑处理了此问题。因此 PeckShield 在此提醒开发者在定制化自己的分发逻辑时,需要特别注意其中的调用来源。 

                                                                           (图四:系统EOSIO_DISPATCH代码)

深层次及兼容性问题

需要强调的是:这个问题属于 EOS 公链层的较大漏洞,攻击者在内联调用中可以伪造任意帐号的权限执行,但这个修复可能会给部分开发者造成兼容性问题,如合约内联调用函数,而执行者帐号(actor)不是自己的时候,会导致整个交易(transaction)执行失败,如需解决兼容性问题请给合约赋予执行者帐号的 eosio.code 权限。

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 来表示数据库表,使用的实例表示表中的行。 开发者可以定义之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值