【安全】Fomo3D死亡3分钟的交易攻击分析

Fomo3D死亡3分钟的交易攻击分析

1.摘要

【本文目标】 (1)通过本文分析,了解Fomo3D游戏第一轮结束的交易攻击流程及具体地址; (2)介绍“拒绝服务攻击”(Denial of Service,DoS)的原理。

2.Fomo3D游戏规则

Fomo3D 是近一个多月以太坊上最火爆的应用,也是个资金盘赌博游戏,本文的目的是做技术分析,所以这里只介绍其结束的设定:

  • 游戏启动后从 24 小时开始倒计时;倒计时结束时,最后一个够买 key 的玩家将获得奖池中 48% 的奖金;
  • 每有一个玩家购买 key,倒计时会增加 30 秒。 所以,获胜条件实际上很简单:在自己购买 key 之后到游戏倒计时结束,不再有其他人购买 key。在现实世界中,要做到这点不那么容易,除非所有玩家都没钱了;但在区块链的世界中,具体到以太坊上,是可以通过“技术手段”做到不让其他人购买的(也就是不让其他人的“购买交易”得到“网络确认”)。这就是大家耳熟能详的“拒绝服务攻击”(Denial of Service,DoS)。

3.Fomo3D的3分钟交易攻击过程

从Eetherscan去看看最后的30秒究竟发生了什么。Eetherscan上的数据表明,问题不仅是出在最后30秒,而是最后3分钟——在这个时间以秒记的游戏里,整整3分钟没有下一个玩家出现。 交易图显示,在2点48分之前和2点51分之后,每一分钟都会有多个玩家买入Fomo3D,但独独在48分和51分之间,交易完全停止了。

黄框内为最后的赢家0xa169

