游戲skr而止,漏洞周而復(fù)始 | 成都鏈安漏洞分析連載第六期 —— 游戲合約漏洞全面匯總區(qū)塊鏈

成都鏈安科技 2018-08-24 09:51
分享到:
導(dǎo)讀

引子:故紙堆里尋惑源,多少舊事屢重演——無名

針對(duì)區(qū)塊鏈安全問題,成都鏈安科技團(tuán)隊(duì)每一周都將出智能合約安全漏洞解析連載,希望能幫助程序員寫出更加安全牢固的合約,防患于未然。

引子:故紙堆里尋惑源,多少舊事屢重演 —— 無名

上回說到

      地址恢復(fù)功虧一簣,

      身份判斷輕慮淺謀。

      邏輯補(bǔ)全自圓其說,

      原理辨析帷幄運(yùn)籌。

本回

      區(qū)塊鏈游戲江山如畫,

      安全防護(hù)未規(guī)劃,

      一片殘陽(yáng)西掛。

區(qū)塊鏈行業(yè)日新月異,發(fā)展迅猛,各個(gè)公鏈及項(xiàng)目方奇思妙想層出不窮。俗話說,玩是人的天性,將數(shù)字貨幣與游戲結(jié)合,運(yùn)用游戲的機(jī)制吸引投資者參與到互動(dòng)中來的想法以標(biāo)新立異、推陳出新的姿態(tài)引領(lǐng)了最近的潮流。各種區(qū)塊鏈游戲聚集大量的虛擬貨幣,價(jià)值動(dòng)輒上千萬,承諾下的豐厚回抱吸引了越來越多的目光,投資者們躍躍欲試,人人都想充當(dāng)“頭號(hào)玩家”。

2.png

但是,缺少一套完整的、經(jīng)過驗(yàn)證的SDK庫(kù)是當(dāng)下區(qū)塊鏈游戲的一個(gè)痛點(diǎn)。各游戲方大都自食其力,獨(dú)立開發(fā)游戲智能合約。比代幣合約更加復(fù)雜的開發(fā)過程使得安全隱患不可避免的出現(xiàn),這些漏洞一旦被攻擊者或者項(xiàng)目方本身利用,受害的總會(huì)是玩家,可謂是,興,百姓苦,亡,百姓苦。

成都鏈安科技對(duì)目前已經(jīng)爆發(fā)的區(qū)塊鏈游戲合約事件進(jìn)行了歸納整理,分析目前游戲存在以下兩個(gè)方面的問題:

一、代碼層面的安全問題

目前代碼層面的安全問題在游戲中的表現(xiàn)幾乎與之前的代幣合約如出一轍,但是包裹了鮮亮外衣之后,內(nèi)部的代碼結(jié)構(gòu)嚴(yán)謹(jǐn)度依然差強(qiáng)人意,加上游戲機(jī)制的部分功能,有些合約代碼甚至更加混亂。好比建造一棟樓房,基本結(jié)構(gòu)沒有搭建好,上梁不正下梁歪,增加更多的樓層與附屬結(jié)構(gòu)反而使得樓房的轟然倒塌更加迅速。

3.png

漏洞歸類與修復(fù)建議

1、以溢出為代表的代碼安全漏洞

數(shù)學(xué)運(yùn)算溢出在智能合約中是個(gè)比較大的安全隱患。無論是以太坊還是EOS,一個(gè)整型變量只能有一定范圍的數(shù)字表示。例如,一個(gè) uint8 ,只能存儲(chǔ)在范圍[0,255] 的數(shù)字。試圖存儲(chǔ) 256 到一個(gè) uint8 將變成0。不加注意的話,只要沒有檢查用戶輸入又執(zhí)行計(jì)算,導(dǎo)致數(shù)字超出存儲(chǔ)它們的數(shù)據(jù)類型允許的范圍,就會(huì)產(chǎn)生溢出,并可以被用來組織攻擊。 此部分的具體原理在我們之前第一期,溢出漏洞全面分析中已經(jīng)重點(diǎn)介紹過,沒看過的請(qǐng)戳下面的鏈接:一夜回到解放前?溢出漏洞類型全面分析 | 鏈安團(tuán)隊(duì)漏洞分析連載第一期 —— 溢出漏洞

下面我們來看游戲合約案例:

代表游戲:狼人游戲  

平臺(tái):EOS

4.png

