WF曲速未来揭秘:God.Game被盗事件具体分析

来自:jinse.com 归档时间:2018-08-29

8月19日,God.Game在以太坊区块链上部署了自己的智能合约(地址位于https://etherscan.io/token/0xca6378fcdf24ef34b4062dda9f1862ea59bafd4d,简称God合约),时隔一天攻击者就盗取了该合约的243个以太币,价值超过6万美元。WF曲速未来对该攻击进行详细了解,简称God合约。时隔一天攻击者就盗取了该合约的243个以太币,价值超过6万美元。该项目方筹备两个月游戏在运营不久后迅速夭折。

简单介绍

God.Game是一个基于以太坊网络的博彩类区块链游戏平台,独立运行在智能合约上,一切由机器人自动执行,一旦运行,人无法对它进行干预和操控,达到一个去中心化的目的。God.Game还打出这样的口号:高分红、全透明、防止作弊,打造全球最安全的智能合约游戏平台。此外,God.Game还设有GOD股份机制。用户通过购买GOD股份(GOD代币)来获得分红。并且,如果拥有了100个GOD 股份,用户即可以成为超级节点,激活邀请系统。

漏洞定位

经过对源代码进行漏洞排查后发现漏洞原因为dividends变量异常:

首先看一下dividends的计算逻辑:

return (uint256) ((int256)(profitPerShare_*tokenBalanceLedger_[_customerAddress]) - payoutsTo_[_customerAddress]) / magnitude;

每当一个地址token增加或减少操作时,都会对该地址的payoutsTo这个变量进行操作,

购买token增加payoutsTo变量:

WF曲速未来揭秘:God.Game被盗事件具体分析

卖出或转账token减少payoutsTo变量:

WF曲速未来揭秘:God.Game被盗事件具体分析

这些都很容易理解。

但是在转账逻辑我们却发现,对于合约地址,是没有payoutsTo的,这个疑点先记在小本本上。

这是源码的转账部分

转账:

WF曲速未来揭秘:God.Game被盗事件具体分析

我们再仔细查看一下withdraw函数里面:

WF曲速未来揭秘:God.Game被盗事件具体分析

我们惊讶的发现在withdraw函数中,会对payoutsTo进行一个赋值操作,赋值为dividends*magnitude;这里magnitude=2**64;

从上面dividends的逻辑的(profitPerShare_*tokenBalanceLedger_[_customerAddress])部分可以看出,只要有账户有token那dividends就一定有值的,dividends有值我们就可以进行withdraw操作。

攻击流程推理

对照攻击者交易明细,我们来复现攻击流程。我们假设token对应红利是1:1,便于解释。

1.部署攻击合约

tx:1.部署合约攻击者部署合约,准备攻击。合约地址:0x7F325efC3521088a225de98F82E6dd7D4d2D02f8

2.购买token

tx:2. 购买token攻击者购买一定量token,准备攻击。

WF曲速未来揭秘:God.Game被盗事件具体分析

3.向攻击合约转账token

tx:3.transfer(attacker->attack-contract)攻击者本身购买了少量token,使用游戏合约中的transfer(),向攻击合约转账。

WF曲速未来揭秘:God.Game被盗事件具体分析

4.攻击合约withdraw()

tx:4.withdraw()攻击合约调用了God的withdraw(),攻击合约因此获得了红利对应以太币不重要

WF曲速未来揭秘:God.Game被盗事件具体分析

5.攻击合约transfer()

tx:5.transfer(attack-contract->attacker)将token转回,攻击合约token不变,红利溢出。

WF曲速未来揭秘:God.Game被盗事件具体分析

6.攻击合约reinvest()

tx:6.reinvest()再投资,将红利买token,可以大量购买token。

WF曲速未来揭秘:God.Game被盗事件具体分析

7.攻击合约sell()

tx:7.sell()卖出一部分token,因为发行的token过多,会导致token价值太低,提取以太币较少。

8.攻击合约transfer()

tx:8.transfer(attack-contract -> 受益者)把智能合约账户的token转给受益者(0xc30e)一部分。

9.受益者sell()+withdraw()

受益者(0xc30e)卖掉token,并withdraw()红利,得到以太币。

攻击流程总结

(1) 创建一个攻击合约,可以调用God合约并且向该合约转入几个God token

(2) 攻击合约调用God合约withdraw的函数,触发payouts[address]值增加

(3) 调用攻击合约将攻击合约中的God token全部转出,使合约token=0,攻击合约地址的dividends出现异常;

(4) 调用reinvest()可以使用异常devidends购买大量token,因为合约token总量增加,分红增加,token价格上涨,此时任何人都可以卖出少量token来获取到大量的eth蛛丝马迹

WF曲速未来揭秘:God.Game被盗事件具体分析

我们查看游戏合约异常的dividends证据:

WF曲速未来揭秘:God.Game被盗事件具体分析

红框内“00000000ffffffffff”的类似结构代表其为负数

由此证明dividends确实出现了类型转换异常的情况。

WF曲速未来揭秘:God.Game被盗事件具体分析

攻击者通过攻击合约调用God合约的reinvest()函数,使用异常的dividends购买了大量God代币,总量约为300亿,此时代币价格迅速攀升,最后,攻击者只卖出了0.9个token就已经将合约中的200多以太坊转走。

复现步骤:

1.部署God合约在测试链上,God地址: 0x92cbCBc31f6bb209f2C4F6cbd0596ba22D71979d

2.普通用户支付1 ETH购买代币

3. 攻击者支付0.1 ETH购买代币

4. 攻击者部署攻击合约PWN,PWN合约地址:     0x88DF1483Db9d3720378d2CB6859c8487e4412ac7攻击合约代码地址:https://ropsten.etherscan.io/address/0x88DF1483Db9d3720378d2CB6859c8487e4412ac7#code

5. 攻击者向PWN合约转4 GOD代币

6. 攻击通过PWN合约调用God合约的withdraw函数,使PWN合约的payoutsTo_变为:

WF曲速未来揭秘:God.Game被盗事件具体分析

7. 攻击者转出PWN合约下的God代币,使得tokenBalanceLedger_为零,此时计算PWN合约的dividendsOf 值所需参数的值为:profitPerShare_ = 8997439772575371tokenBalanceLedger_[PWN] = 0payoutsTo_[PWN] = 0x254197237940000000000000000

执行dividendsOf函数,得到PWN合约地址的分红为dividendsOf = uint(-0x25419723794),此处在由int转化为uint中出现错误:

WF曲速未来揭秘:God.Game被盗事件具体分析

8. 攻击者通过PWN合约调用GOD合约reinvest函数,利用超大的dividendsOf 值购买代币,获得了大量代币,使得profitPerShare提升到极大值,进而破坏了God 与ETH之间的汇率

WF曲速未来揭秘:God.Game被盗事件具体分析

异常的profitPerShare值

WF曲速未来揭秘:God.Game被盗事件具体分析

PWN购买的God代币数

9. God合约的代币数量与主链上数量相近,复现成功

WF曲速未来揭秘:God.Game被盗事件具体分析

测试God合约代币总量300亿

WF曲速未来揭秘:God.Game被盗事件具体分析

真实God合约代币总量330亿

总结

经由以上推理与证据的理论验证,以及复现与真实的数据验证,我们确定此次攻击手段定义为类型转换漏洞攻击。

攻击者巧妙利用God合约的设计漏洞,在计算dividends时,未考虑int类型的负值转化为uint时的情况,导致合约被攻击。

从Etherscan上查到的信息来看,部署攻击合约为8月20日04:42:27 PM,卷走ETH为04:57:26 PM。黑客仅仅用了15分钟完成上述所有操作。

除此漏洞之外,我们还在合约中发现如下两个“后门”,God合约的owner(在下列代码中体现为Administrator)可以使用这两个函数转出合约地址下的所有ETH。

WF曲速未来揭秘:God.Game被盗事件具体分析

此处Administrator可以指定任意账户的代币数,然后可以将这部分代币数兑换为ETH

WF曲速未来揭秘:God.Game被盗事件具体分析

此处Administrator取走项目奖励时没有减去已经取走的value值,导致Administrator可以重复取出ETH。

WF曲速区提醒:总而言之,目前的游戏合约,尤其是交易属性较重的游戏合约,安全漏洞出现的情况非常普遍。

不仅是God.Game,区块链博彩类游戏已是漏洞重重。

8月17日,一款火爆程度堪比“Fomo3D”的区块链游戏“Last Winner”首轮已经宣告结束,最终Winner一举斩获了7,755个ETH,以当时行情来预估,奖金高达1500万元。而PeckShield安全研究人员进一步跟踪研究发现,该获奖账户正是此前发现的利用合约攻击合约,提升中大奖的概率的“外挂”账户,同时,该外挂账户还在利用游戏的空投机制进行薅羊毛,总计获利231个ETH。

而炙手可热的Fomo3D首轮结束疑为“黑天鹅”,获奖者投入仅0.8个ETH,回报超13,000倍,PeckShield安全人员追踪该用户地址发现,该用户于8月15日开始投注,每次投注金额约为一个Key的价钱,截至获得大奖,共计投入了0.8个ETH,投资回报率超13,000倍,回报惊人。需要说明的是,该地址为普通账户并非“合约”,只不过采用了一个简单的自动交易“脚本”,由于最后40次平均投注间隔长约183秒,频率不算太高。

区块链安全公司WF曲速未来提醒广大玩家和投资者,在进入一些“一夜爆红”的游戏之前,要擦亮眼睛,理智投资,最好是参与已经提供审计报告的区块链游戏,对于未经过合约安全验证的游戏不可盲从。同时,各游戏项目方也应该在游戏上线前做好对智能合约的安全审计,以保护自己的项目运营和玩家的资产安全。区块链为游戏行业带来变革的同时,保证游戏的安全性可能也是当务之急。

有关于WF曲速未来揭秘:God.Game被盗事件具体分析

WF曲速未来:区块链安全事件回顾之Parity钱包被盗事件

区块链安全社区WF曲速区:只有不忘历史才能展望未来,在接下来这段时间里曲速区将带你一起回顾区块链安全事件总结与区块链技术展望。 四、Parity 多重签名钱包被盗事件详细回顾: 四、Parity 多重签名钱包被盗事件解析 时间:2017年7月 事件简介: Parity 是一款多重签名钱包,是目前

WF曲速未来:以太坊JSON RPC接口多种盗币揭秘之偷渡时代

WF曲速未来有话要说:古人的盗亦有道,在虚拟货币领域也有着它独特的定义。只有对区块链技术足够了解,才能在这场盛宴中获取足够多的金钱。他们似那黑暗中独行的狼,无论是否得手都会在被发现前抽身而去。 前言: WF曲速未来带你回顾: 2018-03-21, 在《揭秘以太坊中潜伏多年的「偷渡」漏洞,全球黑客

WF曲速未来:以太坊JSON RPC接口多种盗币揭秘之重放攻击

交易缓存池的重放攻击 WF曲速未来提醒:对于曾经被盗币,修复方案仅为:关闭对公网暴露的RPC接口,关闭后继续使用节点中相关账户的节点,可能会受到该攻击。 在之前讲到,为了实现攻击者不停的发送转账请求的功能,笔者使用了while True循环,并且在geth终端中看到了多条成功签名的交易hash。由

WF曲速未来:以太坊JSON RPC接口多种盗币揭秘之知识篇

前面写的话: WF曲速未来表示:以太坊,作为区块链 2.0 时代的代表,通过智能合约平台,解决比特币拓展性不足的问题,在金融行业有了巨大的应用。 通过智能合约进行交易,不用管交易时间,不用管交易是否合法,只要能够符合智能合约的规则,就可以进行无限制的交易。在巨大的经济利益下,总会有人走上另一条道

WF曲速未来揭秘:VBScript引擎中的漏洞会影响Internet Explorer运行Shellcode

WF曲速未来消息:在7月11日的时候发现了一个高风险的Internet Explorer(IE)漏洞,就在微软7月补丁周二的第二天。虽然此漏洞(现在指定为CVE-2018-8373)会影响最新版Windows中的VBScript引擎,但Internet Explorer 11并不容易受到攻击,因为