作者:安比(SECBIT)實驗室 & AnChain.ai

安比(SECBIT)實驗室創始人郭宇:2009 年,中本聰創造了一個虛擬的去中心化新世界。這彷彿是一片流着奶和蜜糖的應許之地,人們歡呼雀躍,蜂擁而至。但與所有的生態系統一樣,新世界有生命,就有捕食者。有交易者,就有黑客。區塊鏈上的應用在進化,攻擊者也同樣,我們給大家展示的是區塊鏈世界不爲人知的另一面,暗流湧動。意料之外,也在意料之中。

Last Winner (類 Fomo3D)遊戲大火,導致以太坊異常擁堵,Gas 費用暴漲。大量以太幣資金入場。

北京時間 2018 年 8 月 10 日凌晨 1:38,加州時間 9 日上午 10:38,安比(SECBIT)實驗室收到合作伙伴美國硅谷 AnChain.ai 公司消息,基於 AI 的態勢感知系統發出預警信息,發現部分遊戲合約出現大量交易並且存在異常的資金流動情況。安比(SECBIT)實驗室的小夥伴趕緊根據最新線索,對相關合約和交易進行觀察、跟蹤、分析。

悄然上線:莫名火爆的 Last Winner

Last Winner 是一款基於以太坊智能合約的 DApp 遊戲,於 8 月 6 日上線,這款遊戲一經推出,就「異常」火爆。

這款遊戲合約地址爲 0xDd9fd6b6F8f7ea932997992bbE67EabB3e316f3C。據 Etherscan 顯示,短短六天時間內,該遊戲合約就已產生 27 萬餘筆交易。甚至前段時間以太坊網絡大擁堵也與 Last Winner 遊戲密切相關。8 月 8 日 和 9 日,在 Last Winner 和 Fomo3D 超大規模交易量的共同作用下,以太坊未確認交易數量創年內新高,平均 Gas 費用一度飆升至正常 10 倍以上。

智能合約史上最大規模攻擊手法曝光,盤點黑客團伙作案細節

該遊戲第一輪獎池金額爲 1.6 萬多個以太幣,而玩家總投資額更超過 10 萬以太幣,資金量巨大。目前遊戲第一輪已結束,第二輪獎金池已迅速累積至 7000 多以太幣。

瘋狂的現象級遊戲背後暗流湧動。

疑團重重:前期大量參與者的資金來歷不明

據知名媒體「區塊律動」報道,Last Winner 由名爲「蟻羣傳播」的資金盤傳銷組織推廣運營,有着數量衆多的會員和極強的推廣拉下線能力 [1]。而據另一款火爆遊戲 Fomo3D 開發團隊稱,Last Winner 是仿 Fomo3D 遊戲,其背後運營團隊準備了 20 萬 ETH 來進行自動刷量交易。因此,Last Winner 遊戲火爆的背後,可能是一場精心佈局的傳銷遊戲,初期利用機器人發起批量交易,僞造活躍假象,吸引新韭菜入場。

Last Winner 遊戲合約存在大量非正常交易,並且伴隨着大量合約的創建與自毀,與正常人類調用行爲特徵偏離很大,這引起了我們的高度警惕。

瘋狂推廣:只面向國人,合約源碼卻未公開

在各大論壇、媒體、以及微信羣中,都可以見到 Last Winner 遊戲的推廣文章,而這些文章有着類似的描述,並且都附上推廣邀請碼。但 Last Winner 英文相關資料非常少。

智能合約史上最大規模攻擊手法曝光,盤點黑客團伙作案細節

顯然,這是一款針對中國人的遊戲,有着誘人的推廣(拉下線)獎勵,因此在網絡上廣爲傳播。並且,這款遊戲有適配安卓和 iPhone 手機的 App,簡化了使用操作,降低了參與門檻。

但是,十分可疑的是,作爲一款基於智能合約的區塊鏈遊戲,Last Winner 居然沒有公開合約源代碼!這是一個非常危險的信號。爲何這樣一個遊戲能這麼火爆,吸引這麼多人蔘加?

我們直覺上感到這款遊戲到處透露着詭異的氣息。

安全性存疑:實則是 Fomo3D 山寨版

Last Winner 官方宣傳語寫道:

Last Winner (LW)是首款完全去中心化的類 Fomo3D 遊戲 DApp,完全基於以太坊智能合約原生開發。只要下載安裝 App 就可參與遊戲。

類 Fomo3D 遊戲,且未公開源代碼,這不得不讓人產生懷疑。要知道,短短時間內原創開發一個好玩又安全的 DApp 遊戲難度非常大。

安比(SECBIT)實驗室迅速使用內部工具逆向分析了 Last Winner 的合約代碼(字節碼)。果不其然,這款遊戲合約代碼函數名稱與 Fomo3D 高度相似,疑似直接拷貝(抄襲)了 Fomo3D 的源碼,但卻又新增了 10 餘個可疑未知函數。

