來源:安比實驗室
做者:安比(SECBIT)實驗室 & AnChain.ai算法
安比(SECBIT)實驗室創始人郭宇:2009年,中本聰創造了一個虛擬的去中心化新世界。這彷彿是一片流着奶和蜜糖的應許之地,人們歡呼雀躍,蜂擁而至。但與全部的生態系統同樣,新世界有生命,就有捕食者。有交易者,就有黑客。區塊鏈上的應用在進化,攻擊者也一樣,咱們給你們展現的是區塊鏈世界鮮爲人知的另外一面,暗流涌動。意料以外,也在乎料之中。安全
Last Winner(類 Fomo3D)遊戲大火,致使以太坊異常擁堵,Gas 費用暴漲。大量以太幣資金入場。微信
北京時間 2018 年 8 月 10 日凌晨 1:38,加州時間 9 日上午 10:38,安比(SECBIT)實驗室收到合做夥伴美國硅谷 AnChain.ai 公司消息,基於 AI 的態勢感知系統發出預警信息,發現部分遊戲合約出現大量交易而且存在異常的資金流動狀況。安比(SECBIT)實驗室的小夥伴趕忙根據最新線索,對相關合約和交易進行觀察、跟蹤、分析。網絡
安比(SECBIT)實驗室由中國科學技術大學博士郭宇建立,從密碼學、代碼語義、形式化驗證、博弈論、編譯器等多種理論角度切入,在智能合約安全技術上開展全方位深刻研究。ide
AnChain.ai 由辛辛那提大學計算機博士方春生 Victor Fang 建立,方博士是硅谷上市網絡安全公司 FireEye 史上第一位首席數據科學家,負責 AI 產品研發。AnChain.ai 專一安全威脅情報、區塊鏈態勢感知,憑藉 AI 技術助力區塊鏈生態安全。函數
下文敏感地址只保留前 4 位。片尾有三個彩蛋,智能合約愛好者請不要錯過。工具
悄然上線:莫名火爆的 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 的這些地址,有着相似的行爲模式。
如:
不停地往某合約地址上發起交易,同時附帶 0.1 個以太幣
很多交易狀態爲失敗
成功的交易又會涉及大量「內部交易」
「內部交易」調用邏輯十分複雜,並伴隨大量合約的建立和自毀
安比(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 日,帳戶中的初始以太幣均由 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 以太幣。
而這個地址正是 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 = 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]。
在比特幣區塊的 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。
模擬結果:
公式運算結果:
儘管更多合約可以提供更高的中獎機率,可是須要考慮到 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 再次部署了兩個新版攻擊合約,這一次他們將炮筒又對準了另外一款一天前新部署的不知名合約。
望着大屏幕上 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/5nrgj8sIZ0SlXebG5sWVPw
[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 提供,合做交流請聯繫info@secbit.io。
安比(SECBIT)實驗室
安比(SECBIT)實驗室專一於區塊鏈與智能合約安全問題,全方位監控智能合約安全漏洞、提供專業合約安全審計服務,在智能合約安全技術上開展全方位深刻研究,致力於參與共建共識、可信、有序的區塊鏈經濟體。
安比(SECBIT)實驗室創始人郭宇,中國科學技術大學博士、耶魯大學訪問學者、曾任中科大副教授。專一於形式化證實與系統軟件研究領域十餘年,具備豐富的金融安全產品研發經驗,是國內早期關注並研究比特幣與區塊鏈技術的科研人員之一。研究專長:區塊鏈技術、形式化驗證、程序語言理論、操做系統內核、計算機病毒。