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