買比特幣 買比特幣
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講:偽隨機數。

“哥布林” 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]

goblintown.wtf NFT系列地板價突破8ETH,24小時交易額排名達到第一:金色財經消息,據OpenSea數據顯示,goblintown.wtf NFT系列地板價突破8ETH,目前為8.2ETH,24小時的交易額為4997.18ETH,24小時交易額在OpenSea排名達到第一。[2022/6/2 3:58:03]

壞隨機數案例

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

它有一個主要的鑄造函數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);????}}

fees.wtf回應低流動性:團隊正在逐步增加流動性以防止機器人搶跑:1月14日消息,Gas 使用統計查詢網站 fees.wtf 在 Discord 社群中回應關于流動性不足的問題,并表示其在發布前提到將在發布不久之后添加流動性,但并未說明具體數量。是因為團隊不希望機器人搶先運行,并提走全部原有流動性。因此導致市場上發生了一場機器人對機器人的斗爭:

由于初始發布時的流動性很低,有機器人將 100 ETH 投入一個僅有 1 到 2 個 ETH 的流動性池中。設置很高的滑點,最終被其他機器人耗盡了全部的 ETH,是一個高滑點、低流動性的案例。

fees.wtf 團隊希望用戶沒有受到影響,一起仍按原計劃進行,團隊正在增加流動性。[2022/1/14 8:48:44]

攻擊函數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:INTNFTWTFLUCKMintWayNFT-StarterWTF幣LUCKYDOGE

芝麻開門交易所下載
RAK:淺談以太坊如何使用「社會削減」來抵抗審查和中心化_kraken官網地址

以太坊需要遵守OFAC的規定嗎?以太坊被認為是所有加密貨幣中最去中心化的Layer1區塊鏈。然而,美國財政部海外資產控制辦公室最近的進展可能會破壞以太坊抗審查的完整性.

1900/1/1 0:00:00
UST:FTX不是第一個也不會是最后一個 加密史上6大暴雷事件盤點_比特幣

11月12日,AutismCapital發推表示,FTX內部人士很有可能正在試圖攜款潛逃,被轉移的金額約為3.8億美元,看起來好像是黑客攻擊,但也有可能是內部人士.

1900/1/1 0:00:00
SOL:深陷 FTX 窘境后 Solana 生態面對哪些內憂外患?_LANA

相比去年巔峰時刻的風光無兩,今年Solana于11月3日至7日在里斯本舉辦的第二屆Breakpoint峰會則低調許多.

1900/1/1 0:00:00
USD:Circle CEO:盡管FTX破產但加密用例依然強勁_PUSD幣

金色財經報道,穩定幣USDC發行方Circle首席執行官JeremyAllaire在接受雅虎財經最新采訪時表示,從2008年金融危機中脫穎而出的基于區塊鏈的去中心化系統仍在繼續其用例.

1900/1/1 0:00:00
WEB3:探索AIGC和Web3游戲的結合點:如何用AI講述Web3游戲的故事?_WEB

原文:《探索AIGC和Web3游戲的結合點》 作者:隔夜的粥 近期人工智能生成內容爆火的背景下,Crypto市場顯得頗有些涼意,于是便有了如下的一張meme圖: 暫且不論這種趨勢是否會持續.

1900/1/1 0:00:00
MINE:論挖礦收益在過去幾個月內的縮減情況_比特幣

盡管我們正處于熊市之中,但比特幣礦企仍在通過大規模增發股票1的方式來提高2其自身算力。算力的提升也導致比特幣網絡難度在最近出現了多次的正向調整,目前處于歷史高位.

1900/1/1 0:00:00
ads