Pandemica庞氏游戏存在Gas超出漏洞,80余万资金遭冻结

在18天前,以太坊网络中有人部署了一个名为Pandemica的新款的庞氏游戏,在以太坊中类似的游戏都是非常受欢迎的,譬如PoWH 3D、FOMO 3D等,因为基于区块链不可篡改、公开透明等特性,人们就算知道是“庞氏骗局”也会蜂拥而上,这也是我们不把这类游戏叫做“庞氏骗局”而叫做“庞氏游戏”的原因。

这是合约地址:https://etherscan.io/addres/0xD8a1Db7AA1E0ec45E77B0108006dc311cD9D00e7#code

图片.png在图中可以看到,合约里还有458个以太币,价值12万美元.....不过,在这个合约中又发生了和以前parity多签名钱包合约一样的惨案,里面的资金全部被冻结

分析

首先从游戏机制说起,这个合约的机制非常简单:向合约充以太币,然后合约会不定时(受owner控制)向充值的用户赠送充值金额的3%作为奖励,回馈给用户。

图片.png

合约代码解释可以看如上图,整个合约不超过60行,非常简单,但是这里的Count函数,也就是发放3%奖励的函数有一个致命的缺陷。

function Count() onlyowner {    
   while (counter>0) {        Tx[counter].txuser.send((Tx[counter].txvalue/100)*3);        counter-=1;    } }

可以看到,函数内是使用while循环来给每笔充值发放奖励的,循环次数是有充值数决定的,尴尬的事情来了:在以太坊网络中进行每一次计算都是需要消耗Gas的,而以太坊每一个区块所能消耗的Gas是有上限的,在以太坊主网中,这个上限是8000000 Gas。

从合约中可以看出来,counter变量在总体上是增量的,因为调用Count函数将counter变量归零后,下一次用户充值还会将充值数赋值给counter,所以 当counter的值达到某个阈值的时候,调用Count函数所需要的Gas会超过主网一个区块所能消耗的Gas的上限,这笔资金将冻结以太坊主网未来提升区块Gas上限的那一天才有可能解冻。

然而,这样的悲剧在昨天就已经发生了。

图片.png

图中为该合约的owner,可以看到3笔失败的交易,owner都在逐步提升手续费,从0.05至0.19,可是依然失败。

图片.pngowner在第三次用了7900000 Gas(已经接近区块Gas上限)尝试失败之后,选择了放弃。

目前官网也已经发布了公告,在等待主网区块Gas上限提升。

图片.png

然而现在依然还有用户在不断充值。

图片.png

每一笔充值都会不断增加Count函数所需要的Gas,如果有攻击者使用极低的充值金额来进行恶意充值,那么这笔以太币将永远冻结。

最后,BCSEC团队监测到两天前有一个合约抄袭了该合约的代码,在做同样的事情。

合约地址为:https://etherscan.io/address/0x4208a616fb79828ebff99f17fc472a2ad6374c72

图片.png

在这里BCSEC团队提醒投资者,千万不要去充值

*文章为作者独立观点,不代表BSCEC立场

转载此文章须经作者同意,并请附上出处(未知网站)及本页链接。

白帽汇安全研究院原创2018-08-30 21:50:39 4936