eos源码解析(番外2):交易阻塞攻击之延时交易随机数漏洞详解

首先,我们来简要介绍一下dice合约。一轮游戏的过程大致如下:

1,用户调用transfer给dice转账,附带信息为自己的猜测数。

2,dice合约会创建一个start延时交易,交易的延时时间为1s。

3,执行start延时交易,在此交易中再创建一个bet延时交易,交易的延时时间为0s。

4,执行bet交易,在此交易中计算随机值。

在以上步骤中,合约自动发起了两次延时交易,随机数在第4步中产生。那么是依照什么产生随机数呢?

依照4个参数:

1,bet交易的id。

2,执行bet交易的时间。

3,bet交易的引用区块号。

4,bet交易的引用区块hash前缀。

也就是说,有了以上4个参数,我们便可知道合约产生的随机数是多少,便可知合约的开奖号码是多少。

所以说,这轮攻击的重点是:

1,提前预知系统的随机值。

2,在bet交易运行前发起阻塞攻击。

在这里,我们把dice合约的执行步骤加入时间轴来表示,假设在第100个区块中发起游戏。

dice漏洞.png

仔细观察上图,在第100个区块中发起交易。而随机数的产生在104个块。但是本质上,产生随机素的参数在102块出来时便已经知晓了。在104个块的时候我们来看看产生随机数的4个参数:

1,bet交易的id。bet交易的id取决于transaction_header:

   time_point_sec  expiration;  uint16_t        
   ref_block_num;  uint32_t       
   ref_block_prefix;  unsigned_int   
   net_usage_words;
   uint8_t          max_cpu_usage_ms;
   unsigned_int    delay_sec;

    其中, ref_block_num为102,ref_block_prefix为102的区块hash前缀。其余参数是可以计算得到。

2,执行bet交易的时间,这是可以预估的,应为每个块的时间都是固定的。

3,bet交易的引用区块号:102。

4,bet交易的引用区块hash前缀。即第102个块的hash前缀。

从以上分析可知,只要知道102个块的hash前缀,便可以知道最终的开奖结果。

我们在发起交易的第100个区块时,是无法预知第102个区块的hash前缀的,所以游戏的随机数是不可预知的。

但是,我们可以在104个块出来之前,快速获得102的hash前缀,自己求得随机值,如果随机值不是期望,则在104块时发起阻塞攻击。这样,bet的执行将会延后,从而影响产生随机数的参数2即执行bet的交易时间,进而控制整个开奖结果。

Eos.win在1月14号的时候更新了合约,去掉了bet交易执行时间即即参数2的影响。

[图片上传失败...(image-46b887-1548309101350)]

这样,看上去,随机数唯一受第102块的的hash前缀影响。但不要忘了,start交易本身是一个延时交易,我们可以对它进行影响,从而影响bet的引用区块hash前缀,这就是对start进行阻塞。

由于延时交易在区块内部是先于正常交易执行的,所以必须在start之前得到hash并更具随机结果进行阻塞。这个时候在第103区块发起交易是不能阻塞start的。

阻塞手法是:

在第100个区块构建一个1s的多个延时交易,使这些延时交易在103个区块时先于start执行。在这些延时交易的内部计算随机结果,如果随机结果不如期望,则进行死循环,从而阻塞start。

dice漏洞2.png

所以,建议在编写合约的时候充分考虑阻塞的问题。对此,笔者提出两种可行方案:

1,合约自行保存记录或者第三方导入一段时间的区块hash前缀。

2,固定随机值生成的区块高度,若随机值不在此规定区块高度生成,则按照游戏出错处理。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,133评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,682评论 3 390
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,784评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,508评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,603评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,607评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,604评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,359评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,805评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,121评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,280评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,959评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,588评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,206评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,442评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,193评论 2 367
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,144评论 2 352

推荐阅读更多精彩内容

  • 合约即合同,自动售货机更是大家熟悉的东西,通过自动售货机你可以非常方便的买到水或饮料。它在我们生活中无处不在,你去...
    ROW供享社阅读 2,081评论 0 4
  • 1区块 所有的交易都被分组为“区块”。区块链包含一系列链接在一 起的这样的块。 在以太坊,一个区块包括: 区块头 ...
    布尼区块链阅读 2,271评论 0 2
  • 书中金句 1. 当我们意念太过集中时就会形成一股强大的能量,以至于我们所期望不要发生的场景,在自己生活中得以实现。...
    若溪_阅读 162评论 0 0
  • 相信听过比特币的人都知道,比特币是通过挖矿获得,而非币圈人可能很少知道,具体怎么挖,这就涉及到两个概念,矿...
    随波逐流007阅读 1,693评论 0 0
  • 谁家儿郎此生幸,独承君王殿下情惊鸿一跃风前舞,犹似飞燕掌上轻回眸一笑万人朝,只献荔枝再无梅可怜门前无君恩,荒草已没...
    笑笑小郎君阅读 791评论 10 10