從游戲網(wǎng)站上,可以很明顯的看到,該合約執(zhí)行發(fā)生了溢出,導(dǎo)致獎(jiǎng)金池總額變?yōu)橐粋€(gè)極大的負(fù)值,并且由于項(xiàng)目方應(yīng)對(duì)措施不當(dāng),導(dǎo)致獎(jiǎng)池獎(jiǎng)金被盜取,普通玩家血本無歸[1]。

修復(fù)建議

該游戲有三個(gè)問題需要大家引起注意:

一、代碼開源問題,狼人游戲項(xiàng)目方并未公布合約源代碼,玩家在參與游戲之前無法對(duì)  項(xiàng)目安全性進(jìn)行評(píng)估,自己的資產(chǎn)無法得到保障;

二、狼人游戲項(xiàng)目方要求用戶提供的過大的權(quán)限,導(dǎo)致其有能力在用戶未提供私鑰的情況下,在后臺(tái)修改權(quán)限,并轉(zhuǎn)出用戶的EOS;

三、對(duì)安全事件的應(yīng)急響應(yīng),狼人游戲項(xiàng)目方未凍結(jié)攻擊者賬戶,導(dǎo)致攻擊者在升級(jí)后的版本中提出了6萬多EOS。

在此處,成都鏈安科技建議廣大游戲項(xiàng)目方應(yīng)在游戲合約的設(shè)計(jì)中引入安全控制機(jī)制,包括惡意賬戶凍結(jié)、暫停交易等,為游戲安全建立最后一道防線。

2、以owner權(quán)限盜取為代表的函數(shù)調(diào)用權(quán)限問題

此類漏洞的形成原因?yàn)闃?gòu)造函數(shù)失配或者修改owner的函數(shù)未添加調(diào)用者檢查。智能合約的構(gòu)造函數(shù)一般擔(dān)負(fù)著合約初始化以及owner地址綁定的功能,如果構(gòu)造函數(shù)聲明方式不正確,那么,其會(huì)變成一個(gè)普通函數(shù),任何人都可以調(diào)用他,并將自己設(shè)置為合約管理者。修改owner的函數(shù)用于將新地址設(shè)置為owner,此類函數(shù)需要檢查調(diào)用者地址,如果確少該檢查,那么任何人都能夠?qū)⒆约鹤優(yōu)楹霞s的管理者。

這與我們?cè)陂_始連載之前的owner權(quán)限漏洞分析中的構(gòu)造函數(shù)問題如出一轍,需要了解請(qǐng)由以下鏈接傳送:注意!3份合約又存在Owner權(quán)限被盜問題——低級(jí)錯(cuò)誤不容忽視

直接進(jìn)入案例分析:

代表游戲:Ether Cartel

平臺(tái):以太坊

5.png

游戲的構(gòu)造函數(shù)(DrugDealer)和合約名(EtherCartel)不一致,存在構(gòu)造函數(shù)失配漏洞,導(dǎo)致DrugDealer變成一個(gè)普通的函數(shù),任何人都能夠調(diào)用該函數(shù)變成合約的ceoAddress,并且,根據(jù)后面的代碼邏輯,他可以收取原本應(yīng)該打入合約部署者的ETH[2]。

6.png

修復(fù)建議

為了避免此類漏洞,開發(fā)者在開發(fā)游戲合約時(shí)需要足夠謹(jǐn)慎,并進(jìn)行詳盡的測(cè)試。構(gòu)造函數(shù)僅在合約部署時(shí)執(zhí)行一次,當(dāng)出現(xiàn)合約部署后owner仍為0地址,并且用戶可以調(diào)用實(shí)現(xiàn)構(gòu)造函數(shù)功能的函數(shù),那么,合約就存在構(gòu)造函數(shù)失配的漏洞,開發(fā)者需要檢查并修復(fù)構(gòu)造函數(shù)實(shí)現(xiàn)。

3、“隨機(jī)數(shù)生成”等區(qū)塊鏈平臺(tái)短板