儘管 Fomo3D 在 Etherscan 公開了源代碼,但這並不代表它開源給任何人隨意使用。

安比(SECBIT)實驗室之前報道過:在 Fomo3D 爆紅之後,各類山寨版 Fomo3D 層出不窮。之前這些山寨版遊戲往往復制 Fomo3D 官網和合約源碼,並可疑地在一些地方進行修改。而 Last Winner 在此基礎上更進一步,推出移動客戶端,並瘋狂推廣,卻不公開智能合約源代碼。

智能合約遊戲或 DApp 的亮點之一就是公開透明。Last Winner 遊戲則完全違背了這一點,動機十分可疑,參與該類遊戲的風險極高!

當時嚴峻的形勢是:一方面有多個地址疑似瘋狂發起攻擊交易,另一方面項目方遊戲合約未公開源碼,高度可疑卻吸引了巨量資金。我們感覺到態勢十分緊急,於是迅速開展分工合作。AnChain.ai 中美團隊日夜交替分析和監控異常交易,收集證據,定位攻擊來源與攻擊規模。

安比(SECBIT)實驗室的小夥伴們則兵分兩路,分別開展對不透明遊戲合約和黑客攻擊手法的逆向分析。

前情回顧:類 Fomo3D 遊戲空投機制存漏洞

Fomo3D 遊戲參與形式是用以太幣購買遊戲道具,除了最後一個購買的人可以獲得鉅額大獎外,平時參與者還有機會獲得「空投」獎勵。

這裏有主獎池和副獎池的概念,最終的鉅額大獎和空投獎勵分別從從主獎池和副獎池中獲取。

所有進入遊戲的以太幣,有 1% 數量會進到副獎池。每一次購買道具都會有概率獲得空投。空投的概率從 0% 開始,每增加一筆不小於 0.1 ETH 銷售訂單,空投概率會增加 0.1%。同時空投獎金額與購買金額也掛鉤,如果購買 0.1 ~ 1 ETH,就有概率贏得 25% 副獎池獎金,購買更多則比例越大。

一進入遊戲界面,就會看到鮮明提示,通知當前中獎概率和獎池金額。這一設計,原本是想增加遊戲趣味性,並起到吸引資金入場、延長遊戲時間的作用。但實際情況卻並非如此。

通過觀察 LastWinner 遊戲合約以及部分地址的異常交易行爲,我們心中有了初步答案。

讓我們把時間退回到 20 多天前,早在 7 月 24 日,安比(SECBIT)實驗室和派盾(PeckShield)科技分別同時預警:Fomo3D 遊戲的智能合約存在隨機數漏洞可被利用,Fomo3D 及所有抄襲源碼的山寨合約均存在該安全漏洞 [2]。原本設計上隨機性較大的空投遊戲可通過特殊手段操縱,大大提高中獎概率。

經安比(SECBIT)實驗室字節碼智能掃描工具逆向分析,Last Winner 遊戲空投獎勵代碼與 Fomo3D 基本一致,相似度達 91%,可能存在同樣漏洞。隨着遊戲火爆進行,機敏的黑客肯定也聞風而動。

不能說的祕密:黑客製造祕密武器攫取高額收益

智能合約史上最大規模攻擊手法曝光,盤點黑客團伙作案細節

在區塊鏈態勢感知系統所展現出來的數據面前,我們不由地倒吸一口涼氣。

圖中的這些可疑地址,如同病毒一般緊緊纏繞在 Last Winner 合約四周,肆意吞噬着 Last Winner 內的資金。

我們觀察到,圖中緊靠 Last Winner 的這些地址,有着類似的行爲模式。

如:

1、不停地往某合約地址上發起交易,同時附帶 0.1 個以太幣
2、不少交易狀態爲失敗
3、成功的交易又會涉及大量“內部交易”
4、「內部交易」調用邏輯十分複雜,並伴隨大量合約的創建和自毀

安比(SECBIT)實驗室迅速得出初步結論:這些不明合約就是黑客用來攻擊 Last Winner 的祕密武器,黑客正是通過這些合約,持續吸走 Last Winner 遊戲內的以太幣。

案發現場:大量類似交易,超高回報率

上面態勢感知圖中,佔地面積最大的嫌疑地址引起了我們的注意:0xae58,於是從這個地址展開了追蹤。

8 月 9 號當天,0xae58 地址內以太幣餘額就以超過 300 個,而當時他正在大量往地址 0x5483 上發起交易,每筆交易轉賬金額都是 0.1 Ether。顯然,黑客正通過 0x5483 智能合約向 LW 發起攻擊。

智能合約史上最大規模攻擊手法曝光,盤點黑客團伙作案細節

