本文由certik安全研究团队授权,在首发。
编者按:上线uniswap的小型代币项目nugs疑似“跑路诈骗”,项目方将这一举动归咎于“智能合约漏洞”。certik安全研究团队就这一合约漏洞进行的研究。
大家在学生时代是否有过这样的经历:
考试的时候把较难的题都做对了,却因为简单的题丢了分。
老师经常说,那些拿满分?的好学生,都是既抓住了难题,同时也没放过简单的题目。
北京时间8月11日,certik安全研究团队发现基于
以太坊
区块链金融书籍推荐的代币项目nugs出现安全问题,
其智能合约中存在安全漏洞,致使其代币系统出现巨额通胀
。由于该智能合约的安全漏洞无法被修复,因此最终nugs项目官方发布公告决定放弃该项目,存入其中的代币也无法被取出。官方公告如下图:
binance官网certik安全研究团队研究nugs项目部署的智能合约,发现其安全漏洞存在于
dolottery和_dolottery
这两个函数中。
根据其智能合约的功能分析,nugs代币项目是一个类似于彩票抽奖的系统。
项目参与者向该智能合约中存入资金,这些资金会汇入当前彩票抽奖轮次的奖池中。然后每当经过一段时间后,智能合约会允许外部调用者调用下图中的dolottery函数来抽取当前彩票抽奖轮次的赢家,决定这个赢家的条件是
这位外部调用者的地址以及当前彩票抽奖奖池中的奖金总量
。而这位外部调用者会收到一部分奖金作为“开启”彩票抽奖奖池的奖励。
从上图中可以发现,通过第15行代码可以获得当前彩票抽奖奖池中的奖金数额。第20~22行代码显示,一部分奖金会奖励给外部调用dolottery函数的用户,这位用户也就是实际上的此次彩票轮次的“开奖嘉宾”。然后在25~28行中,扣除奖励给外部调用者的奖励之后的剩余奖金会被发送给本轮彩票的赢家。之后本轮彩票的开奖阶段结束。
该智能合约出现的问题在于:当在一次彩票抽奖完成后,彩票池中的奖金额没有被清零,导致了下一次彩票轮次开时,彩票池中依旧有上一次彩票池中奖金的数额,
也就是彩票奖池中的初始奖金额会被错误的设置为上一次彩票抽奖结束后奖池中的最终奖金数目
,而正确的初始奖金额应该为“零”。
每一次开奖时的奖金额都会被记录传递到下一次抽奖的初始奖池中,这样就会最终导致彩票池中的奖金越来越多,从而造成代币通胀并飞快贬值。