截止至目前,以太坊和EOS官方均未提供隨機(jī)數(shù)接口,這對(duì)游戲開發(fā)確實(shí)是一個(gè)不利的影響,比如抽獎(jiǎng)模塊的開發(fā)。為了實(shí)現(xiàn)類似的功能,游戲開發(fā)者往往需要自己編寫隨機(jī)數(shù)生成函數(shù),這些函數(shù)往往利用區(qū)塊信息作為參數(shù),然后進(jìn)行一系列運(yùn)算,獲得一個(gè)“隨機(jī)數(shù)”。但是,由于使用區(qū)塊信息作為參數(shù),這將導(dǎo)致在同一個(gè)區(qū)塊上,使用相同算法的隨機(jī)數(shù)函數(shù)將會(huì)得到相同的值,攻擊者可以利用這點(diǎn),部署中間合約,然后不停的嘗試生成隨機(jī)數(shù),當(dāng)生成滿意的隨機(jī)數(shù)時(shí),再利用中間合約參與游戲,獲得較大優(yōu)勢(shì)。

此外,區(qū)塊鏈作為一個(gè)全球分布式的計(jì)算機(jī),其資源目前是比較有限的,鏈的開發(fā)者為了保障鏈平臺(tái)的穩(wěn)定性,對(duì)鏈上的智能合約的運(yùn)做出了限制,防止死循環(huán)等消耗資源的操作,比如,運(yùn)行g(shù)as限制(以太坊)、CPU/內(nèi)存資源限制(EOS),這使得鏈上游戲開發(fā)者需要比傳統(tǒng)的中心化服務(wù)器游戲付出更大的努力,對(duì)游戲的邏輯進(jìn)行優(yōu)化,確保邏輯正確的合約不會(huì)因?yàn)橘Y源限制問題而無法運(yùn)行。

隨機(jī)數(shù)問題我們?cè)谥暗目煊?nbsp;智能合約隨機(jī)數(shù)算法漏洞影響游戲公平性 已經(jīng)提及過,這次我們根據(jù)案例進(jìn)行一下具體分析:

代表游戲:FoMo3D long

平臺(tái):以太坊

7.png

該合約空投函數(shù)的隨機(jī)數(shù)生成使用的區(qū)塊參數(shù)依次為block.timestamp(當(dāng)前區(qū)塊時(shí)間戳)、block.difficulty (當(dāng)前區(qū)塊難度)、 block.coinbase(挖出當(dāng)前區(qū)塊的礦工地址)、block.gaslimit(當(dāng)前區(qū)塊 gas 限額)、block.number (當(dāng)前區(qū)塊號(hào)),結(jié)合msg.sender (玩家地址),計(jì)算出玩家是否獲得空投獎(jiǎng)勵(lì),攻擊者可以部署中間合約,預(yù)先計(jì)算出在當(dāng)前塊進(jìn)入游戲是否能夠獲得空投,然后在結(jié)果為true的時(shí)候參與游戲,就必然能夠獲得空投,并以此牟利。

修復(fù)建議

針對(duì)隨機(jī)數(shù)問題,目前有幾點(diǎn)建議:

一、可以嘗試官方推薦的隨機(jī)數(shù)生成方式,比如以太坊的Solidity官方文檔推薦用戶使用鏈外的Oraclize庫(kù)生成隨機(jī)數(shù);

二、杜絕中間合約參與游戲,以太坊開發(fā)者需要注意,使用以太坊平臺(tái)提供的    extcodesize函數(shù)并不能完全判斷某個(gè)地址是否為合約,因?yàn)楹霞s在部署的時(shí)候,其extcodesize為0,但是可以在構(gòu)造函數(shù)與其他合約進(jìn)行交互,從而參與游戲,可以使用tx.origin==msg.sender的方式判斷。

4.  利用競(jìng)態(tài)條件機(jī)制發(fā)起的攻擊

目前有些類似博彩的游戲合約似乎更加受到歡迎,此類游戲合約有一個(gè)共同的特點(diǎn)——時(shí)間依賴。它們都是在一定時(shí)間段內(nèi)與用戶進(jìn)行互動(dòng),時(shí)間截止之后宣布獲獎(jiǎng)?wù)呙麊巍_@樣取決于時(shí)間點(diǎn)的游戲留下的隱患是:攻擊者可以將整個(gè)區(qū)塊“塞滿”交易,使得特定的交易無法進(jìn)行。 攻擊者會(huì)使用高昂的gas使其成為整個(gè)區(qū)塊中唯一一個(gè)交易進(jìn)行者。

案例分析:

代表游戲:Exitscam/FoMo3D

平臺(tái):以太坊

8.png

以太坊版的FoMo3D規(guī)則類似于透明“金字塔騙局