讓我們觀察下面這條狀態顯示爲成功的交易。表面上看是 0xae58 向攻擊合約 0x5483 轉了 0.1 Ether,實際卻涉及了一大堆地址間的相互轉賬,最終隨着 0x7c77 合約自毀,0.189 個 Ether 轉移回 0xae58 的賬戶中。

智能合約史上最大規模攻擊手法曝光,盤點黑客團伙作案細節

這十分神奇,攻擊者投入 0.1 個以太幣,最終收穫 0.189 個,瞬間回報率高達 89%,簡直暴利。

我們很快發現,除了 0xae58 地址外,還有四個地址也持續不斷地向 0x5483 合約發起類似交易,持續獲得高額回報。

而失敗的交易,僅消耗 27712 燃料(Gas),成本損耗十分低。

研究目標立刻鎖定爲攻擊合約 0x5483。由於無法獲得源碼,安比(SECBIT)實驗室立刻使用內部工具展開逆向分析。

暴利:數據面前我們再次震驚

8 月 13 日,當我們沉浸在研究黑客的攻擊合約各種細節優化和精巧設計之時,黑客攻擊數據全景分析新鮮出爐。

其中,攻擊獲利最大的是以 0x820d 地址爲首的團隊。他們累計獲利超過 5000 個以太幣。AnChain.ai 團隊和安比(SECBIT)實驗室將該黑客團伙精確定位,並將其命名爲 BAPT-LW20 (Blockchain APT – Last Winner)。

BAPT-LW20 團隊在短短 6 天時間內,共發送將近 5 萬筆交易,從中攫取 5194 個 Ether,獲利價值將近 1200 萬人民幣。

由下圖每小時發起的攻擊交易數量趨勢圖(下圖),我們可以看出攻擊的高峯期發生在 8 月 8 日 ~ 10 日,每小時平均攫取將近 100 以太幣,將近 22 萬人民幣。這正好也是 LW 遊戲最火爆的時間段。隨着遊戲進入後期,入場資金急劇下降,收益降低,黑客也不得不也降低了攻擊頻率。

智能合約史上最大規模攻擊手法曝光,盤點黑客團伙作案細節

再看看黑客每小時攫取以太幣數量趨勢圖(下圖)。慘淡的漫漫熊市裏,黑客卻在狂賺以太幣。

智能合約史上最大規模攻擊手法曝光,盤點黑客團伙作案細節

下圖是「Last Winner 中黑客的交易量佔比和攫取 ETH 佔比」,可見黑客發送的交易量只佔總交易量的 9.877%,但是去攫取了 Last Winner 獎金池中 49% 的獎金。黑客的嫺熟攻擊技能,爲他們帶來了普通玩家難以企及的好運,而普通玩家在這場遊戲裏面幾乎很難獲得空投獎勵。

智能合約史上最大規模攻擊手法曝光,盤點黑客團伙作案細節

火線追兇:BAPT-LW20 團隊攻擊 LW 始末

安比(SECBIT)實驗室嘗試追蹤復原 BAPT-LW20 團隊攻擊時間線。

下圖是 BAPT-LW20 團隊某賬戶餘額變動情況。

智能合約史上最大規模攻擊手法曝光,盤點黑客團伙作案細節

0x820d 是 BAPT-LW20 團隊所有攻擊合約的部署者,也是攻擊的實施者之一,可認爲是 BAPT-LW20 團隊的隊長。0x820d 地址最早活躍於 7 月 20 日,賬戶中的初始以太幣均由 0x73 B6 地址轉入。而 0x73 B6 也是同一天開始活躍的新地址,它的初始以太幣來自總部位於美國舊金山的 Kraken 交易所。

0x820d 在收到來自 0x73 B6 的 10 個以太幣後,隨即部署了它的第一個合約。可能有些地方不太理想,他並沒有繼續使用該合約。三分鐘後,0x820d 部署下了第二個合約,攻擊對象是 Fomo3D。在一組準備工作設置、若干次失敗的調用以及兩次雖然成功但卻沒有收益的嘗試過後,0x820d 應該是發現了攻擊合約裏的 bug 和優化空間。

在接下來的 14 個小時內,他依次部署了 8 個合約進行攻擊測試,無奈都不成功。終於在第 9 個合約 0xBad7 中首次完成攻擊,以 0.1 ETH 的投入換回了 0.125 ETH。

0xBad7 是 0x820d 團隊首個可以正常工作的攻擊合約,他們在 7 月 21 日至 7 月 23 日三天時間內總計調用該合約 11551 次,小有斬獲。

7 月 23 日,0x820d 又部署了新的合約,將攻擊對象轉移爲另一款 Fomo3D 山寨遊戲老鼠會 RatScam (0x5167350d082c9ec48ed6fd4c694dea7361269705),0x820d 團隊在一天時間內使用了 2299 次攻擊合約。

