作者:LoRexxar'@知道創宇404區塊鏈安全研究團隊
時間:2018年8月23日

2018年8月22日,以太坊上異常火爆的Fomo3D游戲第一輪正式結束,錢包開始為0xa169的用戶最終拿走了這筆約10,469 eth的獎金,換算成人民幣約2200萬。

看上去只是一個好運的人買到了那張最大獎的“彩票”,可事實卻是,攻擊者憑借著對智能合約原理的熟悉,進行了一場精致的“攻擊”!

這次攻擊的結果,也直接影響了類Fomo3D的所有游戲,而且無法修復,無法避免,那么為什么會這樣呢?

類Fomo3D

在分析整個事件之前,我們需要對類Fomo3D游戲的規則有一個基本的認識。

Fomo3D游戲最最核心的規則就是最后一個購買的玩家獲得最大的利益

其中主要規則有這么幾條:

  • 游戲開始有24小時倒計時
  • 每位玩家購買,時間就會延長30s
  • 越早購買的玩家,能獲得更多的分紅
  • 最后一個購買的玩家獲得獎池中48%的eth

其中還有一些細致的規則:

  • 每位玩家購買的是分紅權,買的越多,分紅權就會越多
  • 每次玩家購買花費的eth會充入獎金池,而之前買過的玩家會獲得分紅
  • 隨著獎池的變化,key的價格會更高

換而言之,就是越早買的玩家優勢越大。

最終,資金池里的 ETH 48%分配給獲勝者, 2%分配給社區基金會,剩余的 50%按照四種團隊模式進行分配。

游戲規則清楚之后,就很容易明白這個游戲吸引人的地方在哪,只要參與的人數夠多,有人存在僥幸心理,就會有源源不斷的人投入到游戲中。游戲的核心就在于,莊家要保證游戲規則的權威性,而區塊鏈的可信以及不可篡改性,正是完美的匹配了這種模式。

簡單來說,這是一個基于區塊鏈可信原則而誕生的游戲,也同樣是一場巨大的社會實驗。

可,問題是怎么發生的呢?讓我們一起來回顧一下事件。

事件回顧

2018年8月22日,以太坊上異常火爆的Fomo3D游戲第一輪正式結束,錢包開始為0xa169的用戶最終拿走了這筆約10,469 eth的獎金。

看上去好像沒什么問題,但事實真的是這樣嗎

在Fomo3D的規則基礎上,用戶a169在購買到最后一次key之后,游戲的剩余時間延長到了3分鐘,在接下來的3分鐘內,沒有任何交易誕生。這3分鐘時間,總共有12個區塊被打包。但沒有任何一個Fomo3D交易被打包成功。

除此之外,這部分區塊數量也極少,而且伴隨著數個合約交易失敗的例子

這里涉及到最多的就是合約0x18e1B664C6a2E88b93C1b71F61Cbf76a726B7801,該合約在開獎的那段時間連續的失敗交易,花費了巨量的手續費。

而且最重要的是,該合約就是上面最后拿到Fomo3D大獎的用戶所創建的

在這期間的每個區塊中,都有這個合約發起的巨額eth手續費的請求。

攻擊用戶通過這種方式,阻塞了其他游戲者購買的交易,最后成功拿到了大獎。

那么為什么呢?

事件原理

在解釋事件發生原理之前,我們需要先了解一下關于區塊鏈底層的知識。

以太坊約14s左右會被挖出一個區塊,一個區塊中會打包交易,只有被打包的交易才會在鏈上永不可篡改。

所以為了獎勵挖出區塊的礦工,區塊鏈上的每一筆交易都會消耗gas,這部分錢用于獎勵礦工,而礦工會優先挑選gas消耗比較大的交易進行打包以便獲得更大的利益,目前,一個區塊的gas上限一般為8000000。

而對于每一筆交易來說,交易發起者也可以定義gas limit,如果交易消耗的gas總值超過gas limit,該交易就會失敗,而大部分交易,會在交易失敗時回滾