一、每一局持續(xù)固定的時(shí)間

二、如果你是最后一個(gè)向獎(jiǎng)池中投注的人,你拿走頭獎(jiǎng)(獎(jiǎng)池總獎(jiǎng)金的90%)

三、如果有人在你之后投注,你會(huì)獲得一定的分紅。目前,分紅金額低于投入ETH的1%

四、每0.005 ETH會(huì)給結(jié)算時(shí)間增加30秒,也就是2個(gè)區(qū)塊,但每次增加上限為24小時(shí)

利用競(jìng)態(tài)條件的概念,贏得此游戲,獲得頭獎(jiǎng)的策略很簡(jiǎn)單:當(dāng)?shù)褂?jì)時(shí)即將結(jié)束,趨近于0時(shí),向獎(jiǎng)池投注ETH,“買“下之后的每一個(gè)區(qū)塊直至倒計(jì)時(shí)結(jié)束,保證沒有人能夠在你之后投注。如果這個(gè)操作實(shí)現(xiàn),你將獲得頭獎(jiǎng)[3]。

這個(gè)游戲的機(jī)制漏洞幾乎與之前提到的交易順序依賴(TOD)異曲同工,競(jìng)態(tài)條件我們?cè)诘谌谶B載分析中也有描述,鏈接如下:彎道超車?yán)纤緳C(jī)戲耍智能合約 | 成都鏈安漏洞分析連載第三期 —— 競(jìng)態(tài)條件漏洞。

修復(fù)建議

游戲開發(fā)者需要熟悉重入和交易順序依賴兩種類型的競(jìng)態(tài)條件漏洞,類似的游戲機(jī)制如若可以利用相似的概念被投機(jī)取巧,應(yīng)當(dāng)改變?cè)O(shè)計(jì)思路,兼顧設(shè)計(jì)初衷與安全保障。

二、游戲本身可信度問題

雖然區(qū)塊鏈上所有的交易都是公開透明的,但這不代表游戲項(xiàng)目方在合約開發(fā)的過程中不能留有后門。尤其是尚未公布源碼的游戲合約,其中可以暗藏一個(gè)函數(shù),開發(fā)者只要調(diào)用這個(gè)函數(shù)就能卷走所有的貨幣。而目前尚未出現(xiàn)一款可靠的反編譯器,對(duì)字節(jié)碼進(jìn)行反編譯后,使其源碼真正公開透明。

如果還拿建造樓房做比喻的話,可以理解成在建造的時(shí)候就設(shè)計(jì)成歪的,一直住在其中的用戶卻并沒有察覺。

9.png

事件回顧

代表游戲名稱:Power of Bubble

平臺(tái):以太坊

10.png

從4月7日到4月8日早上10點(diǎn),游戲項(xiàng)目方在Discord各頻道開始了瘋狂的宣傳,利用精美的外形設(shè)計(jì)和豐厚的獎(jiǎng)勵(lì)承諾牢牢吸引了大批的粉絲翹首以盼。8日早上10點(diǎn)開服后10分鐘內(nèi),合約內(nèi)資產(chǎn)已超過200ETH,但是隨著時(shí)間的推移,玩家們開始發(fā)現(xiàn)討論群消失了,游戲內(nèi)的出售以及提取操作也無法完成。最后,獎(jiǎng)金池中227個(gè)以太在眾目睽睽之下被合約創(chuàng)建者轉(zhuǎn)走[4]。

11.png

區(qū)塊鏈游戲往往需要各種虛擬貨幣作為游戲資產(chǎn),整個(gè)游戲中所有涉及到虛擬貨幣持有、分配的合約都應(yīng)當(dāng)開源,供玩家和審計(jì)方審核,確保沒有潛在后門。同時(shí)玩家也應(yīng)該提高警惕,在將自己資產(chǎn)投入一份源碼未知,未經(jīng)審計(jì)的區(qū)塊鏈游戲時(shí),要做到理性投資。

路漫漫其修遠(yuǎn)兮

將區(qū)塊鏈技術(shù)應(yīng)用到游戲上,其發(fā)展時(shí)長(zhǎng)其實(shí)并不比區(qū)塊鏈貨幣交易短很多。區(qū)塊鏈游戲到目前為止已經(jīng)可以劃分為3個(gè)時(shí)代,從1.0時(shí)代的《加密貓》,到2.0時(shí)代的《以太水滸》,都屬于收集玩法為主的區(qū)塊鏈游戲時(shí)代。