一天後,0x820d 又找到了新目標,一個名爲 FoMoGame (0x86D179c28cCeb120Cd3f64930Cf1820a88 B77D60) 的山寨遊戲,部署新合約(0xb599)進行攻擊。這款遊戲知名度不高,入場資金並不多,黑客調用了 126 次之後就放棄。

接下來的三天內,0x820d 前後部署了 10 個新合約進行優化與攻擊測試。

終於,在 7 月 26 日上線了他們的新版攻擊合約(0x5483)。該合約總共發生過 23835 筆交易,最近一次活躍時間在 8 月 10 號(7 天前)。這款攻擊合約,可由攻擊者 自定義受害遊戲合約地址。因此 0x820d 在接下來的幾天內,持續混合攻擊 Fomo3D 原版、RatScam、FoMoGame 等遊戲,並持續觀察其他山寨遊戲的動態,等待時機。同時,繼續部署若干個新合約進行調優測試。

終於,8 月 6 日 Last Winner 遊戲上線,24 小時後 0x820d 團隊就使用準備好的 0x5483 合約,針對 Last Winner 發起第一次攻擊,並在接下來的 4 天內集中力量,瘋狂利用空投漏洞展開攻勢。

8 月 10 日,0x820d 調用 0x5483 攻擊合約 withdraw 接口,提走了裏面的餘額,攻擊疑似暫停。

原來,他們早已經部署了新版合約攻擊合約 0x9C10,又發起了超過 30000 筆交易,至今仍在活躍攻擊。

不僅僅是空投:BAPT-LW20 黑客團隊拿走 LW 最終大獎

北京時間 8 月 17 日上午,Last Winner 遊戲第一輪最終結束,最終大獎由 0x5167 地址獲得,獎金額總計 7,754 以太幣。

智能合約史上最大規模攻擊手法曝光,盤點黑客團伙作案細節

而這個地址正是 BAPT-LW20 黑客團隊的五個地址之一。

如下圖,14 小時前,黑客還在利用攻擊合約獲取空投獎勵。隨後,他改變了方案,直接用自身地址購買道具參與遊戲,不斷嘗試奪取最終大獎。在此之後,又繼續調用合約攻擊 LW 遊戲。

智能合約史上最大規模攻擊手法曝光,盤點黑客團伙作案細節

安比(SECBIT)實驗室猜測黑客潛伏很久,早已做好充分的準備,長時間利用腳本監控 LW 遊戲狀態,最終才能在衆人放鬆警惕之時獲得大獎。

BAPT-LW20 黑客團隊利用空投漏洞獲利超 5,194 Ether,同時又奪取最終大獎 7,754 Ether,累計獲利 12,948 Ether。

同行相殺:Zethr 團隊兩天時間就成功利用漏洞

這場超大規模的類 Fomo3D 智能合約遊戲被攻擊事件,攻擊者使用的祕密武器也正是智能合約。

據安比(SECBIT)實驗室調查分析,0x20C9 地址最先成功利用原版 Fomo3D 空投漏洞並獲取獎勵。我們將他定位,並將其命名爲 BAPT-LW10。

0x20C9 於 7 月 8 日 10 點 07 分創建了攻擊合約 0xe7ce,在接下來的十分鐘內,前後調用了三次,最終在第四次時成功獲得獎勵,投入 0.1 以太幣,收回 0.19 個,回報率高達 90%(見下圖)。

智能合約史上最大規模攻擊手法曝光,盤點黑客團伙作案細節

此後,0x20C9 繼續部署多個攻擊合約,進行調試優化。最終,在 7 月 23 日部署了最終版本 0x39ac 攻擊合約,接下來的時間前後調用過 90 餘次,而攻擊對象涉及 Fomo3D 原版、Last Winner 以及其他山寨版 Fomo3D。

據我們觀察,0x20C9 是最早研究併成功利用空投漏洞的黑客。研究過程中,安比(SECBIT)實驗室發現 0x20C9 與另一款遊戲 Zethr 密切關聯。

最終我們在 Zethr 遊戲合約代碼中發現了他的身影。他是熱門遊戲 Zethr 的八位核心開發者之一,代號爲 Etherguy。

智能合約史上最大規模攻擊手法曝光,盤點黑客團伙作案細節

顯然,作爲 DApp 遊戲開發同行,Etherguy 以及他所在的 Zethr 團隊很早就研究了 Fomo3D 項目代碼。Fomo3D 合約 7 月 6 日部署上主網,Etherguy 兩天後就發現併成功利用了漏洞。從調用規模來看,Etherguy (BAPT-LW10) 應該主要還是出於研究目的,並沒有太多獲利。

讓其他黑客獲利最多的正是 Last Winner 遊戲。

遊戲細節:Last Winner 爲何讓黑客如此瘋狂

