Fomo3D 遊戲第一輪正式結束,最終大獎由地址 0xa169 獲得,獎金額高達 10,469.66 以太幣。
不少人輕易得出結論:獲獎者平平無奇。
安比(SECBIT)實驗室昨日首個發現Fomo3D大獎獲得者採取一些「特殊攻擊技巧」 ,使得遊戲臨近結束時,礦工打包入區塊內的交易數量驟減(涉及連續多個區塊),從而起到加速遊戲結束和提高勝率的作用。安比(SECBIT)實驗室在 Last Winner 上輪遊戲結束時也觀察到了多個十分類似的異常區塊和交易。
一組連續的異常區塊和交易
如上圖所示,高度為 6191896 的區塊中打包了 Fomo3D 遊戲中獎者最後購買 key 的交易,該區塊共包含 92 筆交易,交易數量正常。
而在該區塊後的連續 11 個區塊(6191898~6191908),每個區塊包含交易數量都驟降,最少的一個區塊(6191906)僅包含了 3 筆交易,十分異常。
讓我們來觀察一下這些「特殊」的區塊。
如上圖所示,高度為 6191906 的區塊僅包含了 3 筆交易,並且交易均發往同一合約(調用同一個神秘合約),三筆交易手續費之和超過 4 個以太幣。
而該神秘合約(0x18e1)創建者正是中獎者(0xa169)!
通過向 F2POOL 負責人確認我們得知,礦池挑選交易進入區塊的策略為手續費(TxFee)高的優先。
這也解釋了為何上文提到的連續 11 個區塊,都僅打包了很少量的交易,卻能獲得超出正常區塊的手續費。這些區塊分別由 SparkPool、Nanopool、Ethermine、BitClubPool、MiningPoolHub 等礦池打包,顯然挑選高手續費交易優先打包,是符合礦池利益的策略,是行業通行的方案 [1]。
黑客的「神秘合約」究竟做了什麼?
安比(SECBIT)實驗室觀察到,這些異常區塊內發往神秘合約(攻擊合約)的異常交易,最終狀態均為失敗。
如上圖所示,交易最終狀態為失敗,並且 Etherscan 有 Bad instruction 錯誤提示,最終導致耗光 Gas Limit (4200000),約為正常區塊 Gas Limit 的一半,因此打包該交易的礦池也收到了高額的手續費。
以太坊區塊 Gas Limit 這一概念,代表單個區塊中最多允許的 Gas 總量上限,以此來決定單個區塊中具體打包多少筆交易。區塊 Gas Limit 由礦工間通過一定策略協商設定,目前區塊常見值約為 8000000 [2]。
以太坊上每筆交易也包含一個 Gas Limit 概念,由交易發起者自行設定,代表該筆交易可最多消耗的 Gas 上限,實際 Gas 消耗以交易具體執行消耗為準。一個區塊中所有交易花費的 Gas 不能超過區塊的 Gas Limit [3]。
我們知道,以太坊智能合約還存在一個指令 assert(),用於斷言。當 assert 的結果不滿足條件時,則會耗光交易的 Gas。 Etherscan 針對這種情況的交易通常提示 Bad instruction,實際則為 EVM 執行過程中遇到了一個未定義的操作符 0xfe [4]。
獲獎者(黑客)就是利用這個特性,實現少量交易就能佔用整個區塊的 Gas Limit。
黑客更犀利的操作
進一步,安比(SECBIT)實驗室發現神秘合約會調用 Fomo3D 遊戲的 getCurrentRoundInfo() 介面,用於獲取當前輪次比賽信息,如剩餘時間、最後一位購買者的信息(最有可能獲獎者)等獎池詳盡信息(如下圖)。
「神秘合約」並未公開源碼,安比(SECBIT)實驗室結合逆向結果推測,獲獎者(黑客)通過神秘合約,在合約內調用該介面查詢遊戲信息,重點關注剩餘時間和最後一位購買者地址。當遊戲剩餘時間達到一個閾值,並且最後一個購買者是自己時,則通過 assert() 讓整個交易失敗,並耗光所有 Gas;當剩餘時間很長或最後一個購買者不是自己時,則不做任何操作,僅消耗很少的 Gas。
獲獎者(黑客)就是利用這種方法,發起大量類似的可變神秘交易:在自己極有可能成為中獎者時,利用這些高額手續費的神秘交易,吸引礦池優先打包,佔滿後續區塊,從而使得其他玩家購買 key 的交易無法被正常打包,最終加速遊戲結束,並極大地提高自己的中獎概率。
其他一些技巧和重要細節
安比(SECBIT)實驗室觀察到 Fomo3D 獲獎者(黑客)創建過多個類似神秘合約(攻擊合約),並且前後曾使用很多不同地址向神秘合約發起交易,來分散大眾注意力,降低自己的「特殊技巧」被發現的可能性。而每個攻擊合約都有大量交易記錄。上文提到的最終導致黑客獲獎的攻擊合約(0x18e1)有多達 5000 多筆交易,可見黑客暗地裡做過不少嘗試。
獲獎者(黑客)控制的地址批量調用神秘合約(攻擊合約)時,會給交易設置各種 Gas Limit,從 170000 到 4800000 不等,這同樣是一個技巧。
Fomo3D 獲獎者(黑客)0xa169 最後一次購買 key 後(區塊 6191896),連續十餘個區塊,都無任何與購買 Fomo3D 遊戲 key 相關的交易,這才最終導致遊戲倒計時結束,獲得最終大獎。
中獎區塊的下一個區塊(6191897),其實也包含大量異常交易。
在遊戲結束前,大眾一直假想黑客可能會與大礦池聯合作弊,拒絕打包競爭者交易來獲得大獎,或者設想黑客可能發出大量垃圾交易使以太坊網路擁堵而無法打包競爭者交易,從而獲利。
這輪遊戲的獲獎者(黑客),並未聯合多家礦池作惡,反而巧妙利用了所有礦池優先挑選交易打包策略的共性。
獲獎者(黑客)部署的神秘合約(攻擊合約),簡直是智能合約作為攻擊武器的典範示例,精確制導,有的放矢。比起盲目地使用自動腳本在臨近遊戲結束時調高 Gas Price 發起參與遊戲交易,黑客的攻擊手法顯然高明許多 。廣播至各礦池的攻擊交易,如導彈一般部署在內存池中,根據遊戲狀況,伺機而動。
安比(SECBIT)實驗室在 Last Winner 上輪遊戲結束時也觀察到了許多十分類似的異常區塊和交易,手法十分接近。
獲獎者(黑客)創建的神秘合約,也正頻繁與其他一些 Fomo3D 山寨遊戲(如 Super Card)發生交易,企圖使用同樣的手法獲得巨額大獎。
哪有什麼簡單的「黑天鵝」,有的只是聰明且努力的黑客。「冪律分布」和「遊戲繆誤」了解一下 [5]。
幸運的 F2POOL 礦池
另外值得一提的是,兩款遊戲(Fomo3D、Last Winner)中獎交易最終均由 F2POOL 礦池打包出塊,並且中獎者的上一筆參與遊戲的交易,也均由 F2POOL 打包。
安比(SECBIT)實驗室與 F2POOL 礦池負責人仔細討論過相關細節後,均初步認為這是巧合。F2POOL 礦池幸運地見證了兩款熱門智能合約遊戲兩筆巨額中獎交易的誕生。
智能合約遊戲路往何方
安比(SECBIT)實驗室之前還報道過 Last Winner 及其他 Fomo3D 山寨遊戲中,黑客利用原版 Fomo3D 遊戲中的空投漏洞,攫取大量獎勵,以及 Fomo3D Quick 版本存在的問題。
在感慨黑客利用特殊技巧獲得高額回報之餘,我們也不由地替各類智能合約遊戲的未來產生擔憂。
Fomo3D 作為 2018 年最火爆的智能合約遊戲,在玩法和技術上做了很多創新,是智能合約遊戲歷史上重要的一步。不可否認,Fomo3D 開發團隊,有著過人的技術水平和強烈的去中心化情懷。
Fomo3D 遊戲剛出之初,不少人都驚呼,這是真正公平的去中心化遊戲。但回到現實,依舊有黑客能發現當中的各類缺陷,並悄悄利用,獲得可觀的回報。
技術的局限性、人性的貪婪、信息的不對稱,都制約著一款真正安全、公平、透明的去中心化遊戲的誕生。在 Fomo3D 出現之後,各類山寨遊戲紛紛湧現,卻沒有在技術和創新上能走得更遠,圈子氛圍變得浮躁且嘈雜。
作為區塊鏈及智能合約愛好者,安比(SECBIT)實驗室無比希望能儘快看到下一款安全、公平、優秀、有趣的智能合約遊戲出現。
本文系作者 SECBIT實驗室