以太坊在这3分钟发生了什么? 2点48分,0xa169买key的交易完成,支付0.0055 eth,支持区块高度是6191896(该笔交易信息: https://etherscan.io/tx/0x7a06d9f11e650fbb2061b320442e26b4a704e1277547e943d73e5b67eb49c349 );3分钟后,2点51分,下一笔Fomo3D交易产生,区块高度6191909,但这笔交易来的太迟,永远错过了Fomo3D第一轮的竞争。 在区块6191896和区块6191909之间,是死亡三分钟,也是所有问题的答案。

3.1 区块的秘密

区块6191896,一切正常,0xa169的这笔交易也赫然在列。区块6191897在6秒之后被挖出,基本正常。

但在下一个区块,6191898,出现了一个0x18e1b664c6a2e88b93c1b71f61cbf76a726b7801的地址,有2笔交易与其有关。 紧接着,区块6191899中,3笔交易与其有关;区块6191900中,3笔;区块6191901中,2笔;区块6191901中,2笔;区块6191902中,4笔;区块6191903中,2笔。

接下来,区块6191904,该区块一共只打包了3笔交易,全部来自0x18e;区块6191905中,全部7笔交易中的3笔;区块6191906中,全部的3笔交易。

区块6191907中,全部4笔交易中的3笔;区块6191908中,全部5笔交易中的4笔。

终于,到了区块6191909,0x18e消失了。 (查看各个区块的信息可以变更以下地址的区块号: https://etherscan.io/block/6191909 ) 摆脱0x18e的区块一口气打包了166笔交易,多笔与Fomo3D相关的交易包含其中,但它们被耽搁的太久,游戏结束了。

0x18e有什么特别?为何死亡三分钟里以太坊上所有的区块都包含与它有关的2到4条交易?原因就出在它对gas的消耗上。 0x18e的一笔交易需要耗费360万或420万的gas,两笔交易加起来是780万gas,而ETH一个区块目前能容纳的gas总量是800万左右。 这样一样,因为0x18e总gas费高,会被优先选择打包,又因为它占的gas量大,所以两笔交易就能填满整个区块,容不下其他的交易。

于是,在交易消失的3分钟里,在区块6191896与区块6191909之间,所有的节点都在打包与0x18e相关的交易(虽然这些交易全因gas超量失败了,也就是说0x18e并没有真正的为这些交易付费)。 而所有与Fomo3D有关的交易,同以太坊上其他的交易一起,被留在了交易池排队等候。 3分钟很短,但足够结束一个以30秒为倒计时的游戏。

3.2 诡异的0xa169与0x18e

在0xa169买入最后一个key后,0x18e“堵塞”了以太坊3分钟。是巧合吗?不是。 0x18e在8月18号被创建,晚0xa169地址3天,之后两者频繁互动,应该是在测试攻击模型。 8月21号,两者间的互动结束,8月22号,0xa169发起了最后一役,它主攻,0x18e掩护。

看看0x18e掩护0xa169的时间点。

在最后一次攻击中,0xa169在6点48分22秒完成交易,0x18e在6点48分43秒至6点52分01秒之间发起攻击,堵塞网络。 但这不是他们第一次配合,0xa169曾在5点50分42秒发起一笔交易,0x18e在5点51分10秒至5点52分57秒之间发起攻击;在此之前,0xa169在5点35分46秒发起交易,0x18e在5点36分49秒至5点37分28秒间发起攻击。 0x18e为0xa169争取到最多时间的一次,就是它们成功的一次。在0xa169拿走奖金之后,0x18e这个地址再无任何动作。 所以,如果你真以为有人用0.8个ETH赢了Fomo3D,未免天真。这是一场投入技术、金钱,被精心策划、全力以赴的战役。

3.3 错失胜利的人

不过,如果说这场胜利完全与幸运无关也不全对。因为0xa169能拿走奖金还跟它的对手,一个倒霉的人有关。 简单讲讲这个运气不好的家伙。地址是0x32ad247B94E46bB75caC37B81e6CB53173002370,就是0xa169上方的这一位。 0x32ad是个狠角色,因为在这个地址上,它总共就出手一次,而且几近成功。该笔交易的地址信息为 https://etherscan.io/tx/0x5e7309de3aab2a36286fc04aebcfadec627bcb4aa89af4dad82001a5993d1be1

它算准在最后的时刻出击,用极高的gas单价被选中进入区块打包(单个交易,gas费551美金),它也是整个死亡3分钟内唯一闯入区块打包环节的Fomo3D交易(区块6191907)。

但它失败了,缘于一个有趣的不幸。它设置的Gas Limit是379000,但交易耗费的gas超过了379000。

在Fomo3D中,几乎没有gas超过379000的交易,但这一次,最重要的一次,偏偏就超了。

4.原理总结

在目前成熟的 Web 服务技术里,制造 DoS 攻击一般是通过大量的并发请求和/或大数据量的独立请求,将 Web 服务的带宽/服务资源占满,而使其无法再相应正常的数据请求。在以太坊中,则可以通过制造大量的“垃圾合约调用”来达到同样的效果。

这里需要来讲一个机制了:交易池(transaction pool)。在矿工/矿池节点上,通常都会有一个交易池,网络上广播的所有新的交易都会被首先加入这个“池”,而后再由矿工/矿池选择那些“经济性更好”的交易优先打包确认。这里说的“经济性”,即由交易发送者在交易数据中指定的 gasPrice,gasPrice 越高,执行交易所附带的合约代码的执行费用也就越高,而这些费用通常是会作为手续费支付给矿工的。所以,矿工/矿池会从交易池中选取那些 gasPrice 明显高于其他交易的交易来优先打包执行(确认)。并且,矿工并不能从技术上判断一个交易中附带的程序代码是否是“垃圾合约调用”(它们也没有这个“责任”),它们仅仅选取那些执行费用更高的交易来优先执行。基于这个原理,就允许了攻击者通过调高包含了“垃圾合约调用”的交易的 gasPrice,来在短时间内用这些“无效交易”占用区块的可用 gas,以使其他“正常交易”无法被打包进区块。

这里还有几个基础知识需要科普一下:

  • 以太坊中的区块可包含的交易(计算量)是由区块的 gasLimit 来控制的,而并不是像比特币那样用数据大小来限制;以太坊中目前区块的 gasLimit 上限是 800 万 gas,矿工可以做 5% 以内的上下浮动;区块内能包含多少交易,是看这些交易执行所消耗的总 gas 是否达到这个区块的 gasLimit;
  • 以太坊中执行交易的费用,是用交易基础执行费用的 21000 gas,加上交易中附加的代码的字节大小的费用(这里有一个折算公式,不详细讲了)以及实际执行代码所消耗的 gas 的总和乘以交易中指定的 gasPrice 来计算的;这个交易费用,会从交易发送者账户中自动扣除;如果交易发送者账户余额不足,交易不会被打包进区块; 以太坊中的交易的实际执行所要消耗的 gas 是可以根据交易执行时的“世界状态”明确知道的,也就是这个交易的实际执行费用是明确知道的,矿工就是据此来判断打包交易的“经济性”。 在 Fomo3D 游戏的后期(即奖池金额已经很高),大多数玩家都会选择在倒计时的最后数分钟内才去购买 key,以让游戏能继续下去。这时,如果有一个机会,在攻击者自己购买了 key 之后(这只会给剩余时间增加 30 秒),能在其后数分钟内让网络不再确认其他人的购买交易,攻击者就可以让游戏结束从而赢得大奖。

加入辉哥知识星球,可以获得Fomo3D全套代码,包含前端页面。

5.参考

1) Fomo3D 游戏的第一轮是如何结束的 2) Fomo3D死亡3分钟:黑客用0.8ETH赢下了10000个ETH

  • 发表于 2018-08-27 13:49
  • 阅读 ( 799 )
  • 学分 ( 5 )
  • 分类:安全/漏洞

0 条评论

请先 登录 后评论
辉哥
辉哥

CTO

107 篇文章, 911 学分