区块链挖矿_区块链开发_比特币行情_快报网

网站地图资讯

区块链挖矿_区块链开发_比特币行情_快报网

当前位置: 快报网 > 观点 >

真相只有一个 God.Game 代币被盗事件原理分析

时间:2021-07-15 17:21人气:来源: www.yzycqj.com

成都链安科技公司,专注区块链安全范围,总部坐落于成都。由电子科技大学杨霞教授和郭文生教授一同创建,团队核心成员由40多名分别来自国外知名高校和实验室留学经历的副教授、博士后、博士、硕士及阿里、华为等知名企业精英组成。其核心技术为形式化验证,该团队用此技术为航天、军事等范围的安全重要系统提供多年的形式化验证服务,是国内唯一一家将此技术应用到区块链安全范围的公司。

攻击步骤概要

第一看一下dividends的计算逻辑:

真相只有一个 God.Game 代币被盗事件原理分析 真相只有一个 God.Game 代币被盗事件原理分析

8月22日中午,God.Game宣布游戏内所有被攻击者卷走,项目方筹措准备两个月游戏在运营不久后飞速夭折。

攻击步骤推理

4.攻击者部署攻击合约PWN,PWN合约地址: 0x88DF1483Db9d3720378d2CB6859c8487e4412ac7

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

真实God合约代币总量330亿

漏洞定位

购买token增加payoutsTo变量:

蛛丝马迹

大家再仔细查询一下withdraw函数里面:

tokenBalanceLedger_[PWN] = 0

payoutsTo_[PWN] = 0x254197237940000000000000000

大家惊讶的发目前withdraw函数中,会对payoutsTo进行一个赋值操作,赋值为dividends*magnitude;这里magnitude=2**64;

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

3.最后通过调用reinvest功能用dividens购买很多token,买入token增加后致使token价格增加。最后通过卖出token的方法转走游戏合约中的ETH。

卖出或转账token降低payoutsTo变量:

Ropsten测试链

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

成都链安科技作为分布式策略资金投入的唯一区块链安全公司,已与火币网、OKEX、LBank、CoinBene、KuCoin、CoinMex、Becent、JBEX、BIGEVC、ONT、Scry、CareerOn、IoTeX、DALICH人工智能N、Themis、BTM币、布比区块链、云象区块链、币菜鸟等多家单位签订策略合作协议,并与全球顶级的形式化验证团队法国Inria达成合作。在国家工信部发布的《2018中国区块链产业白皮书》中公司榜上有名,且荣获“OKEx 最好安全审计合作伙伴奖”。公司已经入选ETHscan智能合约安全审计推荐名单。

关于成都链安科技:

攻击合约代码地址:

案情回放

因为合约token已经全部转走,tokenBalanceLedger=0,所以此时(profitPerShare_ * tokenBalanceLedger_[_customerAddress])=0;payoutTo也为int256

复现步骤:

概要

真相只有一个 God.Game 代币被盗事件原理分析 真相只有一个 God.Game 代币被盗事件原理分析

真相只有一个 God.Game 代币被盗事件原理分析 真相只有一个 God.Game 代币被盗事件原理分析

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

测试God合约代币总量300亿

总而言之,现在的游戏合约,特别是买卖属性较重的游戏合约,安全漏洞出现的状况很常见,成都链安科技提醒广大玩家和资金投入者,在进入一些“一夜之间爆红”的游戏之前,要擦亮双眼,理智资金投入,最好是参与已经提供审计报告的区块链游戏,对于未经过合约安全验证的游戏不可盲从。同时,各游戏项目方也应该在游戏上线前做好对智能合约的安全审计,以保护我们的项目运营和玩家的资产安全。

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

真相只有一个 God.Game 代币被盗事件原理分析 真相只有一个 God.Game 代币被盗事件原理分析

大家查询游戏合约异常的dividends证据:

