比特幣交易所 比特幣交易所
Ctrl+D 比特幣交易所
ads

WTF Solidity 合約安全: S07. 壞隨機數

Author:

Time:1900/1/1 0:00:00

我最近在重新學solidity,鞏固一下細節,也寫一個“WTFSolidity極簡入門”,供小白們使用,每周更新1-3講。

這一講,我們將介紹智能合約的壞隨機數漏洞和預防方法,這個漏洞經常在NFT和GameFi中出現,包括Meebits,Loots,WolfGame等。

偽隨機數

很多以太坊上的應用都需要用到隨機數,例如NFT隨機抽取tokenId、抽盲盒、gamefi戰斗中隨機分勝負等等。但是由于以太坊上所有數據都是公開透明且確定性的,它沒有其他編程語言一樣給開發者提供生成隨機數的方法,例如random()。很多項目方不得不使用鏈上的偽隨機數生成方法,例如blockhash()和keccak256()方法。

壞隨機數漏洞:攻擊者可以事先計算這些偽隨機數的結果,從而達到他們想要的目的,例如鑄造任何他們想要的稀有NFT而非隨機抽取。更多的內容可以閱讀WTFSolidity極簡教程第39講:偽隨機數。

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]

goblintown.wtf系列NFT24小時交易額增長超300%:金色財經報道,OpenSea最新數據顯示,goblintown.wtf系列NFT過去24小時的交易額為114 ETH,增長率為302%。24小時交易額排名位列OpenSea第12。[2022/10/10 12:50:58]

壞隨機數案例

下面我們學習一個有壞隨機數漏洞的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++;????}}

goblintown.wtf系列NFT地板價跌幅達10.26%:金色財經消息,NFTGo.io數據顯示,goblintown.wtf系列NFT總市值為1.01億美元,24小時交易額達121.78萬美元,跌幅為24.84%。目前地板價達5.5ETH,24小時跌幅為10.26%。[2022/6/8 4:09:45]

它有一個主要的鑄造函數luckyMint(),用戶調用時輸入一個0-99的數字,如果和鏈上生成的偽隨機數randomNumber相等,即可鑄造幸運NFT。偽隨機數使用blockhash和block.timestamp聲稱。這個漏洞在于用戶可以完美預測生成的隨機數并鑄造NFT。

下面我們寫個攻擊合約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系列地板價突破5ETH:金色財經消息,據OpenSea數據顯示,goblintown.wtf NFT系列地板價突破5ETH,目前為5.5ETH,24小時的交易額為2808.75ETH,24小時交易額在OpenSea排名達到第二。[2022/6/1 3:56:12]

攻擊函數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

Tags:INTNFTWTFLUCKEncointer元宇宙概念是什么意思NFTWTF幣LUCKYBABYDOGE

火幣網下載官方app
對鏈游版SLG的終極猜想_FTX

原文標題:《鏈游大猜想——對鏈游版SLG的感覺》原文來源:WLabs瓜田實驗室WLabs?編者按:上周寫了關于SLG游戲在鏈游端的一些想法,正好小飛也完成了一篇關于SLG游戲的調研.

1900/1/1 0:00:00
哪些機構的錢仍在FTX里?_FTX

原文標題:WhoStillHasExposuretoFTX?原文編譯:Leo,BlockBeatsBlockBeats消息,11月10日,Binance官方發文表示,根據公司盡職調查的結果.

1900/1/1 0:00:00
Fuel:模塊化執行案例(第 2 部分)_以太坊

模塊化執行案例 模塊化架構將使區塊鏈能夠以數量級的速度擴展。作為模塊化堆棧的核心部分,執行層正處于快速創新的階段.

1900/1/1 0:00:00
金色午報 | 11月5日午間重要動態一覽_TTE

7:00-12:00關鍵詞:MagicEden、Starkware、Coinbase、Twitter1.OpenSea與Twitter未能達成合作.

1900/1/1 0:00:00
Bankless:分享5個必備的加密分析工具_加密貨幣

作者:WilliamM.Peaster傳統行業中最有技術含量的分析工具也有其局限性。為什么呢?原因很簡單,數據是專有的.

1900/1/1 0:00:00
近期Web3數據:Web2應用型創業者的春天已悄然來臨_WEB

美國紅點創投管理合伙人TomaszTunguz近日在DuneCon2022分享的一組數據表明,在熊市周期,Web3領域的各項數據自高峰時普遍下跌40%到70%.

1900/1/1 0:00:00
ads