木星链 木星链
Ctrl+D收藏木星链
首页 > DYDX > 正文

WTF Solidity 合约安全: S07. 坏随机数

作者:

时间:1900/1/1 0:00:00

我最近在重新学solidity,巩固一下细节,也写一个“WTFSolidity极简入门”,供小白们使用,每周更新1-3讲。

这一讲,我们将介绍智能合约的坏随机数漏洞和预防方法,这个漏洞经常在NFT和GameFi中出现,包括Meebits,Loots,WolfGame等。

伪随机数

很多以太坊上的应用都需要用到随机数,例如NFT随机抽取tokenId、抽盲盒、gamefi战斗中随机分胜负等等。但是由于以太坊上所有数据都是公开透明且确定性的,它没有其他编程语言一样给开发者提供生成随机数的方法,例如random()。很多项目方不得不使用链上的伪随机数生成方法,例如blockhash()和keccak256()方法。

坏随机数漏洞:攻击者可以事先计算这些伪随机数的结果,从而达到他们想要的目的,例如铸造任何他们想要的稀有NFT而非随机抽取。更多的内容可以阅读WTFSolidity极简教程第39讲:伪随机数。

goblintown.wtf系列NFT24小时交易额增长超300%:金色财经报道,OpenSea最新数据显示,goblintown.wtf系列NFT过去24小时的交易额为114 ETH,增长率为302%。24小时交易额排名位列OpenSea第12。[2022/10/10 12:50:58]

坏随机数案例

下面我们学习一个有坏随机数漏洞的NFT合约:BadRandomness.sol。

goblintown.wtf系列NFT24小时交易额为151.15万美元:金色财经消息,据NFTGo.io数据显示,goblintown.wtf系列NFT总市值达5353.65万亿美元,在所有NFT项目总市值排名中位列第42;其24小时交易额为151.15万美元,增幅达22.03%。截止发稿时,该系列NFT当前地板价为2.95,跌幅达33.11%ETH。[2022/6/15 4:28:57]

