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

張希 2018-08-20 12:01
分享到:
導讀

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

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

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

安比(SECBIT)實驗室由中國科學技術大學博士郭宇創建,從密碼學、代碼語義、形式化驗證、博弈論、編譯器等多種理論角度切入,在智能合約安全技術上開展全方位深入研究。

AnChain.ai 由辛辛那提大學計算機博士方春生 Victor Fang 創建,方博士是硅谷上市網絡安全公司 FireEye 史上第一位首席數據科學家,負責 AI 產品研發。AnChain.ai 專注安全威脅情報、區塊鏈態勢感知,憑借 AI 技術助力區塊鏈生態安全。

下文敏感地址只保留前 4 位。片尾有三個彩蛋,智能合約愛好者請不要錯過。

image.png

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

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

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

image.png

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

瘋狂的現象級游戲背后暗流涌動。

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

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

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

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

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

image.png

顯然,這是一款針對中國人的游戲,有著誘人的推廣(拉下線)獎勵,因此在網絡上廣為傳播。并且,這款游戲有適配安卓和 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%,可能存在同樣漏洞。隨著游戲火爆進行,機敏的黑客肯定也聞風而動。

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

image.png

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

圖中的這些可疑地址,如同“病毒”一般緊緊纏繞在 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 發起攻擊。

same-txn-in

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

image.png

這十分神奇,攻擊者投入 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 游戲最火爆的時間段。隨著游戲進入后期,入場資金急劇下降,收益降低,黑客也不得不也降低了攻擊頻率。

hour-txn

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

image.png

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

image.png

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

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

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

fomo-vs-lw

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

0x820d 在收到來自 0x73B6 的 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(0x86D179c28cCeb120Cd3f64930Cf1820a88B77D60) 的山寨游戲,部署新合約(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 以太幣。

real-winner

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

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

attack-and-play

安比(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%(見下圖)。

first-pwn-by-etherguy

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

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

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

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

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

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

pwn-calldata

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

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

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

cfg

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

internal-txns

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

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

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

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

智能合約:一切皆可預測

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

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

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

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

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

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

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

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

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

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

  • 用戶能否獲得空投獎勵以及獎勵金額,可在另外一個合約中提前計算出來,從而決定后面的操縱邏輯

  • Fomo3D 空投機制中嘗試限制只有非合約地址(普通人類)才能參加游戲以防止上述情況的發生。但該判斷方法存在漏洞,在構造合約的過程中(即合約構造方法里)參與游戲即可繞過該限制。

因此攻擊者可以部署一個智能合約,并在合約的構造方法中計算出自己是否能夠獲益,如果能則投入以太幣參加游戲空投獲利,否則就不參加(參見下圖)。

image.png

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

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

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

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

image.png

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

image.png

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

彩蛋一:空投與挖礦

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

BlockHash = Hash(Header Nonce) Check(BlockHash < Diff)

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

在 Fomo3D 的空投獎勵里有著類似挖礦的機制:

function airdrop() private view returns(bool) {  uint256 seed = uint256(keccak256(abi.encodePacked( (block.timestamp).add (block.difficulty).add ((uint256(keccak256(abi.encodePacked(block.coinbase)))) / (now)).add (block.gaslimit).add ((uint256(keccak256(abi.encodePacked(msg.sender)))) / (now)).add (block.number))));  if((seed - ((seed / 1000) * 1000)) < airDropTracker_)    return(true);  else    return(false); }

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

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

                      創建合約 用戶(地址 nonce0) --------------------> 新合約(嘗試攻擊) 用戶(地址 nonce1) --------------------> 新合約(嘗試攻擊) 用戶(地址 nonce2) --------------------> 新合約(嘗試攻擊) 用戶(地址 nonce3) --------------------> 新合約(嘗試攻擊)

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

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

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

    部署合約   |------------------| hash(caddr, nonce) 用戶 ----------> |循環創建合約,     | -------> 新合約(嘗試攻擊)                 |直到攻擊成功或到達終 | -------> 新合約(嘗試攻擊)                 |止條件才停止,可能需 | -------> 新合約(嘗試攻擊)                 |要部署大量合約。   | -------> 新合約(嘗試攻擊)                 |----------------- |

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

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

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

bitcoin

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

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

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

部署合約 用戶 --------------------------------------> 管理合約 C      調用合約C,預先創建代理合約(extraNonce) 用戶 --------------------------------------> 1000個代理合約      調用合約C,循環嘗試可以成功攻擊的代理合約 用戶 --------------------------------------> 部署合約(嘗試攻擊)

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

  • 提升了攻擊成功率

  • 減少了攻擊合約部署數量,大大減少了 Gas 消耗。

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

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

if((seed - ((seed / 1000) * 1000)) < airDropTracker_)

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

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

模擬結果:

probability-sim

公式運算結果:

probability-calculate

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

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

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

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

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

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

if (_eth >= 100000000000000000) {    airDropTracker_  ;    if (airdrop() == true)     {...} }

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

if((seed - ((seed / 1000) * 1000)) < airDropTracker_)  return(true);

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

如果你了解細節,猜出了黑客的用意,或者知曉這種做法的優缺點,歡迎添加小安同學微信(secbit_xiaoanbi),她會把你加入到「SECBIT 智能合約安全技術討論」的群里。

尾聲:下一個是誰?

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

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

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


合約 游戲 攻擊 黑客 地址
分享到:

1.TMT觀察網遵循行業規范,任何轉載的稿件都會明確標注作者和來源;
2.TMT觀察網的原創文章,請轉載時務必注明文章作者和"來源:TMT觀察網",不尊重原創的行為TMT觀察網或將追究責任;
3.作者投稿可能會經TMT觀察網編輯修改或補充。


專題報道