(uint256) ((int256)表示的是:uint256对一个int负数强制转化为一个uint无符号数,致使值变成了一个非常大的正数。最后致使dividends异常增加。

2.然后再将攻击合约中token转走,使其token为0,因为原合约转账逻辑中并没对合约种类地址的payoutsTo做处置,所以攻击合约地址对应的payoutsTo值在原合约看来并没降低;目前将payoutsTo带入dividends的计算中:

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

这部分都比较容易理解。

真相只有一个 God.Game 代币被盗事件原理分析 真相只有一个 God.Game 代币被盗事件原理分析

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

从上面dividends的逻辑的(profitPerShare_*tokenBalanceLedger_[_customerAddress])部分可以看出,只须有竞价推广账户有token那dividends就肯定有值的,dividends有值大家就可以进行withdraw操作。

成都链安科技合约审计团队对源码进行漏洞排查后发现漏洞缘由为dividends变量异常:

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

真相只有一个 God.Game 代币被盗事件原理分析 真相只有一个 God.Game 代币被盗事件原理分析

2.一般用户支付1 以太币购买代币

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

真相只有一个 God.Game 代币被盗事件原理分析 真相只有一个 God.Game 代币被盗事件原理分析

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

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

8.攻击者通过PWN合约调用GOD合约reinvest函数,借助超大的dividendsOf 值购买代币,获得了很多代币,使得profitPerShare提高到很大值,进而破坏了God 与以太币之间的汇率

真相只有一个 God.Game 代币被盗事件原理分析 真相只有一个 God.Game 代币被盗事件原理分析

成都链安科技团队得知此消息之后,没等待黑客攻击地址被公布,立即展开了对合约源码的审计,从代码逻辑和功能准确性等根源问题入手,定位攻击者借助的漏洞,并复原了“案发现场”。

除此漏洞以外,大家还在合约中发现如下两个“后门”,God合约的owner可以用这两个函数转出合约地址下的所有以太币。

这是网站源码的转账部分

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

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

真相只有一个 God.Game 代币被盗事件原理分析 真相只有一个 God.Game 代币被盗事件原理分析

攻击者巧妙借助God合约的设计漏洞,在计算dividends时,未考虑int种类的负值转化为uint时的状况,致使合约被攻击。

真相只有一个 God.Game 代币被盗事件原理分析 真相只有一个 God.Game 代币被盗事件原理分析

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

真相只有一个 God.Game 代币被盗事件原理分析 真相只有一个 God.Game 代币被盗事件原理分析

真相只有一个 God.Game 代币被盗事件原理分析 真相只有一个 God.Game 代币被盗事件原理分析

1.第一创建一个攻击合约并转入肯定token,调用一次withdraw之后,该攻击合约地址对应的的payoutsTo值变为dividends*magnitude;

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

PWN购买的God代币数

真相只有一个 God.Game 代币被盗事件原理分析 真相只有一个 God.Game 代币被盗事件原理分析

复现环境:

(4)调用reinvest()可以用异常devidends购买很多token,由于合约token总量增加,分红增加,token价格上涨,此时其他人都可以卖出少量token来获得到很多的eth

真相只有一个 God.Game 代币被盗事件原理分析 真相只有一个 God.Game 代币被盗事件原理分析

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

转账:

真相只有一个 God.Game 代币被盗事件原理分析 真相只有一个 God.Game 代币被盗事件原理分析

profitPerShare_ = 8997439772575371

异常的profitPerShare值

真相只有一个 God.Game 代币被盗事件原理分析 真相只有一个 God.Game 代币被盗事件原理分析

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

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

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

那样简化公式之后上面复杂的公式变为uint256 (int256(0-payoutsTo))/magnitude;

经由以上推理与证据的理论验证,与复现与真实的数据验证,大家确定此次攻击方法概念为种类转换漏洞攻击。

真相只有一个 God.Game 代币被盗事件原理分析 真相只有一个 God.Game 代币被盗事件原理分析

攻击步骤复现

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

标签:

上一篇:政府推手 无币区块链弯道超车

网站首页

下一篇:没有了



热门标签