contract?BadRandomness?is?ERC721?{????uint256?totalSupply;????//?构造函数,初始化NFT合集的名称、代号????constructor()?ERC721("",?""){}????//?铸造函数:当输入的?luckyNumber?等于随机数时才能mint????function?luckyMint(uint256?luckyNumber)?external?{????????uint256?randomNumber?=?uint256(keccak256(abi.encodePacked(blockhash(block.number?-?1),?block.timestamp)))?%?100;?//?get?bad?random?number????????require(randomNumber?==?luckyNumber,?"Better?luck?next?time!");????????_mint(msg.sender,?totalSupply);?//?mint????????totalSupply++;????}}

goblintown.wtf系列NFT24小时交易额为90.35万美元:金色财经消息,据NFTGo.io数据显示,goblintown.wtf系列NFT总市值达6264万美元,在所有NFT项目总市值排名中位列第38;其24小时交易额为90.35万美元,跌幅达12.69%。截止发稿时,该系列NFT当前地板价为3ETH,涨幅为3.81%。[2022/6/13 4:21:22]

它有一个主要的铸造函数luckyMint(),用户调用时输入一个0-99的数字,如果和链上生成的伪随机数randomNumber相等,即可铸造幸运NFT。伪随机数使用blockhash和block.timestamp声称。这个漏洞在于用户可以完美预测生成的随机数并铸造NFT。

下面我们写个攻击合约Attack.sol。

“哥布林” GoblintTown.wtf NFT系列市值突破1亿美元:金色财经报道,据最新数据显示,“哥布林” GoblintTown.wtf NFT系列市值突破1亿美元,本文撰写时达到1.105亿美元,交易额为6834万美元。此外,该NFT系列地板价已升至7.1 ETH,24小时涨幅达到37.18%。Goblintown NFT 通过免费公售的形式在以太链上发售,发行总数量为 9999 个,其中Goblintown #6485以77.75 ETH成交,约合 150,507.29 美元,为目前该系列最高交易记录。[2022/6/6 4:04:39]

contract?Attack?{????function?attackMint(BadRandomness?nftAddr)?external?{????????//?提前计算随机数????????uint256?luckyNumber?=?uint256(????????????keccak256(abi.encodePacked(blockhash(block.number?-?1),?block.timestamp))????????)?%?100;????????//?利用?luckyNumber?攻击????????nftAddr.luckyMint(luckyNumber);????}}

攻击函数attackMint()中的参数为BadRandomness合约地址。在其中,我们计算了随机数luckyNumber,然后将它作为参数输入到luckyMint()函数完成攻击。由于attackMint()和luckyMint()将在同一个区块中调用,blockhash和block.timestamp是相同的,利用他们生成的随机数也相同。

Remix复现

由于Remix自带的RemixVM不支持blockhash函数,因此你需要将合约部署到以太坊测试链上进行复现。

部署BadRandomness合约。

部署Attack合约。

将BadRandomness合约地址作为参数传入到Attack合约的attackMint()函数并调用,完成攻击。

调用BadRandomness合约的balanceOf查看Attack合约NFT余额,确认攻击成功。

预防方法

我们通常使用预言机项目提供的链下随机数来预防这类漏洞,例如ChainlinkVRF。这类随机数从链下生成,然后上传到链上,从而保证随机数不可预测。更多介绍可以阅读WTFSolidity极简教程第39讲:伪随机数。

总结

这一讲我们介绍了坏随机数漏洞,并介绍了一个简单的预防方法:使用预言机项目提供的链下随机数。NFT和GameFi项目方应避免使用链上伪随机数进行抽奖,以防被黑客利用。

推特:@0xAA_Science|@WTFAcademy_

社区:Discord|微信群|官网wtf.academy

所有代码和教程开源在github:?github.com/AmazingAng/WTFSolidity

来源:bress

标签:INTNFTWTFLUCKINTX价格CNFTWTF价格LuckTogether

DYDX热门资讯
EFI:借贷还将在DeFi进化

DeFi从数字货币背后的区块链技术中汲取灵感,不受单一的中心化来源的控制。DeFi之所以与众不同,是因为它将区块链的使用从简单的价值转移扩展到更复杂的金融应用.

1900/1/1 0:00:00
NFT:金色Web3.0日报 | SuperRare推出新的NFT收藏家通行证

DeFi数据1、DeFi代币总市值:476.9亿美元 DeFi总市值及前十代币数据来源:coingecko2、过去24小时去中心化交易所的交易量39亿美元 金色午报 | 3月6日午间重要动态一览.

1900/1/1 0:00:00
区块链:晚间必读 | Web3 从入门到精通

1.金色观察|5个必备的加密分析工具以太坊和其他顶级智能合约区块链上充斥着海量数据。如果你能很好地实时分析这些数据,就会有大量的alpha甚至还会有工作机会等着你去解锁.

1900/1/1 0:00:00
SUI:解读Sui经济机制:Sui如何解决昂贵的区块链存储问题?

原文:@SuiNetwork编译:@SuiWorldHQ像在普通数据库一样,用户可以在区块链中写入数据,再读取,但这是有一定的经济成本,在比特币、以太坊区块链上存储数据是非常昂贵的.

1900/1/1 0:00:00
数字货币:新闻周刊 | 比特币白皮书已发布14周年

金色周刊是金色财经推出的一档每周区块链行业总结栏目,内容涵盖一周重点新闻、矿业信息、项目动态、技术进展等行业动态。本文是其中的新闻周刊,带您一览本周区块链行业大事.

1900/1/1 0:00:00
元宇宙:以史为鉴:思考元宇宙的方法

元宇宙无疑是现在的风口,这个概念火到几乎每一家大公司的CEO都要给自己的团队发邮件,要求制定自己的元宇宙战略.

1900/1/1 0:00:00