1. 程式人生 > >鏈安漏洞分析連載第六期 遊戲合約漏洞全面彙總

鏈安漏洞分析連載第六期 遊戲合約漏洞全面彙總

針對區塊鏈安全問題,成都鏈安科技團隊每一週都將出智慧合約安全漏洞解析連載,希望能幫助程式設計師寫出更加安全牢固的合約,防患於未然。

image.png

針對區塊鏈安全問題,成都鏈安科技團隊每一週都將出智慧合約安全漏洞解析連載,希望能幫助程式設計師寫出更加安全牢固的合約,防患於未然。

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

上回說到: 地址恢復功虧一簣,

身份判斷輕慮淺謀。

邏輯補全自圓其說,

原理辨析帷幄運籌。

本回, 區塊鏈遊戲江山如畫,

安全防護未規劃,

一片殘陽西掛。

區塊鏈行業日新月異,發展迅猛,各個公鏈及專案方奇思妙想層出不窮。俗話說,玩是人的天性,將數字貨幣與遊戲結合,運用遊戲的機制吸引投資者參與到互動中來的想法以標新立異、推陳出新的姿態引領了最近的潮流。各種區塊鏈遊戲聚集大量的虛擬貨幣,價值動輒上千萬,承諾下的豐厚回抱吸引了越來越多的目光,投資者們躍躍欲試,人人都想充當“頭號玩家”。

image.png

但是,缺少一套完整的、經過驗證的SDK庫是當下區塊鏈遊戲的一個痛點。各遊戲方大都自食其力,獨立開發遊戲智慧合約。比代幣合約更加複雜的開發過程使得安全隱患不可避免的出現,這些漏洞一旦被攻擊者或者專案方本身利用,受害的總會是玩家,可謂是,興,百姓苦,亡,百姓苦。

 

成都鏈安科技對目前已經爆發的區塊鏈遊戲合約事件進行了歸納整理,分析目前遊戲存在以下兩個方面的問題:

一, 程式碼層面的安全問題

目前程式碼層面的安全問題在遊戲中的表現幾乎與之前的代幣合約如出一轍,但是包裹了鮮亮外衣之後,內部的程式碼結構嚴謹度依然差強人意,加上游戲機制的部分功能,有些合約程式碼甚至更加混亂。好比建造一棟樓房,基本結構沒有搭建好,上樑不正下樑歪,增加更多的樓層與附屬結構反而使得樓房的轟然倒塌更加迅速。

image.png

漏洞歸類與修復建議

1.  以溢位為代表的程式碼安全漏洞

數學運算溢位在智慧合約中是個比較大的安全隱患。無論是以太坊還是EOS,一個整型變數只能有一定範圍的數字表示。例如,一個 uint8 ,只能儲存在範圍[0,255] 的數字。試圖儲存 256 到一個 uint8 將變成0。不加註意的話,只要沒有檢查使用者輸入又執行計算,導致數字超出儲存它們的資料型別允許的範圍,就會產生溢位,並可以被用來組織攻擊。 此部分的具體原理在我們之前第一期,溢位漏洞全面分析中已經重點介紹過,沒看過的請戳下面的連結:一夜回到解放前?溢位漏洞型別全面分析 | 鏈安團隊漏洞分析連載第一期 —— 溢位漏洞

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

代表遊戲:狼人遊戲

平臺:EOS

image.png

從遊戲網站上,可以很明顯的看到,該合約執行發生了溢位,導致獎金池總額變為一個極大的負值,並且由於專案方應對措施不當,導致獎池獎金被盜取,普通玩家血本無歸[1]。

修復建議

該遊戲有三個問題需要大家引起注意:

(1) 程式碼開源問題,狼人遊戲專案方並未公佈合約原始碼,玩家在參與遊戲之前無法對專案安全性進行評估,自己的資產無法得到保障;

(2) 狼人遊戲專案方要求使用者提供的過大的許可權,導致其有能力在使用者未提供私鑰的情況下,在後臺修改許可權,並轉出使用者的EOS;

(3) 對安全事件的應急響應,狼人遊戲專案方未凍結攻擊者賬戶,導致攻擊者在升級後的版本中提出了6萬多EOS。在此處,成都鏈安科技建議廣大遊戲專案方應在遊戲合約的設計中引入安全控制機制,包括惡意賬戶凍結、暫停交易等,為遊戲安全建立最後一道防線;

2. 以owner許可權盜取為代表的函式呼叫許可權問題

此類漏洞的形成原因為建構函式失配或者修改owner的函式未新增呼叫者檢查。智慧合約的建構函式一般擔負著合約初始化以及owner地址繫結的功能,如果建構函式宣告方式不正確,那麼,其會變成一個普通函式,任何人都可以呼叫他,並將自己設定為合約管理者。修改owner的函式用於將新地址設定為owner,此類函式需要檢查呼叫者地址,如果確少該檢查,那麼任何人都能夠將自己變為合約的管理者。

這與我們在開始連載之前的owner許可權漏洞分析中的建構函式問題如出一轍,,需要了解請由以下連結傳送:注意!3份合約又存在Owner許可權被盜問題——低階錯誤不容忽視