從最初 Fomo3D 上線後不久,空投漏洞就已被人發現併成功利用。隨着遊戲的廣泛傳播,以及該漏洞被逐漸披露,空投漏洞的攻擊手段也在這一過程中不斷升級進化,最終部分黑客團隊完成了精巧的攻擊方案,可低成本、高效率獲得獎勵,並可大規模工程化地攻擊任意任何同類遊戲合約,瘋狂收割以太幣。

據安比(SECBIT)實驗室分析,除 LW 遊戲以外,不少黑客團隊都曾嘗試攻擊其他類 Fomo3D 遊戲合約。但獲利都遠小於 BAPT-LW20 團隊在 LW 遊戲中所得。

我們試圖從 LW 遊戲本身尋找答案。

LW 遊戲是 Fomo3D 山寨版,本身沒有太多創新,但入場資金完全集中在遊戲開始後的第 2 天至第 5 天內。巨量入場資金,會讓遊戲空投獎池迅速累積,因此這段時間也是黑客攻擊的黃金時機。

更要命的是,Last Winner 團隊修改了空投遊戲參數,使進入副獎池(空投獎池)的以太幣比例由 1% 調整到 10%,相當於空投獎勵金高了 10 倍!

一方面,遊戲運營團隊可能是利用高額空投獎勵吸引用戶瘋狂加入;另一方面,他們可能並不知道空投漏洞的嚴重性,而提高獎勵比例則會讓該問題進一步放大。

Last Winner 遊戲簡直成爲了黑客的提款機!

特別地,前面提到 Last Winner 遊戲第一輪入場資金已達 10 萬以太幣,這也就是說,單單這一款遊戲就有超過 1 萬個以太幣都持續暴露在被攻擊的風險下,成爲黑客的囊中之物。要知道,這款遊戲第一輪最終獎池也才 1.6 萬餘以太幣。本來空投獎勵都是很小的金額,但黑客持續利用空投漏洞,積少成多,終成 Last Winner 最大贏家。

我們追蹤到有多個團隊對 Fomo3D 及山寨合約開展大規模自動化攻擊,企圖攫取利益。

而 BAPT-LW20 團隊在遊戲開始後 24 小時左右就加入了戰局,並迅速擴大作戰規模,最終佔得先機,獲取鉅額收益。

安比(SECBIT)實驗室追蹤到還有其他黑客團隊向 Last Winner 合約開展攻擊。部分黑客 8 月 11 號以後才入局,雖規模也很大,但終究因爲錯過黃金時機而獲利較少。

攻擊合約:設計複雜又精巧

攻擊合約 0x5483,創建於 7 月 26 日,創建者爲 0x820D,同時也是持續調用攻擊合約的五個地址之一。

起初,攻擊合約的創建時間讓我們感到疑惑,前面提到 LW 遊戲合約於 8 月 6 日才部署上主網。難道 0x820D 可以未卜先知,或者他與項目方有什麼不可告人的祕密?

帶着這個疑問,我們嘗試從合約 0x5483 的代碼(字節碼)中尋找答案。

經過逆向發現,該合約有七個公開函數,其中一個疑似函數名是 withdraw(uint256),用於將攻擊合約中積累的以太幣轉走。

安比(SECBIT)實驗室在字節碼中發現了上面提到的五個地址。原來這兩個函數都會跳轉到同一個內部函數,檢查交易發起人是否是這五人地址之一。如果是,則可繼續執行,如果不是,則提前讓交易失敗。

這也解釋了爲什麼偏偏是這五個地址一直在調用攻擊合約。因爲他們是一個團隊,合約特地爲他們而設計,而其他人根本無法正常調用。

初步猜測,攻擊合約這麼設計是爲了分散權限和資金,降低出問題或被發現的風險。

智能合約史上最大規模攻擊手法曝光,盤點黑客團伙作案細節

上圖正是一筆攻擊交易的傳入參數。第一部分是調用函數哈希 ID,後面跟着三個參數。注意看第一個參數,攻擊者傳入的明顯是一個地址。顯然,這個地址正是 LW 遊戲合約地址。

原來如此,攻擊目標對象可以作爲參數傳入。「黑客真機智!」,我們不由地感慨。之前的一個困惑被解開,早在 LW 遊戲上線前就已部署好的攻擊合約 0x5483,其實是一個通用型武器。

繼續研究,接下來合約的複雜程度出乎我們意料。我們沿着生成的控制流程圖(CFG)追蹤合約函數調用過程,程序指令以及分支情況非常之多(下圖是一小部分截圖),讓人難以完全跟上。

智能合約史上最大規模攻擊手法曝光,盤點黑客團伙作案細節

安比(SECBIT)實驗室使用動態追蹤調試技術,結合逆向分析結果與攻擊交易內部記錄,搞清楚了黑客所使用的手法。

