区块链安全问题解析

2023年08月02日更新 2 人订阅
专栏简介 Upbit交易所大额ETH被盗事件详细分析 Ronin Network侧链被盗6.25亿美金流向分析 | 零时科技 零时科技 | 被盗6.1亿美金,Poly Network 被攻击复盘分析 2019年区块链安全事件总结,全球损失超60亿美元 安全建议 | 资金盘项目ETDP转移5000ETH跑路事件详情分析 零时科技 | 智能合约安全系列文章之反编译篇 慢雾:29 枚 Moonbirds NFT 被盗事件溯源分析 美链BEC合约漏洞技术分析 FTN 合约漏洞分析 成都链安:3月发生较典型安全事件超『17』起,以太坊Defi前景与风险并存,诈骗活动有所增加 铸币疑云 —— Paid Network 被盗细节分析 零时科技 | 以太坊链上互助保险平台Nexus Mutual被攻击事件分析 PeckShield:硬核技术解析,bZx协议遭黑客漏洞攻击始末 智能合约语法层面漏洞详解 交易重放+管理漏洞—2000万枚OP被盗事件分析 近7000万美元被盗:Curve被攻击事件分析 技术分析 Lendf.me 被攻击,ERC777到底该不该用? 零时科技:DeFi 项目 Lendf.Me 遭黑客攻击复盘分析 Poker EOS被盗 2万多EOS事件启示 - 谈私钥安全 回顾史上最大智能合约漏洞事件 — The DAO事件 16万美元资产被盗竟是乌龙事件? | Yeld.finance“闪电贷攻击”事件 EOS DApp 随机数漏洞分析2 - EOSDice 随机数被操控 EOS DApp 随机数漏洞分析1 - EOSDice 随机数被预测 EOS DApp 漏洞分析 - inline action 交易回滚攻击 以太坊DAO攻击解决方案代码解析 区块链共识安全 - 51%攻击浅析 【安全】Fomo3D死亡3分钟的交易攻击分析 币安交易所比特币被窃漏洞分析 千万美元被盗 —— DeFi 平台 MonoX Finance 被黑分析 零时科技:勒索软件 Shade 宣布停止运营, 并发布75万个解密密钥 zkSNARK 合约「输入假名」漏洞致众多混币项目爆雷 零知识证明 - zkSNARK应用的Nullifier Hash攻击 区块链安全100问 |​ 第四篇:保护数字钱包安全,防止资产被盗 使用历史权重难度(HWD)预防POW 51%算力攻击 区块链入门-51%攻击原理

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

  • 辉哥
  • 发布于 2018-08-27 13:49
  • 阅读 5218

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

点赞 0
收藏 2
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论