直接進入案例分析:

代表遊戲:Ether Cartel

平臺:以太坊

image.png

遊戲的建構函式(DrugDealer)和合約名(EtherCartel)不一致,存在建構函式失配漏洞,導致DrugDealer變成一個普通的函式,任何人都能夠呼叫該函式變成合約的ceoAddress,並且,根據後面的程式碼邏輯,他可以收取原本應該打入合約部署者的ETH[2]。

image.png

修復建議

為了避免此類漏洞,開發者在開發遊戲合約時需要足夠謹慎,並進行詳盡的測試。建構函式僅在合約部署時執行一次,當出現合約部署後owner仍為0地址,並且使用者可以呼叫實現建構函式功能的函式,那麼,合約就存在建構函式失配的漏洞,開發者需要檢查並修復建構函式實現。

3.   “隨機數生成”等區塊鏈平臺短板

截止至目前,以太坊和EOS官方均未提供隨機數介面,這對遊戲開發確實是一個不利的影響,比如抽獎模組的開發。為了實現類似的功能,遊戲開發者往往需要自己編寫隨機數生成函式,這些函式往往利用區塊資訊作為引數,然後進行一系列運算,獲得一個“隨機數”。但是,由於使用區塊資訊作為引數,這將導致在同一個區塊上,使用相同演算法的隨機數函式將會得到相同的值,攻擊者可以利用這點,部署中間合約,然後不停的嘗試生成隨機數,當生成滿意的隨機數時,再利用中間合約參與遊戲,獲得較大優勢。

此外,區塊鏈作為一個全球分散式的計算機,其資源目前是比較有限的,鏈的開發者為了保障鏈平臺的穩定性,對鏈上的智慧合約的運做出了限制,防止死迴圈等消耗資源的操作,比如,執行gas限制(以太坊)、CPU/記憶體資源限制(EOS),這使得鏈上游戲開發者需要比傳統的中心化伺服器遊戲付出更大的努力,對遊戲的邏輯進行優化,確保邏輯正確的合約不會因為資源限制問題而無法執行。

隨機數問題我們在之前的快訊 智慧合約隨機數演算法漏洞影響遊戲公平性 已經提及過,這次我們根據案例進行一下具體分析:

代表遊戲:FoMo3D long

平臺:以太坊

image.png

該合約空投函式的隨機數生成使用的區塊引數依次為block.timestamp(當前區塊時間戳)、block.difficulty (當前區塊難度)、 block.coinbase(挖出當前區塊的礦工地址)、block.gaslimit(當前區塊 gas 限額)、block.number (當前區塊號),結合msg.sender (玩家地址),計算出玩家是否獲得空投獎勵,攻擊者可以部署中間合約,預先計算出在當前塊進入遊戲是否能夠獲得空投,然後在結果為true的時候參與遊戲,就必然能夠獲得空投,並以此牟利。

修復建議

針對隨機數問題,目前有幾點建議:

(1) 可以嘗試官方推薦的隨機數生成方式,比如以太坊的Solidity官方文件推薦使用者使用鏈外的Oraclize庫生成隨機數;

(2) 杜絕中間合約參與遊戲,以太坊開發者需要注意,使用以太坊平臺提供的extcodesize函式並不能完全判斷某個地址是否為合約,因為合約在部署的時候,其extcodesize為0,但是可以在建構函式與其他合約進行互動,從而參與遊戲,可以使用tx.origin==msg.sender的方式判斷。

4 .   利用競態條件機制發起的攻擊

目前有些類似博彩的遊戲合約似乎更加受到歡迎,此類遊戲合約有一個共同的特點——時間依賴。它們都是在一定時間段內與使用者進行互動,時間截止之後宣佈獲獎者名單。這樣取決於時間點的遊戲留下的隱患是:攻擊者可以將整個區塊“塞滿”交易,使得特定的交易無法進行。 攻擊者會使用高昂的gas使其成為整個區塊中唯一一個交易進行者。

案例分析:

代表遊戲:Exitscam/FoMo3D

平臺:以太坊

image.png

以太坊版的FoMo3D規則類似於透明“金字塔騙局”

(1) 每一局持續固定的時間

(2) 如果你是最後一個向獎池中投注的人,你拿走頭獎(獎池總獎金的90%)

(3) 如果有人在你之後投注,你會獲得一定的分紅。目前,分紅金額低於投入ETH的1%

(4) 每0.005 ETH會給結算時間增加30秒,也就是2個區塊,但每次增加上限為24小時

利用競態條件的概念,贏得此遊戲,獲得頭獎的策略很簡單:當倒計時即將結束,趨近於0時,向獎池投注ETH,“買“下之後的每一個區塊直至倒計時結束,保證沒有人能夠在你之後投注。如果這個操作實現,你將獲得頭獎[3]。

這個遊戲的機制漏洞幾乎與之前提到的交易順序依賴(TOD)異曲同工,競態條件我們在第三期連載分析中也有描述,連結如下:彎道超車老司機戲耍智慧合約 | 成都鏈安漏洞分析連載第三期 —— 競態條件漏洞。