智能合約史上最大規模攻擊手法曝光,盤點黑客團伙作案細節

其他攻擊交易也都是類似的過程,黑客調用攻擊合約,攻擊合約再調用提前創建好的合約,進而創建新的合約,以新合約的身份參與 LW 遊戲,買遊戲道具,然後幾乎必定獲得空投獎勵。

這一過程中不斷新建的合約,就是態勢感知系統中預警的大量異常合約創建與自毀。

追蹤攻擊合約調用歷史,發現攻擊者在部署完攻擊合約後,就立即多次調用特定函數,每次新建 10 個新合約。而函數總共恰好調用了 100 次,因此新建了 1000 個新合約(記住這個細節)。

在攻擊交易中,攻擊合約最先調用的就是這預先創建好的 1000 個合約之一,似乎是特地從中挑選出來一個地址。

智能合約:一切皆可預測

攻擊函數控制流程圖(CFG)中一個相隔很遠的循環引起了我們的注意。

我們恍然大悟。攻擊函數所做的就是不斷循環地在 1000 個合約中,挑選合適的地址來完成下一步新建合約操作。所謂合適的地址,就是指能確保每次參與遊戲都能獲得空投獎勵。

前面提到,以太坊智能合約中可以很容易的預測隨機數,因爲隨機數的來源都是區塊或者交易中特定的一些公開參數,如交易發起者地址、區塊時間戳、區塊難度等等。因此空投遊戲利用隨機數來控制中獎概率是不可行的。

而這裏,黑客利用了另一個以太坊的特徵,一個地址(賬戶)創建一個合約,合約地址是可按照特定規則計算得到的,任何人都可以根據已知信息進行推算。

因此,黑客循環利用自己控制的 1000 個合約地址,推算各地址下一次新建的合約地址,而該地址恰恰是空投遊戲中獎數字的隨機源。攻擊合約通過一系列預演推算來篩選出“合適”的地址來完成攻擊操作(技術細節後文會詳細討論)。

這纔是黑客能夠以超高概率獲得空投的真正原因!

技術流:攻擊手法細節披露

類 Fomo3D 遊戲空投漏洞的根本原因在於,以太坊智能合約環境中難以生成無法預測的隨機數。而 Fomo3D 開發者在其合約中增加了「判斷調用者是普通人類還是合約」的邏輯來嘗試規避,但此邏輯實現存在漏洞。黑客利用攻擊合約提前預測隨機數,並通過在構造函數內調用遊戲合約的方法來僞裝成普通人類(非合約)地址,從而大大增加自身中獎概率。

時間再次回到 7 月 23 日,以太坊基金會開發團隊負責人之一 Péter Szilágyi 在 Reddit 上首次公開爆出這個漏洞並給出 1.0 版本的 POC 方案(詳細可以參考引文 [3])。這主要是利用了這些特點:

空投遊戲用來控制中獎概率的隨機源,可被提前獲得

用戶能否獲得空投獎勵以及獎勵金額,可在另外一個合約中提前計算出來,從而決定後面的操縱邏輯
Fomo3D 空投機制中嘗試限制只有非合約地址(普通人類)才能參加遊戲以防止上述情況的發生。但該判斷方法存在漏洞,在構造合約的過程中(即合約構造方法裏)參與遊戲即可繞過該限制。
因此攻擊者可以部署一個智能合約,並在合約的構造方法中計算出自己是否能夠獲益,如果能則投入以太幣參加遊戲空投獲利,否則就不參加(參見下圖)。

智能合約史上最大規模攻擊手法曝光,盤點黑客團伙作案細節

Péter 提出的這個方案只是一個最簡單的原型,因爲每次部署合約都要消耗不少 Gas,而且工作效率很低且收益率並不高,採用該方案攻擊,發起上千筆交易,都不一定能夠真正獲得空投獎勵。

看到這裏你可能會有疑問,上文的攻擊者似乎手法更高明,而且實際成功攻擊的發生時間要早得多。

Zethr 開發者 Etherguy 早在 7 月 8 日就已使用更高明的手法成功獲利,解決了上文 1.0 方案中的部分問題,我們姑且稱之爲 2.0 版本。

這個思路是通過合約循環創建子合約(參見下圖),直到子合約滿足空投條件可以獲利爲止。這樣做的好處是,在 Gas 充足的情況下,每次調用合約幾乎一定可以獲得收益,提高了工作效率。然而這種方案和 1.0 版本的攻擊成本接近,並沒有從本質上提高收益率。

智能合約史上最大規模攻擊手法曝光,盤點黑客團伙作案細節

