游戲skr而止,漏洞周而復始 | 成都鏈安漏洞分析連載第六期 —— 游戲合約漏洞全面匯總區(qū)塊鏈
引子:故紙堆里尋惑源,多少舊事屢重演——無名
針對區(qū)塊鏈安全問題,成都鏈安科技團隊每一周都將出智能合約安全漏洞解析連載,希望能幫助程序員寫出更加安全牢固的合約,防患于未然。
引子:故紙堆里尋惑源,多少舊事屢重演 —— 無名
上回說到
地址恢復功虧一簣,
身份判斷輕慮淺謀。
邏輯補全自圓其說,
原理辨析帷幄運籌。
本回
區(qū)塊鏈游戲江山如畫,
安全防護未規(guī)劃,
一片殘陽西掛。
區(qū)塊鏈行業(yè)日新月異,發(fā)展迅猛,各個公鏈及項目方奇思妙想層出不窮。俗話說,玩是人的天性,將數(shù)字貨幣與游戲結(jié)合,運用游戲的機制吸引投資者參與到互動中來的想法以標新立異、推陳出新的姿態(tài)引領了最近的潮流。各種區(qū)塊鏈游戲聚集大量的虛擬貨幣,價值動輒上千萬,承諾下的豐厚回抱吸引了越來越多的目光,投資者們躍躍欲試,人人都想充當“頭號玩家”。
但是,缺少一套完整的、經(jīng)過驗證的SDK庫是當下區(qū)塊鏈游戲的一個痛點。各游戲方大都自食其力,獨立開發(fā)游戲智能合約。比代幣合約更加復雜的開發(fā)過程使得安全隱患不可避免的出現(xiàn),這些漏洞一旦被攻擊者或者項目方本身利用,受害的總會是玩家,可謂是,興,百姓苦,亡,百姓苦。
成都鏈安科技對目前已經(jīng)爆發(fā)的區(qū)塊鏈游戲合約事件進行了歸納整理,分析目前游戲存在以下兩個方面的問題:
一、代碼層面的安全問題
目前代碼層面的安全問題在游戲中的表現(xiàn)幾乎與之前的代幣合約如出一轍,但是包裹了鮮亮外衣之后,內(nèi)部的代碼結(jié)構(gòu)嚴謹度依然差強人意,加上游戲機制的部分功能,有些合約代碼甚至更加混亂。好比建造一棟樓房,基本結(jié)構(gòu)沒有搭建好,上梁不正下梁歪,增加更多的樓層與附屬結(jié)構(gòu)反而使得樓房的轟然倒塌更加迅速。
漏洞歸類與修復建議
1、以溢出為代表的代碼安全漏洞
數(shù)學運算溢出在智能合約中是個比較大的安全隱患。無論是以太坊還是EOS,一個整型變量只能有一定范圍的數(shù)字表示。例如,一個 uint8 ,只能存儲在范圍[0,255] 的數(shù)字。試圖存儲 256 到一個 uint8 將變成0。不加注意的話,只要沒有檢查用戶輸入又執(zhí)行計算,導致數(shù)字超出存儲它們的數(shù)據(jù)類型允許的范圍,就會產(chǎn)生溢出,并可以被用來組織攻擊。 此部分的具體原理在我們之前第一期,溢出漏洞全面分析中已經(jīng)重點介紹過,沒看過的請戳下面的鏈接:一夜回到解放前?溢出漏洞類型全面分析 | 鏈安團隊漏洞分析連載第一期 —— 溢出漏洞
下面我們來看游戲合約案例:
代表游戲:狼人游戲
平臺:EOS
從游戲網(wǎng)站上,可以很明顯的看到,該合約執(zhí)行發(fā)生了溢出,導致獎金池總額變?yōu)橐粋€極大的負值,并且由于項目方應對措施不當,導致獎池獎金被盜取,普通玩家血本無歸[1]。
修復建議
該游戲有三個問題需要大家引起注意:
一、代碼開源問題,狼人游戲項目方并未公布合約源代碼,玩家在參與游戲之前無法對 項目安全性進行評估,自己的資產(chǎn)無法得到保障;
二、狼人游戲項目方要求用戶提供的過大的權限,導致其有能力在用戶未提供私鑰的情況下,在后臺修改權限,并轉(zhuǎn)出用戶的EOS;
三、對安全事件的應急響應,狼人游戲項目方未凍結(jié)攻擊者賬戶,導致攻擊者在升級后的版本中提出了6萬多EOS。
在此處,成都鏈安科技建議廣大游戲項目方應在游戲合約的設計中引入安全控制機制,包括惡意賬戶凍結(jié)、暫停交易等,為游戲安全建立最后一道防線。
2、以owner權限盜取為代表的函數(shù)調(diào)用權限問題
此類漏洞的形成原因為構(gòu)造函數(shù)失配或者修改owner的函數(shù)未添加調(diào)用者檢查。智能合約的構(gòu)造函數(shù)一般擔負著合約初始化以及owner地址綁定的功能,如果構(gòu)造函數(shù)聲明方式不正確,那么,其會變成一個普通函數(shù),任何人都可以調(diào)用他,并將自己設置為合約管理者。修改owner的函數(shù)用于將新地址設置為owner,此類函數(shù)需要檢查調(diào)用者地址,如果確少該檢查,那么任何人都能夠?qū)⒆约鹤優(yōu)楹霞s的管理者。
這與我們在開始連載之前的owner權限漏洞分析中的構(gòu)造函數(shù)問題如出一轍,需要了解請由以下鏈接傳送:注意!3份合約又存在Owner權限被盜問題——低級錯誤不容忽視
直接進入案例分析:
代表游戲:Ether Cartel
平臺:以太坊
游戲的構(gòu)造函數(shù)(DrugDealer)和合約名(EtherCartel)不一致,存在構(gòu)造函數(shù)失配漏洞,導致DrugDealer變成一個普通的函數(shù),任何人都能夠調(diào)用該函數(shù)變成合約的ceoAddress,并且,根據(jù)后面的代碼邏輯,他可以收取原本應該打入合約部署者的ETH[2]。
修復建議
為了避免此類漏洞,開發(fā)者在開發(fā)游戲合約時需要足夠謹慎,并進行詳盡的測試。構(gòu)造函數(shù)僅在合約部署時執(zhí)行一次,當出現(xiàn)合約部署后owner仍為0地址,并且用戶可以調(diào)用實現(xiàn)構(gòu)造函數(shù)功能的函數(shù),那么,合約就存在構(gòu)造函數(shù)失配的漏洞,開發(fā)者需要檢查并修復構(gòu)造函數(shù)實現(xiàn)。
3、“隨機數(shù)生成”等區(qū)塊鏈平臺短板
截止至目前,以太坊和EOS官方均未提供隨機數(shù)接口,這對游戲開發(fā)確實是一個不利的影響,比如抽獎模塊的開發(fā)。為了實現(xiàn)類似的功能,游戲開發(fā)者往往需要自己編寫隨機數(shù)生成函數(shù),這些函數(shù)往往利用區(qū)塊信息作為參數(shù),然后進行一系列運算,獲得一個“隨機數(shù)”。但是,由于使用區(qū)塊信息作為參數(shù),這將導致在同一個區(qū)塊上,使用相同算法的隨機數(shù)函數(shù)將會得到相同的值,攻擊者可以利用這點,部署中間合約,然后不停的嘗試生成隨機數(shù),當生成滿意的隨機數(shù)時,再利用中間合約參與游戲,獲得較大優(yōu)勢。
此外,區(qū)塊鏈作為一個全球分布式的計算機,其資源目前是比較有限的,鏈的開發(fā)者為了保障鏈平臺的穩(wěn)定性,對鏈上的智能合約的運做出了限制,防止死循環(huán)等消耗資源的操作,比如,運行gas限制(以太坊)、CPU/內(nèi)存資源限制(EOS),這使得鏈上游戲開發(fā)者需要比傳統(tǒng)的中心化服務器游戲付出更大的努力,對游戲的邏輯進行優(yōu)化,確保邏輯正確的合約不會因為資源限制問題而無法運行。
隨機數(shù)問題我們在之前的快訊 智能合約隨機數(shù)算法漏洞影響游戲公平性 已經(jīng)提及過,這次我們根據(jù)案例進行一下具體分析:
代表游戲:FoMo3D long
平臺:以太坊
該合約空投函數(shù)的隨機數(shù)生成使用的區(qū)塊參數(shù)依次為block.timestamp(當前區(qū)塊時間戳)、block.difficulty (當前區(qū)塊難度)、 block.coinbase(挖出當前區(qū)塊的礦工地址)、block.gaslimit(當前區(qū)塊 gas 限額)、block.number (當前區(qū)塊號),結(jié)合msg.sender (玩家地址),計算出玩家是否獲得空投獎勵,攻擊者可以部署中間合約,預先計算出在當前塊進入游戲是否能夠獲得空投,然后在結(jié)果為true的時候參與游戲,就必然能夠獲得空投,并以此牟利。
修復建議
針對隨機數(shù)問題,目前有幾點建議:
一、可以嘗試官方推薦的隨機數(shù)生成方式,比如以太坊的Solidity官方文檔推薦用戶使用鏈外的Oraclize庫生成隨機數(shù);
二、杜絕中間合約參與游戲,以太坊開發(fā)者需要注意,使用以太坊平臺提供的 extcodesize函數(shù)并不能完全判斷某個地址是否為合約,因為合約在部署的時候,其extcodesize為0,但是可以在構(gòu)造函數(shù)與其他合約進行交互,從而參與游戲,可以使用tx.origin==msg.sender的方式判斷。
4. 利用競態(tài)條件機制發(fā)起的攻擊
目前有些類似博彩的游戲合約似乎更加受到歡迎,此類游戲合約有一個共同的特點——時間依賴。它們都是在一定時間段內(nèi)與用戶進行互動,時間截止之后宣布獲獎者名單。這樣取決于時間點的游戲留下的隱患是:攻擊者可以將整個區(qū)塊“塞滿”交易,使得特定的交易無法進行。 攻擊者會使用高昂的gas使其成為整個區(qū)塊中唯一一個交易進行者。
案例分析:
代表游戲:Exitscam/FoMo3D
平臺:以太坊
以太坊版的FoMo3D規(guī)則類似于透明“金字塔騙局
一、每一局持續(xù)固定的時間
二、如果你是最后一個向獎池中投注的人,你拿走頭獎(獎池總獎金的90%)
三、如果有人在你之后投注,你會獲得一定的分紅。目前,分紅金額低于投入ETH的1%
四、每0.005 ETH會給結(jié)算時間增加30秒,也就是2個區(qū)塊,但每次增加上限為24小時
利用競態(tài)條件的概念,贏得此游戲,獲得頭獎的策略很簡單:當?shù)褂嫊r即將結(jié)束,趨近于0時,向獎池投注ETH,“買“下之后的每一個區(qū)塊直至倒計時結(jié)束,保證沒有人能夠在你之后投注。如果這個操作實現(xiàn),你將獲得頭獎[3]。
這個游戲的機制漏洞幾乎與之前提到的交易順序依賴(TOD)異曲同工,競態(tài)條件我們在第三期連載分析中也有描述,鏈接如下:彎道超車老司機戲耍智能合約 | 成都鏈安漏洞分析連載第三期 —— 競態(tài)條件漏洞。
修復建議
游戲開發(fā)者需要熟悉重入和交易順序依賴兩種類型的競態(tài)條件漏洞,類似的游戲機制如若可以利用相似的概念被投機取巧,應當改變設計思路,兼顧設計初衷與安全保障。
二、游戲本身可信度問題
雖然區(qū)塊鏈上所有的交易都是公開透明的,但這不代表游戲項目方在合約開發(fā)的過程中不能留有后門。尤其是尚未公布源碼的游戲合約,其中可以暗藏一個函數(shù),開發(fā)者只要調(diào)用這個函數(shù)就能卷走所有的貨幣。而目前尚未出現(xiàn)一款可靠的反編譯器,對字節(jié)碼進行反編譯后,使其源碼真正公開透明。
如果還拿建造樓房做比喻的話,可以理解成在建造的時候就設計成歪的,一直住在其中的用戶卻并沒有察覺。
事件回顧
代表游戲名稱:Power of Bubble
平臺:以太坊
從4月7日到4月8日早上10點,游戲項目方在Discord各頻道開始了瘋狂的宣傳,利用精美的外形設計和豐厚的獎勵承諾牢牢吸引了大批的粉絲翹首以盼。8日早上10點開服后10分鐘內(nèi),合約內(nèi)資產(chǎn)已超過200ETH,但是隨著時間的推移,玩家們開始發(fā)現(xiàn)討論群消失了,游戲內(nèi)的出售以及提取操作也無法完成。最后,獎金池中227個以太在眾目睽睽之下被合約創(chuàng)建者轉(zhuǎn)走[4]。
區(qū)塊鏈游戲往往需要各種虛擬貨幣作為游戲資產(chǎn),整個游戲中所有涉及到虛擬貨幣持有、分配的合約都應當開源,供玩家和審計方審核,確保沒有潛在后門。同時玩家也應該提高警惕,在將自己資產(chǎn)投入一份源碼未知,未經(jīng)審計的區(qū)塊鏈游戲時,要做到理性投資。
路漫漫其修遠兮
將區(qū)塊鏈技術應用到游戲上,其發(fā)展時長其實并不比區(qū)塊鏈貨幣交易短很多。區(qū)塊鏈游戲到目前為止已經(jīng)可以劃分為3個時代,從1.0時代的《加密貓》,到2.0時代的《以太水滸》,都屬于收集玩法為主的區(qū)塊鏈游戲時代。
目前的3.0時代是鏈上加鏈下多種玩法結(jié)合的時代,但是在眾多RPG區(qū)塊鏈游戲興起的同時,龐氏騙局型區(qū)塊鏈游戲也開始興風作浪,這類游戲的交易屬性較重,而且往往缺乏長期的游戲?qū)傩浴U雇?.0時代,區(qū)塊鏈游戲應當更加注重于其游戲性,也就是說在玩法上更加接近傳統(tǒng)游戲。
但是與傳統(tǒng)游戲相比,區(qū)塊鏈游戲在三個方面有較大優(yōu)勢[5]:
一、賬號安全:
玩家的登錄信息加密過后被儲存在錢包內(nèi),安全性相較于傳統(tǒng)登錄模式有較大提升。
二、服務器:
服務器安置在區(qū)塊鏈上,即使游戲運營方停止其官方服務器,玩家也能繼續(xù)享受游戲。
三、公平性:
由于游戲內(nèi)信息公開透明,并且可追溯,濫發(fā),更改道具的行為將更容易被識別,進而大幅下降。
然而,基于以太坊開發(fā)與傳統(tǒng)游戲機制相同的仍然存在許多劣勢:
一、以太坊的吞吐量限制了游戲玩家的數(shù)量和增長速度
二、鑒于目前以太坊交易速度的限制,很多游戲沒有辦法像傳統(tǒng)游戲一樣做到低延遲和實時互動
三、每筆交易需要手續(xù)費對游戲內(nèi)的交易增加了負擔
目前,更多公鏈和資本介入?yún)^(qū)塊鏈游戲的開發(fā),目的是為其研發(fā)新的模式技術奠定更堅實的基礎,或許再過不久,會有專門為游戲而生的公鏈出現(xiàn),給區(qū)塊鏈游戲一個專屬的舞臺。同時,開發(fā)者們已經(jīng)把重心轉(zhuǎn)移到多玩法的方向,試圖弱化交易屬性、減少龐氏騙局類型游戲,將區(qū)塊鏈的技術優(yōu)勢附加到已經(jīng)很成熟的傳統(tǒng)游戲市場,為游戲產(chǎn)業(yè)帶來一個新的紀元。
但無論是以交易屬性為主還是以游戲性為主的區(qū)塊鏈游戲,都離不開智能合約的編寫和審計。所以重中之重還是要在發(fā)展的同時,保證合約安全屬性的驗證,對于上述問題游戲合約,對照之前的漏洞分析不難發(fā)現(xiàn),很多項目方依然在重蹈覆轍,對于異常明顯的常規(guī)漏洞沒有采取補救或者防護的措施,帶給玩家巨大的經(jīng)濟損失,也給區(qū)塊鏈游戲的天空平添一抹陰霾。 保證合約的質(zhì)量,讓區(qū)塊鏈游戲快速走出混沌期,每一個項目方和開發(fā)者責無旁貸。
1.TMT觀察網(wǎng)遵循行業(yè)規(guī)范,任何轉(zhuǎn)載的稿件都會明確標注作者和來源;
2.TMT觀察網(wǎng)的原創(chuàng)文章,請轉(zhuǎn)載時務必注明文章作者和"來源:TMT觀察網(wǎng)",不尊重原創(chuàng)的行為TMT觀察網(wǎng)或?qū)⒆肪控熑危?br>
3.作者投稿可能會經(jīng)TMT觀察網(wǎng)編輯修改或補充。