安全是区块链领域举足轻重的话题。本期咱们聊聊 EOS 伪随机数漏洞引起的安全隐患。


「区块链大本营」携手「成都链安科技」团队重磅推出「合约安全漏洞解析连载」,以讲故事的方式,带你回顾区块链安全走过的历程;分析漏洞背后的玄机。让开发者在趣味中学习,写出更加牢固的合约,且防患于未然。


当然,这些文章并不是专为开发者而作的,即使你不是开发者,当你读完本连载,相信再有安全问题爆出时,你会有全新的理解。

道高一尺,魔高一丈,愈进愈阻,永无止息。——清·谭嗣同《仁学》四三

上回书说到

官方标准用心良苦

编写合规不容小觑

我们用十五期内容结束了对以太坊智能合约常规漏洞、高危漏洞的分析和总结。纵观整个以太坊安全生态发展历史,有太多的教训和痛楚值得我们铭记。

有相关统计,区块链产业导致财产损失的安全事件中有30%是由智能合约漏洞引起的。所以按照以太坊开发语言的使用规范,正确书写每一行合约代码,是保障合约安全的基本要求。倡导上链前的合约审计,确保项目安全启航,是我们对开发者和项目方真诚的建议。

本期话题

EOS游戏屡遭毒手,随机数漏洞屡禁不绝

除了以太坊,EOS也是目前比较流行的区块链平台。

EOS同样是基于智能合约和区块链搭建而成,而在游戏和DApp领域,由于没有交易费和处理能力强等特性,EOS在技术和设计理念上占有先天的优势。但是,无独有偶,EOS智能合约的安全问题也层出不穷。

本期我们借用最近发生的EOS游戏被攻击事件展开对EOS智能合约漏洞的分析。

攻击事件历史

EOSDice 第一次被攻击


2018年11月4日 上午3:15开始 EOSDice合约被账户jk2uslllkjfd攻击,攻击者盗取了2500左右EOS并充值入火币。

EOSDice第二次被攻击

11月10日上午11:19开始,coinbasewa11账户再次攻击了EOSDice游戏,盗取4900 EOS转入bitfinex交易所,这个账户对游戏合约进行了95次攻击,攻击过程可以检索到。

随机数生成问题

我们在第六期游戏合约漏洞提到过,截止至目前,以太坊和EOS官方均未提供随机数接口,这对游戏开发确实是一个不利的影响,比如抽奖模块的开发。为了实现类似的功能,游戏开发者需要自己编写随机数生成函数,这些函数往往利用区块信息作为参数,然后进行一系列运算,获得一个“随机数”。

但是,由于使用区块信息作为参数,这将导致在同一个区块上,使用相同算法的随机数函数将会得到相同的值攻击者可以利用这点,部署中间合约,然后不停的尝试生成随机数,当生成满意的随机数时,再利用中间合约参与游戏,影响游戏的公平性。我们把这类随机数问题统称为“伪随机数漏洞”。

EOSDice伪随机数漏洞分析

由于EOSDice在第一次被攻击后提高了警惕,并且修改了随机数生成的算法,所以我们分两次进行分析。

第一次攻击分析

由于EOSDice合约开源,我们主要看一下该合约的random函数,该合约抄袭了另一个EOS合约的random函数实现。

该随机函数中使用的随机因子主要为:

  • tapos_block_prefix()  该交易refer区块信息

  • tapos_block_num() 该交易refer区块信息

  • name (user账户名)

  • game_id (自增)

  • current_time()(当前时间)

  • pool_ol_eos.amount (合约当前的余额)

其随机性主要依赖于refer区块 (refer block) 信息及当前时间、合约余额信息。

在该游戏中,开奖时间是可以根据delay时间推算得到,余额信息在只有一个用户访问时也可以根据计算得到。

那么唯一不确定的因子只剩下refer block的信息了。

在实际游戏执行逻辑中开奖的reveal action是由下注的action衍生出来的deferred action,该action的refer block信息并不是由用户指定的,而是由eos链来指定的,代码详见:

https://github.com/EOSIO/eos/blob/master/libraries/chain/apply_context.cpp#L251

经过实际测试,deferred action的refer block信息为执行当前action的前一个区块信息,示意如下图:

所以,其实开奖时的使用的tapos_block_prefix()其实在下注前就已经产生,那么再结合对时间和余额的预测,就可以提前预测开奖结果;根据交易情况分析,eosdice第一次被攻击很可能就是使用的此种攻击方式。

第二次攻击分析

这里要先介绍一个EOS的小知识:

当EOS转账时,EOSIO.Token会同时通知到from和to账户,但会先执行对from账户的通知,如下图所示:

EOS在第一次攻击事件发生后,修改了随机数生成算法,我们来看一下修改后的随机数是否真的随机。随机数计算公式如图所示:

