主页 > imtoken安卓下载地址 > 只有一个真理! God.Game代币被盗事件原理分析

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

imtoken安卓下载地址 2023-03-18 07:42:08

案例回顾

8月22日中午,区块链游戏God.Game发布公告称,游戏内所有代币被攻击者拿走。 项目组准备了两个月,但游戏运行不久就夭折了。

640?wx_fmt=png

我们得知消息后,不等黑客攻击地址公布,立即对合约源代码展开审计,从代码逻辑、功能准确性等根本问题入手,定位被攻击者利用的漏洞,还原“犯罪事件”。 现场”。

漏洞定位

检查源码是否存在漏洞,发现漏洞原因是dividends变量异常:

先看分红的计算逻辑:

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

每当增加或减少地址令牌时,都会操作地址的 payoutsTo 变量。

640?wx_fmt=png

购买代币以增加 payoutsTo 变量

640?wx_fmt=png

出售或转让代币以减少 payoutsTo 变量

这些很容易理解。

但是在转账逻辑中,我们发现合约地址没有payoutsTo,这个疑惑应该先记在笔记本上。

这是源代码的传输部分:

640?wx_fmt=png

日本比特币被盗事件_被盗比特币如何使用_比特币被盗事件

转移

让我们仔细看看 withdraw 函数:

640?wx_fmt=png

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

从上面分红逻辑的(profitPerShare_*tokenBalanceLedger_[_customerAddress])部分可以看出比特币被盗事件比特币被盗事件,只要有账户有token,分红就一定有价值,分红有价值我们就可以进行withdraw操作.

攻击过程推理

首先创建一个攻击合约并转入某个token,调用一次withdraw后,攻击合约地址对应的payoutsTo值变为dividends*magnitude;

然后转移攻击合约中的token,使其为0。由于原合约转账逻辑没有处理合约类型地址的payoutsTo,所以攻击合约地址对应的payoutsTo值在原合约中并没有减少。 ; 现在将 payoutsTo 带入股息的计算中:

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

由于所有的合约代币都已经转移完毕,tokenBalanceLedger=0,所以此时

(profitPerShare_ * tokenBalanceLedger_[_customerAddress])=0;

payoutTo 也是 int256

那么将公式简化后,上面的复式就变成了

uint256 (int256(0-payoutsTo))/magnitude;

(uint256) ((int256) 表示:

日本比特币被盗事件_被盗比特币如何使用_比特币被盗事件

uint256 将一个 int 负数转换为一个 uint 无符号数,导致该值变成一个大的正数。 这最终导致股息异常增加。

最后通过调用reinvest函数,将分红用于购买大量代币,购买代币的增加导致代币价格上涨。 最后,游戏合约中的以太坊通过出售代币进行转移。

攻击过程总结

创建一个可以调用上帝合约的攻击合约,将几个上帝代币转移到合约中

攻击合约调用上帝合约的withdraw函数,触发payouts[address]的值增加

调用攻击合约,将攻击合约中的所有神代币转移,使合约token=0,攻击合约地址分红异常;

调用reinvest()可以使用异常分红购买大量代币,因为合约代币总量增加,分红增加,代币价格上涨。 这时候,任何人都可以卖出少量的代币,获得大量的 ETH。

640?wx_fmt=jpeg

线索

再来看看游戏合约异常的分红证据:

640?wx_fmt=jpeg

红框内“00000000ffffffffff”类似结构表示是负数

这证明股息确实存在类型转换异常。

640?wx_fmt=png

攻击者通过攻击合约调用上帝合约的reinvest()函数,利用异常分红购买大量上帝代币,总量约300亿。 此时,代币价格快速上涨。 最后,攻击者只卖出了 0.9 个代币,合约中的 200 多个以太币就被转移走了。

日本比特币被盗事件_被盗比特币如何使用_比特币被盗事件

攻击过程再现

重现环境:

Ropsten 测试链

重现步骤:

在测试链上部署上帝合约,上帝地址:

0x92cbCBc31f6bb209f2C4F6cbd0596ba22D71979d

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

攻击者支付 0.1 ETH 购买代币

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

攻击合约代码地址:

8487e4412ac7#代码

攻击者将 4 个 GOD 代币转入 PWN 合约

攻击通过PWN合约调用上帝合约的withdraw函数,使得PWN合约的payoutsTo_变为

640?wx_fmt=jpeg

640?wx_fmt=png

比特币被盗事件_被盗比特币如何使用_日本比特币被盗事件

攻击者转出PWN合约下的上帝代币,使tokenBalanceLedger_为零,计算PWN合约的dividendsOf值所需的参数为:

profitPerShare_ = 8997439772575371

tokenBalanceLedger_[PWN] = 0

payoutsTo_[PWN] = 0x254197237940000000000000000

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

640?wx_fmt=png

攻击者通过PWN合约调用GOD合约的reinvest函数,使用超大股息价值购买代币,获得大量代币,将profitPerShare增加到最大值,从而破坏上帝与上帝之间的汇率以太币

640?wx_fmt=jpeg

异常的每股收益值

640?wx_fmt=jpeg

PWN购买的神币数量

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

640?wx_fmt=jpeg

测试神合约代币总量300亿

640?wx_fmt=jpeg

比特币被盗事件_被盗比特币如何使用_日本比特币被盗事件

真神合约代币总量330亿

总结

经过对上述推理和证据的理论验证,以及复现和真实数据验证,我们确定该攻击方式定义为类型转换漏洞攻击。

攻击者巧妙地利用了上帝合约的设计漏洞。 在计算分红时,没有考虑int类型的负值转为uint的情况,导致合约被攻击。

根据Etherscan查到的信息,该攻击合约于8月20日下午04:42:27部署,ETH于下午04:57:26被取走。 黑客仅用了15分钟就完成了上述所有操作。

除了这个漏洞,我们还在合约中发现了以下两个“后门”。 上帝合约的所有者(以下代码中表示为 Administrator)可以使用这两个功能来转移合约地址下的所有 ETH。

640?wx_fmt=png

管理员可以在这里指定任意账户的代币数量,然后将这部分代币兑换成ETH。

640?wx_fmt=png

这里,管理员拿走项目奖励时,已经拿走的价值不减去,这样管理员就可以重复提取ETH。

总而言之,目前的游戏合约,尤其是重交易属性的游戏合约,存在非常普遍的安全漏洞。 对此,我们提醒玩家和投资者在进入一些“一夜暴富”的游戏之前先擦亮眼睛,谨慎投资。 最好参与提供审计报告的区块链游戏。 不能盲目关注未经合约安全验证的游戏。 同时,各游戏项目方也应在游戏上线前对智能合约进行安全审计,以保障自身项目运营和玩家资产安全。

投稿作者介绍:

杨霞

成都联安科技CEO兼创始人。 中国电子科技大学副教授,最早的区块链形式化验证专家。 一直为航空航天、军事领域提供形式化验证服务。 主持国家核高层次项目、重大软件项目等国家级项目近10项。 CC国际安全标准委员,CCF区块链专委会委员。 发表学术论文30余篇,申请专利20余项。

最新热点文章:

640?wx_fmt=jpeg

大力戳↑↑↑加入区块链大本营读者群⑦

(群已满微信qk15732632926加群)