而這次事件的最大獲利者 BAPT-LW20 團隊,就是在 2.0 版本的思路上進行了進一步優化降低了投入成本,提高了收益率。 3.0 版本則瘋狂創建代理合約,通過利用計算下一步新建合約地址的技巧提前預判,篩選出符合條件的代理合約再創建出新的子合約,在子合約的構造函數中再完成上述攻擊(見下圖)。而且攻擊目標地址可配置,可多人同時協作攻擊。當遊戲獎池金額不足以覆蓋攻擊成本時,發出的攻擊交易會自動提前失敗,僅消耗很低的 Gas 費用。

智能合約史上最大規模攻擊手法曝光,盤點黑客團伙作案細節

在分析各類攻擊合約過程中,我們還見到另外一種更高明的做法:主攻擊合約有着良好的設計模型,支持核心算法動態替換與升級。原理上則是利用了 delegatecall 進行操作。安比(SECBIT)實驗室會持續關注這批黑客的動向。

彩蛋一:空投與挖礦

我們知道在 PoW 挖礦的時候,礦工通常需要進行如下計算:

智能合約史上最大規模攻擊手法曝光,盤點黑客團伙作案細節

當 BlockHash 結果小於當前難度值的時候,代表找到了一個合法的 Nonce。

在 Fomo3D 的空投獎勵裏有着類似挖礦的機制:

智能合約史上最大規模攻擊手法曝光,盤點黑客團伙作案細節

用戶唯一可以操縱的就是 msg.sender 字段,我們是否可以將 msg.sender 作爲 Nonce 來挖礦呢?

答案顯然是可以的,智能合約的地址是根據 發起者賬戶 + nonce 決定的,於是有了第 1 代方法:

智能合約史上最大規模攻擊手法曝光,盤點黑客團伙作案細節

但是這種方式需要用戶持續部署合約,消耗的礦工費代價非常大,且成功率極低,每次都是以 1/1000 的中獎概率在嘗試。

由於第 1 代驚人的失敗率,顯然無法利用,於是有了第 2 代攻擊方法:

這種方法的主要思想是,合約創建的新合約地址由 合約地址+nonce 確定:

智能合約史上最大規模攻擊手法曝光,盤點黑客團伙作案細節

這種方式類似於挖礦,固定區塊頭部,不斷修改 nonce 來試探能否成功獲得獎勵,但是問題在於,如果在循環第 1000 次才發現合法的 nonce,那麼意味着之前部署的 999 個合約都屬於浪費 Gas 的操作。

那麼如何更高效地尋找合法的 nonce 呢?

我們回想比特幣挖礦,一個挖礦任務中,不僅有 nonce,還有 extraNonce [4]。

智能合約史上最大規模攻擊手法曝光,盤點黑客團伙作案細節

在比特幣區塊的 Coinbase 字段中,有一個自由修改的區域,修改這個區域會導致 MerkleRoot 被修改,從而實現 Header 被修改,具有 nonce 的效果,因此被稱作 extraNonce。

爲什麼需要引入 extraNonce 呢?原因在於 nonce 爲 32 bit 數字,搜索範圍只有 2^32,礦機幾乎一瞬間就遍歷完了,通過不斷修改 extraNonce 來擴大本地搜索範圍,我們甚至可以不修改 nonce 只修改 extraNonce 來挖礦。

也許黑客也想到了這一點,他們通過提前部署 1000 個代理合約來實現有 1000 個 extraNonce 的效果。 至此,攻擊方法升級到了第 3 代:

智能合約史上最大規模攻擊手法曝光,盤點黑客團伙作案細節

顯而易見,這種攻擊方式同時實現了 2 個效果:

提升了攻擊成功率
減少了攻擊合約部署數量,大大減少了 Gas 消耗。

彩蛋二:黑客預先創建的合約數量與中獎概率

前文提到黑客預先部署 1000 個代理合約,這個數字有什麼講究呢?

智能合約史上最大規模攻擊手法曝光,盤點黑客團伙作案細節

seed 經由一系列以太坊鏈上環境以及多次 Hash 運算得出。Hash 結果對 1000 取餘數,可以得到 0~999 的僞隨機數。

我們假設哈希輸出結果是均勻的,並且哈希是抗碰撞的,那麼平均每次中獎的概率爲 1/1000。

模擬結果:

智能合約史上最大規模攻擊手法曝光,盤點黑客團伙作案細節

公式運算結果:

智能合約史上最大規模攻擊手法曝光,盤點黑客團伙作案細節

儘管更多合約能夠提供更高的中獎概率,但是需要考慮到 Gas 消耗與 Gas Limit 等因素,不宜過大。

安比(SECBIT)實驗室認爲黑客選擇部署 1000 個合約,是根據概率代碼 1/1000 想當然做出的判斷。

彩蛋三:黑客可能利用了空投概率計算的另一個 bug

黑客仍然需要更高效地攫取利潤,他們甚至發現了 Fomo3D 空投規則在這種攻擊方式下暴露出的缺陷。