為了讓交易不回滾,攻擊者還使用了一個特殊的指令assert(),這是一個類似于require的函數,他和require唯一的區別就是,當條件不滿足時,assret會耗光所有的gas。原理是因為在EVM底層的執行過程中,assret對應一個未定義過的操作符0xfe,EVM返回invalid opcode error,并報錯結束。

而攻擊者這里所做的事情呢,就是在確定自己是最后一個key的持有者時,發起超大gasprice的交易,如圖所示:

當攻擊者不斷的發起高手續費的交易時,礦工會優先挑選這些高花費的交易打包,這段時間內,其他交易(包括所有以太坊鏈上發起的交易、Fomo3D的交易)都很難被礦工打包進入。這樣一來,攻擊者就有很高的概率成為最后一個持有key的贏家

整個攻擊流程如下:

  1. Fomo3D倒計時剩下3分鐘左右
  2. 攻擊者購買了最后一個key
  3. 攻擊者通過提前準備的合約發起大量消耗巨量gas的垃圾交易
  4. 3分鐘內不斷判斷自己是不是最后一個key持有者
  5. 無人購買,成功獲得大獎

在支付了大量以太幣作為手續費之后,攻擊者贏得了價值2200萬人民幣的最終大獎。

總結

自智能合約游戲中以類Fomo3D誕生之后,這類游戲就不斷成為人們眼中的焦點,精巧的規則設計和社會原理再加上區塊鏈特性,組成了這個看上去前景無限的游戲。Fomo3D自誕生以來就不斷成為人們眼中的焦點,類Fomo3D游戲不斷叢生。

隨之而來的是,有無數黑客也在盯著這塊大蛋糕,除了Fomo3D被盜事件以外, Last Winner等類Fomo3D也被黑產盯上...短短時間內,攻擊者從中獲利無數。

而我們仔細回顧事件發生的原因,我們卻不難發現,類Fomo3D游戲核心所依賴的可信、不可篡改原則和區塊鏈本身的特性礦工利益最優原則沖突,也就是說,只要礦工優先打包高手續費的交易,那么交易的順序就是可控的!,那么規則本身就是不可信賴的。

當你還在尋求棋局中的出路時,卻發現棋盤已經不存在了。

當Fomo3D游戲失去了自己的安全、公平之后,對于試圖從中投機的你,還會相信自己會是最后的贏家嗎?


智能合約審計服務

針對目前主流的以太坊應用,知道創宇提供專業權威的智能合約審計服務,規避因合約安全問題導致的財產損失,為各類以太坊應用安全保駕護航。

知道創宇404智能合約安全審計團隊: https://www.scanv.com/lca/index.html
聯系電話:(086) 136 8133 5016(沈經理,工作日:10:00-18:00)

歡迎掃碼咨詢:

區塊鏈行業安全解決方案

黑客通過DDoS攻擊、CC攻擊、系統漏洞、代碼漏洞、業務流程漏洞、API-Key漏洞等進行攻擊和入侵,給區塊鏈項目的管理運營團隊及用戶造成巨大的經濟損失。知道創宇十余年安全經驗,憑借多重防護+云端大數據技術,為區塊鏈應用提供專屬安全解決方案。

歡迎掃碼咨詢:


REF

[1] Fomo3D
https://exitscam.me/play

[2] 獲利交易 https://etherscan.io/tx/0xe08a519c03cb0aed0e04b33104112d65fa1d3a48cd3aeab65f047b2abce9d508

[3] 攻擊合約
https://etherscan.io/address/0x18e1b664c6a2e88b93c1b71f61cbf76a726b7801

[4] Fomo3D 千萬大獎獲得者“特殊攻擊技巧”最全揭露
https://mp.weixin.qq.com/s/MCuGJepXr_f18xrXZsImBQ

[5] 「首次深度揭秘」Fomo3D,被黑客拿走的2200萬
https://mp.weixin.qq.com/s/s_RCF_EDlptQpm3d7mzApA


Paper 本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/681/