目前的3.0時(shí)代是鏈上加鏈下多種玩法結(jié)合的時(shí)代,但是在眾多RPG區(qū)塊鏈游戲興起的同時(shí),龐氏騙局型區(qū)塊鏈游戲也開始興風(fēng)作浪,這類游戲的交易屬性較重,而且往往缺乏長(zhǎng)期的游戲?qū)傩浴U雇?.0時(shí)代,區(qū)塊鏈游戲應(yīng)當(dāng)更加注重于其游戲性,也就是說在玩法上更加接近傳統(tǒng)游戲。

但是與傳統(tǒng)游戲相比,區(qū)塊鏈游戲在三個(gè)方面有較大優(yōu)勢(shì)[5]:

一、賬號(hào)安全:

玩家的登錄信息加密過后被儲(chǔ)存在錢包內(nèi),安全性相較于傳統(tǒng)登錄模式有較大提升。

二、服務(wù)器:

服務(wù)器安置在區(qū)塊鏈上,即使游戲運(yùn)營(yíng)方停止其官方服務(wù)器,玩家也能繼續(xù)享受游戲。

三、公平性:

由于游戲內(nèi)信息公開透明,并且可追溯,濫發(fā),更改道具的行為將更容易被識(shí)別,進(jìn)而大幅下降。

然而,基于以太坊開發(fā)與傳統(tǒng)游戲機(jī)制相同的仍然存在許多劣勢(shì):

一、以太坊的吞吐量限制了游戲玩家的數(shù)量和增長(zhǎng)速度

二、鑒于目前以太坊交易速度的限制,很多游戲沒有辦法像傳統(tǒng)游戲一樣做到低延遲和實(shí)時(shí)互動(dòng)

三、每筆交易需要手續(xù)費(fèi)對(duì)游戲內(nèi)的交易增加了負(fù)擔(dān)

目前,更多公鏈和資本介入?yún)^(qū)塊鏈游戲的開發(fā),目的是為其研發(fā)新的模式技術(shù)奠定更堅(jiān)實(shí)的基礎(chǔ),或許再過不久,會(huì)有專門為游戲而生的公鏈出現(xiàn),給區(qū)塊鏈游戲一個(gè)專屬的舞臺(tái)。同時(shí),開發(fā)者們已經(jīng)把重心轉(zhuǎn)移到多玩法的方向,試圖弱化交易屬性、減少龐氏騙局類型游戲,將區(qū)塊鏈的技術(shù)優(yōu)勢(shì)附加到已經(jīng)很成熟的傳統(tǒng)游戲市場(chǎng),為游戲產(chǎn)業(yè)帶來一個(gè)新的紀(jì)元。

但無論是以交易屬性為主還是以游戲性為主的區(qū)塊鏈游戲,都離不開智能合約的編寫和審計(jì)。所以重中之重還是要在發(fā)展的同時(shí),保證合約安全屬性的驗(yàn)證,對(duì)于上述問題游戲合約,對(duì)照之前的漏洞分析不難發(fā)現(xiàn),很多項(xiàng)目方依然在重蹈覆轍,對(duì)于異常明顯的常規(guī)漏洞沒有采取補(bǔ)救或者防護(hù)的措施,帶給玩家巨大的經(jīng)濟(jì)損失,也給區(qū)塊鏈游戲的天空平添一抹陰霾。 保證合約的質(zhì)量,讓區(qū)塊鏈游戲快速走出混沌期,每一個(gè)項(xiàng)目方和開發(fā)者責(zé)無旁貸。

游戲 合約 區(qū)塊 玩家 漏洞
分享到:

1.TMT觀察網(wǎng)遵循行業(yè)規(guī)范,任何轉(zhuǎn)載的稿件都會(huì)明確標(biāo)注作者和來源;
2.TMT觀察網(wǎng)的原創(chuàng)文章,請(qǐng)轉(zhuǎn)載時(shí)務(wù)必注明文章作者和"來源:TMT觀察網(wǎng)",不尊重原創(chuàng)的行為TMT觀察網(wǎng)或?qū)⒆肪控?zé)任;
3.作者投稿可能會(huì)經(jīng)TMT觀察網(wǎng)編輯修改或補(bǔ)充。


專題報(bào)道