攻擊合約需要在最開始獲取空投獎勵信息,作爲後續操作的依據。因此,攻擊合約會先依次調用遊戲合約的兩個查詢接口,分別是 0xd87574e0 airDropPot_() 和 0x11a09ae7 airDropTracker_()。

Fomo3D 空投獎勵的 airDropTracker_ 計算方式爲如下方法:

智能合約史上最大規模攻擊手法曝光,盤點黑客團伙作案細節

Fomo3D 判斷是否能中空投獎勵使用瞭如下方法:

智能合約史上最大規模攻擊手法曝光,盤點黑客團伙作案細節

根據我們分析,0x820d 後期更新的攻擊合約直接去除了對 airDropTracker_ 的判斷,但這樣做其實有利有弊。

尾聲:下一個是誰?

8 月 14 日,BAPT-LW20 黑客團隊的 0x820d 再次部署了兩個新版攻擊合約,這一次他們將炮筒又對準了另一款一天前新部署的不知名合約。

望着大屏幕上 AnChain.ai 態勢感知平臺不斷閃爍的紅點,安比(SECBIT)實驗室和 AnChain.ai 都很清楚,區塊鏈世界裏的戰役還遠遠沒有結束。

2009 年,中本聰創造了一個虛擬的去中心化新世界。這彷彿是一片流着奶和蜜糖的應許之地,人們歡呼雀躍,蜂擁而至。但與所有的生態系統一樣,新世界有生命,就有捕食者。有交易者,就有黑客。區塊鏈上的應用在進化,攻擊者也同樣,我們給大家展示的是區塊鏈世界不爲人知的另一面,暗流湧動。意料之外,也在意料之中。

BAPT-LW20 & BAPT-F3D 大事件時間表:
2018/07/06 Fomo3D 遊戲合約上線
2018/07/08 Zethr 核心開發者 Etherguy 發現並利用空投漏洞
2018/07/20 Fomo3D 遊戲在國內走紅
2018/07/20 BAPT-LW20 黑客團隊地址開始活躍
2018/07/21 BAPT-LW20 團隊第一次成功利用 Fomo3D 空投漏洞
2018/07/23 BAPT-LW20 團隊攻擊山寨遊戲⽼鼠會 RatScam
2018/07/23 Péter 在 Reddit 爆料 Fomo3D 空投漏洞
2018/07/24 安比(SECBIT)實驗室發佈 Fomo3D 及山寨版遊戲空投漏洞預
2018/07/24 BAPT-LW20 黑客團隊攻擊 FoMoGame
2018/07/26 BAPT-LW20 黑客團隊部署新版攻擊合約 0x5483
2018/08/06 類 Fomo3D 遊戲 Last Winner 上線
2018/08/07 LW 遊戲開始火爆
2018/08/07 BAPT-LW20 黑客團隊開始攻擊 LW 遊戲
2018/08/09 以太坊未確認交易數創年內新高
2018/08/10 凌晨 AnChain.ai 態勢感知系統發出預警
2018/08/10 安比(SECBIT)實驗室與 AnChain.ai 聯手開展調查
2018/08/10 BAPT-LW20 黑客團隊轉移舊合約中資金,使用新版合約繼續開展攻擊
2018/08/11 完成 BAPT-LW20 攻擊時間線復原
2018/08/12 完成 BAPT-LW20 攻擊手法復原
2018/08/13 針對更多攻擊源分析
2018/08/13 完成 BAPT-F3D 和 BAPT-LW20 攻擊數據全景分析,黑客獲利超 5000 Ether
2018/08/14 BAPT-LW20 黑客團隊再次部署新版攻擊合約,開始攻擊一個不知名合約
2018/08/17 BAPT-LW20 黑客團隊奪取 LW 最終大獎 7754 Ether
2018/08/17 安比(SECBIT)實驗室完成 BAPT-LW20 攻擊事件報告

參考文獻
[1] 區塊律動:8 萬筆交易「封死」以太坊網絡,只爲搶奪 Fomo3D 大獎?https://mp.weixin.qq.com/s/5nrgj8 sIZ0SlXebG5 sWVPw
[2] Pwning Fomo3D Revealed: Iterative, Pre-Calculated Contract Creation For Airdrop Prizes!, https://peckshield.com/2018/07/24/fomo3d/
[3] Péter Szilágyi 提出的空投漏洞利用 POC,https://www.reddit.com/r/ethereum/comments/916xni/how_to_pwn_fomo3d_a_beginners_guide/, 2018/07/23
[4] AsicBoost – A Speedup for Bitcoin Mining, https://arxiv.org/pdf/1604.00575.pdf, 2016/03/31
以上數據均由安比(SECBIT)實驗室和 AnChain.ai 提供,合作交流請聯繫 [email protected]