
9 月 5 日,由 Odaily星球日报主办、36Kr 集团战略协办的 P.O.D 大会在北京举行。在大会的安全论坛上,安比(SECBIT)实验室创始人郭宇与众嘉宾共同探讨区块链的安全问题。郭宇就近期的安全热点话题 Last winner 展开报告,详细解释其中内幕。
在谈及 Last winner 攻击母合约,为何需要传入 Last winner 合约地址时,郭宇表示 Last winner 攻击母合约实际上是一个通用武器, 能攻击很多类 Fomo3D 游戏,这个合约构造的非常巧妙。
在带领大家切身感受黑客如何一步步巧妙利用 Fomo3D 游戏中的漏洞实施攻击后,郭宇也表示,智能合约安全的严重性远超大家想象,我们在享受去中心化世界带来好处时也会面临新的安全风险和代价。
以下为安比(SECBIT)实验室创始人郭宇演讲实录:
我是安比实验室的郭宇,今天分享一下一些比较有意思的事情。
8 月 10 日,一个合作伙伴突然跟我说以太坊似乎有一些很奇怪的事情,问我们能否分析一下。我们接过来后也觉得事情奇怪。这其中有连续且大量的失败交易,标红色的点中发现带的全都是 0.1 ETH,这些大量重复的东西好像在攻击什么。而且这些所有交易来源方均来自于一个前四个字母是 0x5483 的诡异智能合约。该智能合约的交易量还很大,一分钟有几十个,这很容易造成以太坊严重拥堵,这是我们发现一个初步特征。觉得奇怪,又感到很可疑,我们也想知道它到底要干什么。
之后我们发现除了大量的失败交易外,还存在更大量的成功交易。成功交易没什么显著特征,投进去 0.1 个,出来有 0.19 个,这就特别奇怪。同时,失败交易的一个特别特征是 Gas 消耗特别低,感觉是一个非常高效的挖矿机,回报率相当高。
之后我们就发现,0X5483 实际上是一个攻击 Last winner 的攻击合约,精心构造且非常强大,攻击步骤也特别复杂。合约中存在大量转账,比如 PPT 中的这个合约,扔进去的 0.1 ETH,最后出来是 0.18 ETH 或者 0.12 ETH 等。
Last winner 是什么?它是 Fomo3D 山寨版,主要面向国内。在百度能看到大量广告信息,还有很多微信群、QQ 群。此外,Last winner 还有安卓以及 iOS 客户端可以下载。当时高峰时期有 16000,参与的人非常疯狂。
Fomo3D 是什么?这是前一段时间一个现象级的智能合约游戏,瞬间对以太坊用户造成拥堵。游戏中有一个巨大的奖励诱惑,规则是这样的。首先是需要兑换 key,在拿到 key 之后扔给类 Fomo3D 游戏合约。这其中包括三种获利方式,第一种方式存在主奖池,可以有机会拿到最终大奖,即这个游戏不停倒计时,最后一个买 key 的人拿到最后的巨额奖励;第二种方式有一个副奖池,方式为随机概率抽奖,即兑换 key 时就有机会抽奖;第三种方式为小额度奖励,买 key 时间越早,就可以越早享受后来人进来的分红。基于这三种诱人的获奖模式,Fomo3D 推出之后就一度造成以太坊拥堵。
7 月 24 日,安比实验室就已发现刚才第二项空投存在漏洞,有人可以通过不公平方式拿到抽奖结果,我们在 8 月 10 日才收到警告。
之前被曝光的空投抽奖的模式,是有人公开了一个可以攻击的方案,但攻击方式非常低效,甚至不一定成功。大家知道但没有人去试,好像赚不到什么钱。但是这个攻击合约不一样,经过统计该合约成功率将近 60%。
第二天,我们开始对该合约进行分析后发现有三个疑点。一是有五个地址来调用攻击合约;二是 Last winner 合约地址作为参数传入攻击合约;三是每笔成功中奖的攻击交易中都带有合约的创建与自毁。当时也不知道为什么,但是可以肯定这是一个团伙,对其数据分析后发现,这个团伙做了很多别的事情,他们共同去攻击不同的游戏合约。我们把该攻击者组织命名为“BAPT-LW20”。
12 日,团队开始尝试逆向分析该合约代码。由于手上工具有限,只能看自解码,抠了一天还是没什么进展,分析过程陷入僵局。第二天,小伙伴建议把这个攻击合约拷贝下来,将攻击合约中的攻击者地址替换成我们的地址,是不是可以像他一样去拿到奖励?我们重新部署攻击合约,并发起试探性攻击。但经过多次尝试后,均无法赢得抽奖。我们做了非常完备的替换,并且跟踪这个过程,就不知道为什么,就是成功不了,也是挺郁闷。
晚上 12 点,最后方案决定对合约进行死磕,开始对合约进行逆向分析。合约逆向很累,我们怎么办?我们思路就是开发逆向分析辅助工具。手头上并没有什么东西,我们要做几件事情。首先,针对 EVM 逆向分析工具很少,我们决定自己开发;再者合约多层嵌套很难跟踪;同时 EVM 字节码中的循环过程不易定位。
我们花了三天时间开发工具,事情开始出现转机。第一个工具为 awesome-tx-tracer(合约行为跟踪),借助这个能够把智能合约整个过程产生若干个 tracer,并把很多交易行为全部 tracer 分析,进而产生大量数据;第二个我们做了用来做逆向的工具——minievm(合约执行模拟器),借助该工具能够批量定性分析很多 tracer;第三个工具为 ida-evm(合约流图分析器),这是基于 evm 的插件修改而来。产生的 tracer 可以自动往前往后,来回执行,这样就能够比较容易的把整个过程反复看。
最终,我们终于发现真相,攻击合约是一个母合约,母合约驱动 1000 个子合约,这样能大大提高随机数的中奖率。同时,每个子合约攻击的时候会创建一个幽灵合约来发起攻击。什么是幽灵合约?就是在攻击的时候创建,等攻击完立即自毁,在区块链存储区域不留下任何痕迹。黑客通过某一个母合约驱动 1000 个子合约,又创建无数的自毁合约,自毁合约最终去攻击 Last winner,这是一个非常巧妙的玩意。
在 17 日早上开始复盘,我们敲定的最终结果是 6 天内抽走抽奖池 50%,发起近 5 万笔攻击调用,创建 2 万多个幽灵合约。Last winner 很有意思是把空投奖池比例由 Fomo3D 的 1% 提高到 10%。因此,黑客在攻击 Last winner 成功以后,但是对 Fomo3D 并不那么了解。这个母合约在 Last winner 上线第一天几个小时之内就发动了攻击,在前几天每小时几十万的收入。
巧合的是,上午 10 点 Last winner 大奖开出,即刚才说的三种获利模式中的第一个大奖。大奖被这五个攻击者其中一个人拿走,攻击者地址为 0X5167,奖励额度也超高,比他们空投抽到的还要大。
事情还没有结束。五天以后,下午 3 点 02 分,我们又有了一个惊人发现,Fomo3D 第一轮结束,大奖被拿走。是被一个人拿走的吗?不是,他们用了同样手法拿走大奖。为什么?当时我们看到 Fomo3D 大奖的时候,就发现熟悉的一幕。在大奖开出时,出现一组连续的异常区块,且这组连续的异常区块中的消息数量骤减。最后,同一个知名 miner 打包获奖交易。Last winner 结束前后,也出现过类似的异常区块,获奖消息也是由同一个 miner 打包,这时候我们就发现这太巧了。我们开始怀疑,矿池是不是真的对 Fomo3D 作弊?第一时间跟矿池负责人联系后,并把我们知道的所有信息拿出来跟对方对比发现,矿池并没有参与这次作弊,而是这个异常区块隐藏着一个巨大的秘密。这个秘密就是异常区块中的消息均调用同一个合约,这里面存放一些非常诡异的交易,所有交易的 Gas 相当于正常的 Gas 的 100 倍;而这个合约的创建者与中奖者是同一个人。
矿工并没有作弊,而是攻击者利用矿工打包策略,即矿工会优先选择手续费很高的交易打包,这对矿工最有利。通过制造超高手续费来造成区块链的拥堵,阻隔其他玩家。攻击者也非常聪明,攻击合约能够智能判断是否启动网络阻塞功能,使其效益最大化,成本最小化。
总之,这个合约构造的非常巧妙。若攻击者没有拿走大奖,它依然会存在于很多矿池的应用池,等待时机成熟,这些交易就会顺势变成交易费用非常高的交易。
所以说,这个游戏漏洞使得前面主奖池和副奖池可以很轻松被攻击。还有一个问题,大家还记得 Last winner 攻击母合约,为什么需要 Last winner 作为合约地址?事实上,这个攻击母合约是一个通用母合约,能够攻击很多类 Fomo3D 游戏。在 Fomo3D 上线第二天就有人发现空投抽奖漏洞,并攻击成功。
你面对的是全世界非常顶尖的黑客,你随时有可能受到损失。因此,智能合约安全严重性远超大家的想象,大家想象的未来去中心化世界真的那么美好吗?在享受去中心化世界带来好处的时候也同样会付出一些代价和面临一些新的安全风险。谢谢大家。