利用上面提到的转账通知知识,游戏合约收到向自己的转账通知时开始执行下注逻辑,触发deferred action:reveal1,reveal1触发deferred action:reveal进行开奖发奖;那么在开奖(reveal)时取的refer block信息是下注转账action所在的区块信息,不可以预测。

但是在EOSDice对随机函数random进行了修改后,这个函数还使用到了账户余额这个随机因子。攻击者可以在转账后自己也接收EOS转账通知,并且自己模拟出跟EOSDice相同的defered action:defered2,然后defered2触发defered action:defered。

经此一番操作,此时攻击者的defered 和游戏合约的reveal是处在同一个区块(block)中运行。那么就可以在defered中通过修改随机因子中的余额amount计算random(amount+x)的值,使其满足自己的下注条件。需要注意的是,计算这个值需要进行碰撞试验才能猜准。

攻击者随后向随机因子账户中转入amount为x的eos;那么当运行到reveal开奖的时候,就可以使自己必定中奖。整个攻击流程可以总结为下面这个图:

加上之前经过对攻击交易分析,可以确定此次攻击者利用的攻击方式是控制随机因子中的余额

漏洞修复

使用与tapos_block_num类似的参数都可能会引发伪随机数漏洞,包括EOS余额和head_block_id,这些参数的特点就是具有一定可控性。

如果非要使用tapos_block_preifx作为随机数因子,可以在开奖reveal执行之前多执行一次defered action跳转,保证开奖时获取到的block信息在下注之后生成,这样tapos_block_prefix才是不可预测的。

伪随机,真漏洞

EOS与以太坊采用了不同的技术和设计理念,比如:

  • 以太坊被设计为对于所有可能建立在其基础上的应用中立的平台,而EOS则提供了一些功能例如加密的实现和区块链工具的应用,对应用开发者比较友好。

  • 两者的共识机制不同,相较于以太坊采用的PoW,EOS的DPoS机制类似于董事会机制。

  • 以太坊受到CPU单线程性能限制,其网络交易速度大约只有10次/秒,而且每次交易还需要提供手续费。EOS的并行技术解决了交易速度的问题,并且移除了手续费。

EOS的特性,尤其是第三点特性决定了在其基础上的游戏能够满足延迟低,交互流畅的需求,同时能够处理商业级的应用需求。这也是EOS在游戏方面应用较多的原因。但是与以太坊一样,EOS官方并没有提供相应的随机数生成功能。以太坊官方已经推荐用户使用链外的Oraclize库生成随机数。

EOS的随机数问题依然是一个令开发者头疼的问题,11月还未结束,EOS DApp已经出现了三次针对随机数的漏洞攻击事件,说明在随机数问题的解决上,亟需一个可靠的解决方案。

希望广大DApp开发者在目前没有可靠方案的时候,依靠现有的经验和安全审计,做到将合约内的“伪”随机修复为“真”随机,让EOS DApp有趣、公平、可靠。

参考文章

[1] EOS与以太坊有哪些区别

https://blog.csdn.net/qq_42204339/article/details/80463686

[2] 玩EOS上掷骰子的游戏

https://www.jianshu.com/p/b72c71cd3614

[3] 游戏skr而止,漏洞周而复始 —— 游戏合约漏洞全面汇总

https://mp.weixin.qq.com/s/0h68eI7fawy1Gi0TZYzH3A


?


公众号又双叒改版了,为了不错过第一手行业动态与技术风向,建议你按照图片的提示,将【区块链大本营】设为星标(安卓用户设为置顶),标星看大图更舒服哟!


推荐阅读

  • 水军!软文!割韭菜!ICO成为过街老鼠的十大败笔

  • 13岁创业,3块钱卖掉大把比特币,比特币基金会创始主席有着怎样的开挂人生?|人物志

  • 精通Java/Python就能月薪40k? 北上广深渝蓉10大热门公司等你来!

  • 游戏是程序员的深坑?

  • 【面试现场】如何编程获得最多的年终红包奖?

  • 寒冬来临?AI公司面临大考

  • 你最关心的马蜂窝事件舆论全景图在这里,用文本挖掘一挖到底

识别二维码入群,备注姓名+公司+职位

内容转载请加 171075719,备注“转载”

商务合作请加 fengyan-1101

