【安全】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

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

推荐阅读更多精彩内容