引子:故纸堆里寻惑源,多少旧事屡重演 —— 无名
上回说到地址恢复功亏一篑,身份判断轻虑浅谋。逻辑补全自圆其说,
原理辨析帷幄运筹。
本回
区块链游戏江山如画,
安全防护未规划,
一片残阳西挂。
区块链行业日新月异,发展迅猛,各个公链及项目方奇思妙想层出不穷。俗话说,玩是人的天性,将数字货币与游戏结合,运用游戏的机制吸引投资者参与到互动中来的想法以标新立异、推陈出新的姿态引领了最近的潮流。各种区块链游戏聚集大量的虚拟货币,价值动辄上千万,承诺下的丰厚回抱吸引了越来越多的目光,投资者们跃跃欲试,人人都想充当“头号玩家”。
但是,缺少一套完整的、经过验证的SDK库是当下区块链游戏的一个痛点。各游戏方大都自食其力,独立开发游戏智能合约。比代币合约更加复杂的开发过程使得安全隐患不可避免的出现,这些漏洞一旦被攻击者或者项目方本身利用,受害的总会是玩家,可谓是,兴,百姓苦,亡,百姓苦。 成都链安科技对目前已经爆发的区块链游戏合约事件进行了归纳整理,分析目前游戏存在以下两个方面的问题:
一、代码层面的安全问题
目前代码层面的安全问题在游戏中的表现几乎与之前的代币合约如出一辙,但是包裹了鲜亮外衣之后,内部的代码结构严谨度依然差强人意,加上游戏机制的部分功能,有些合约代码甚至更加混乱。好比建造一栋楼房,基本结构没有搭建好,上梁不正下梁歪,增加更多的楼层与附属结构反而使得楼房的轰然倒塌更加迅速。
漏洞归类与修复建议 1、以溢出为代表的代码安全漏洞
数学运算溢出在智能合约中是个比较大的安全隐患。无论是以太坊还是EOS,一个整型变量只能有一定范围的数字表示。例如,一个 uint8 ,只能存储在范围[0,255] 的数字。试图存储 256 到一个 uint8 将变成0。不加注意的话,只要没有检查用户输入又执行计算,导致数字超出存储它们的数据类型允许的范围,就会产生溢出,并可以被用来组织攻击。 此部分的具体原理在我们之前第一期,溢出漏洞全面分析中已经重点介绍过,没看过的请戳下面的链接:一夜回到解放前?溢出漏洞类型全面分析 | 链安团队漏洞分析连载第一期 —— 溢出漏洞
从游戏网站上,可以很明显的看到,该合约执行发生了溢出,导致奖金池总额变为一个极大的负值,并且由于项目方应对措施不当,导致奖池奖金被盗取,普通玩家血本无归[1]。 修复建议 该游戏有三个问题需要大家引起注意:
- 代码开源问题,狼人游戏项目方并未公布合约源代码,玩家在参与游戏之前无法对 项目安全性进行评估,自己的资产无法得到保障;
- 狼人游戏项目方要求用户提供的过大的权限,导致其有能力在用户未提供私钥的情况下,在后台修改权限,并转出用户的EOS;
- 对安全事件的应急响应,狼人游戏项目方未冻结攻击者账户,导致攻击者在升级后的版本中提出了6万多EOS。
在此处,成都链安科技建议广大游戏项目方应在游戏合约的设计中引入安全控制机制,包括恶意账户冻结、暂停交易等,为游戏安全建立最后一道防线。
2、以owner权限盗取为代表的函数调用权限问题
此类漏洞的形成原因为构造函数失配或者修改owner的函数未添加调用者检查。智能合约的构造函数一般担负着合约初始化以及owner地址绑定的功能,如果构造函数声明方式不正确,那么,其会变成一个普通函数,任何人都可以调用他,并将自己设置为合约管理者。修改owner的函数用于将新地址设置为owner,此类函数需要检查调用者地址,如果确少该检查,那么任何人都能够将自己变为合约的管理者。这与我们在开始连载之前的owner权限漏洞分析中的构造函数问题如出一辙,需要了解请由以下链接传送:注意!3份合约又存在Owner权限被盗问题——低级错误不容忽视
游戏的构造函数(DrugDealer)和合约名(EtherCartel)不一致,存在构造函数失配漏洞,导致DrugDealer变成一个普通的函数,任何人都能够调用该函数变成合约的ceoAddress,并且,根据后面的代码逻辑,他可以收取原本应该打入合约部署者的ETH[2]。
修复建议 为了避免此类漏洞,开发者在开发游戏合约时需要足够谨慎,并进行详尽的测试。构造函数仅在合约部署时执行一次,当出现合约部署后owner仍为0地址,并且用户可以调用实现构造函数功能的函数,那么,合约就存在构造函数失配的漏洞,开发者需要检查并修复构造函数实现。
3、“随机数生成”等区块链平台短板 截止至目前,以太坊和EOS官方均未提供随机数接口,这对游戏开发确实是一个不利的影响,比如抽奖模块的开发。为了实现类似的功能,游戏开发者往往需要自己编写随机数生成函数,这些函数往往利用区块信息作为参数,然后进行一系列运算,获得一个“随机数”。但是,由于使用区块信息作为参数,这将导致在同一个区块上,使用相同算法的随机数函数将会得到相同的值,攻击者可以利用这点,部署中间合约,然后不停的尝试生成随机数,当生成满意的随机数时,再利用中间合约参与游戏,获得较大优势。此外,区块链作为一个全球分布式的计算机,其资源目前是比较有限的,链的开发者为了保障链平台的稳定性,对链上的智能合约的运做出了限制,防止死循环等消耗资源的操作,比如,运行gas限制(以太坊)、CPU/内存资源限制(EOS),这使得链上游戏开发者需要比传统的中心化服务器游戏付出更大的努力,对游戏的逻辑进行优化,确保逻辑正确的合约不会因为资源限制问题而无法运行。
随机数问题我们在之前的快讯 智能合约随机数算法漏洞影响游戏公平性 已经提及过,这次我们根据案例进行一下具体分析:代表游戏:FoMo3D long平台:以太坊
从4月7日到4月8日早上10点,游戏项目方在Discord各频道开始了疯狂的宣传,利用精美的外形设计和丰厚的奖励承诺牢牢吸引了大批的粉丝翘首以盼。8日早上10点开服后10分钟内,合约内资产已超过200ETH,但是随着时间的推移,玩家们开始发现讨论群消失了,游戏内的出售以及提取操作也无法完成。最后,奖金池中227个以太在众目睽睽之下被合约创建者转走[4]。
- 账号安全:玩家的登录信息加密过后被储存在钱包内,安全性相较于传统登录模式有较大提升。
- 服务器:服务器安置在区块链上,即使游戏运营方停止其官方服务器,玩家也能继续享受游戏。
- 公平性:由于游戏内信息公开透明,并且可追溯,滥发,更改道具的行为将更容易被识别,进而大幅下降。
[4]: 这伙骗子仅用十分钟就骗走了227个ETH
[5]: 区块链游戏是什么?跟传统游戏有什么区别?
本文链接:https://www.8btc.com/article/259149
转载请注明文章出处