深扒EOSDice被攻击事件始末, TA是如何把游戏体验搞臭的?相关推荐

  1. jsonp无X-Requested-With 及其深扒

    事件背景交代 事情的起因是:A和B站都得调A站的接口,然后前端把请求写成jsonp的,又因为js是在CDN上,A和B是公用相同的js.然后就出现了A站调接口出现前端无法解析的问题,B站调A站接口却正常 ...

  2. B 站崩了,受害程序员聊聊(非吃瓜B 站事件始末分析 + 防治技术分享)

    非吃瓜,B 站事件始末分析 + 防治技术分享 昨天小破站崩了的事情相信很多朋友都听说了. 这要是搁以前,不爱吃瓜的我根本不会去关注这种事,崩了就崩了呗,反正天塌下来有程序员大佬们扛着,很快就会好的. ...

  3. 是啥意思_227大团结是什么梗啥意思 微博227大团结事件始末介绍

    相信大家这两天在微博上经常能够看到一个关于"227大团结"的话题吧,但是很多人都不知道227大团结是什么梗啥意思,下面就和小编一起来看看. 微博227大团结事件始末介绍 其实这个关 ...

  4. 以太坊再爆高危漏洞!黑客增发ATN 1100万枚token事件始末

    以太坊再爆高危漏洞!黑客增发ATN 1100万枚token事件始末 编者按:5月11日,ATN Token遭受恶意攻击,攻击者利用DSAuth库与ERC223搭配使用具有的混合漏洞,窃取了ATN的所有 ...

  5. (转)当AI变成宣传武器:继续深扒大数据公司Cambrige Analytica

    当AI变成宣传武器:继续深扒大数据公司Cambrige Analytica 原创 2017-02-27 造就 造就 导语:2016年美国大选已然结束,但武器化的AI宣传机器只是刚刚兴起,它代表的是一个 ...

  6. 大赛导师教程:冷风——商战王参考图片法,深扒光感氛围展现

    本周要发布的教程是来自明星导师冷风的整理分享,冷风老师也是渲云杯全国空间表现大赛的熟面孔了,从第一届一直到现在,每年都担纲重磅导师阵容的一员.此前渲云团队也对冷风老师的企业团队做过深度人物专访:[北玄 ...

  7. 近一亿美元失窃,Horizon跨链桥被攻击事件分析

    " Tokenviewlabs Horizon跨链桥被盗1亿美元 6月24日,Harmony团队发布推特称,Horizon跨链桥遭到攻击,损失金额约1亿美元.6月26日,Harmony创始人 ...

  8. 荣耀猎人游戏本亮点有哪些?看我来深扒一下

    今年应该是游戏玩家最快乐的一年了,产品不断推新,可选择的产品也越来越多,而且性能个个的在线,优中选优的对比一番来说,荣耀猎人游戏本V700脱颖而出.今天来深扒一下它的亮点,看看是不是你们的菜. 1. ...

  9. steam上传头像出现服务器错误_steam功能深扒:个人主页装扮好,开黑好友不会少...

    不知不觉已经拖更将近一星期了. 今天省钱君就继续之前的话题,跟大家再深扒一下steam社交功能里面的个人主页功能,简单教大家装扮自己的steam个人主页(关于花里胡哨的gif展柜功能,省钱君自己也目前 ...

最新文章

  1. 你敢参与,我就敢送!牛转好运来,新春大抽奖
  2. python杨辉三角_干货|杨辉三角与二项式定理
  3. 数据中心机房空调系统的这些“套路”你知多少?
  4. 第4课第4节_Android灯光系统_源码分析_电池灯
  5. 基于Jenkins的持续交付全流程设计与实践
  6. 做「容量预估」可没有true和false
  7. 关于hkcmd.exe造成的和Eclipse之间热键冲突
  8. Android10虚拟硬件,编辑 Android 虚拟设备属性
  9. SharePoint中添加或者修改Item时调用EventReceiver(Event Handler)处理额外的逻辑
  10. 【Spark】Spark 3.0 支持 event logs 滚动
  11. php用高德地图api坐标返回市_php百度坐标转高德坐标(示例代码)
  12. PID调控公式和相关方法
  13. 组态王c语言延时1秒,(组态王软件详细教程第三讲让画面动起来.doc
  14. kindle的mobi格式的文件,怎么转换成txt文件供一版阅读器来使用?
  15. 2021-2027全球及中国个人防护纺织品行业研究及十四五规划分析报告
  16. 【博客排版】中文文案排版指北(转载)
  17. 解密Kerberos流量
  18. 面向过程与面向对象有什么区别
  19. 佳能打印机HP打印机爱普生打印机提示卡纸了确找不到卡纸
  20. ls一1测距仪说明书_生产力小工具 篇一:激光测距靠谱吗?杜克LS-1激光测距仪开箱测评...

热门文章

  1. Windows phone 应用开发[1]-Text To Speech
  2. Android 获取应用(APP)UID
  3. mysql点哪个是确定指令_mysql命令大全
  4. 运算放大器区分输入是串联还是并联,电压反馈还是电流反馈
  5. 完全二叉树的层序遍历(马老师的比赛心得)
  6. hive解析json数组
  7. 基于51单片机甲醛气体浓度检测超限报警系统Proteus仿真
  8. 永磁直驱风机MPPT最大功率点跟踪Simulink仿真模型,采用占空比扰动观察法,调整PWM的占空比来调节发电机达到最佳工作点
  9. 深度学习激活函数中的线性整流函数ReLU及其变种
  10. 教你一百二十八个说话的技巧(气质很内涵)(有霸气不霸道)