修復建議

遊戲開發者需要熟悉重入和交易順序依賴兩種型別的競態條件漏洞,類似的遊戲機制如若可以利用相似的概念被投機取巧,應當改變設計思路,兼顧設計初衷與安全保障。

二, 遊戲本身可信度問題

雖然區塊鏈上所有的交易都是公開透明的,但這不代表遊戲專案方在合約開發的過程中不能留有後門。尤其是尚未公佈原始碼的遊戲合約,其中可以暗藏一個函式,開發者只要呼叫這個函式就能捲走所有的貨幣。而目前尚未出現一款可靠的反編譯器,對位元組碼進行反編譯後,使其原始碼真正公開透明。

如果還拿建造樓房做比喻的話,可以理解成在建造的時候就設計成歪的,一直住在其中的使用者卻並沒有察覺。

image.png

事件回顧

代表遊戲名稱:Power of Bubble

平臺:以太坊

image.png

從4月7日到4月8日早上10點,遊戲專案方在Discord各頻道開始了瘋狂的宣傳,利用精美的外形設計和豐厚的獎勵承諾牢牢吸引了大批的粉絲翹首以盼。8日早上10點開服後10分鐘內,合約內資產已超過200ETH,但是隨著時間的推移,玩家們開始發現討論群消失了,遊戲內的出售以及提取操作也無法完成。最後,獎金池中227個以太在眾目睽睽之下被合約建立者轉走[4]。

image.png

區塊鏈遊戲往往需要各種虛擬貨幣作為遊戲資產,整個遊戲中所有涉及到虛擬貨幣持有、分配的合約都應當開源,供玩家和審計方稽核,確保沒有潛在後門。同時玩家也應該提高警惕,在將自己資產投入一份原始碼未知,未經審計的區塊鏈遊戲時,要做到理性投資。

路漫漫其修遠兮

將區塊鏈技術應用到遊戲上,其發展時長其實並不比區塊鏈貨幣交易短很多。區塊鏈遊戲到目前為止已經可以劃分為3個時代,從1.0時代的《加密貓》,到2.0時代的《以太水滸》,都屬於收集玩法為主的區塊鏈遊戲時代。目前的3.0時代是鏈上加鏈下多種玩法結合的時代,但是在眾多RPG區塊鏈遊戲興起的同時,龐氏騙局型區塊鏈遊戲也開始興風作浪,這類遊戲的交易屬性較重,而且往往缺乏長期的遊戲屬性。展望4.0時代,區塊鏈遊戲應當更加註重於其遊戲性,也就是說在玩法上更加接近傳統遊戲。但是與傳統遊戲相比,區塊鏈遊戲在三個方面有較大優勢[5]:

1. 賬號安全:玩家的登入資訊加密過後被儲存在錢包內,安全性相較於傳統登入模式有較大提升

2. 伺服器:伺服器安置在區塊鏈上,即使遊戲運營方停止其官方伺服器,玩家也能繼續享受遊戲

3. 公平性:由於遊戲內資訊公開透明,並且可追溯,濫發,更改道具的行為將更容易被識別,進而大幅下降。

然而,基於以太坊開發與傳統遊戲機制相同的仍然存在許多劣勢:

1. 以太坊的吞吐量限制了遊戲玩家的數量和增長速度

2. 鑑於目前以太坊交易速度的限制,很多遊戲沒有辦法像傳統遊戲一樣做到低延遲和實時互動

3. 每筆交易需要手續費對遊戲內的交易增加了負擔

目前,更多公鏈和資本介入區塊鏈遊戲的開發,目的是為其研發新的模式技術奠定更堅實的基礎,或許再過不久,會有專門為遊戲而生的公鏈出現,給區塊鏈遊戲一個專屬的舞臺。同時,開發者們已經把重心轉移到多玩法的方向,試圖弱化交易屬性、減少龐氏騙局型別遊戲,將區塊鏈的技術優勢附加到已經很成熟的傳統遊戲市場,為遊戲產業帶來一個新的紀元。

但無論是以交易屬性為主還是以遊戲性為主的區塊鏈遊戲,都離不開智慧合約的編寫和審計。所以重中之重還是要在發展的同時,保證合約安全屬性的驗證,對於上述問題遊戲合約,對照之前的漏洞分析不難發現,很多專案方依然在重蹈覆轍,對於異常明顯的常規漏洞沒有采取補救或者防護的措施,帶給玩家巨大的經濟損失,也給區塊鏈遊戲的天空平添一抹陰霾。 保證合約的質量,讓區塊鏈遊戲快速走出混沌期,每一個專案方和開發者責無旁貸。

參考連結彙總:

[1]: EOS版Fomo3D因漏洞終結 資金盤遊戲背後現多重風險

[2]: 數個區塊鏈遊戲智慧合約爆出ceoAnyone漏洞(CVE-2018-11329)

[3]: The Buy-A-Block Attack

[4]: 這夥騙子僅用十分鐘就騙走了227個ETH

[5]: 鏈安漏洞分析連載第六期 遊戲合約漏洞全面彙總​​​​​​​