• <option id="cacee"><noscript id="cacee"></noscript></option>
  • <table id="cacee"><noscript id="cacee"></noscript></table>
  • <td id="cacee"></td>
  • <option id="cacee"></option>
  • <table id="cacee"></table>
  • <option id="cacee"><option id="cacee"></option></option>
  • <table id="cacee"><source id="cacee"></source></table><td id="cacee"><rt id="cacee"></rt></td>
    <option id="cacee"><option id="cacee"></option></option>
     找回密碼
     立即注冊

    掃一掃,登錄網站

    首頁 自媒體 查看內容
    • 3499
    • 0
    • 分享到

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

    2018-8-21 09:04

    來源: SECBIT

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

    安比(SECBIT)實驗室創始人郭宇: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 位。片尾有三個彩蛋,智能合約愛好者請不要錯過。


      悄然上線  
    莫名火爆的 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 日,賬戶中的初始以太幣均由 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)實驗室會持續關注這批黑客的動向。

    1

    彩蛋

    空投與挖礦

    我們知道在 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 消耗。



    2

    彩蛋

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

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

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

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

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

    模擬結果:

    公式運算結果:

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

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

    3

    彩蛋

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

    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 Pe?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)實驗室提供

    版權申明:本內容來自于互聯網,屬第三方匯集推薦平臺。本文的版權歸原作者所有,文章言論不代表鏈門戶的觀點,鏈門戶不承擔任何法律責任。如有侵權請聯系QQ:3341927519進行反饋。
    相關新聞
    發表評論

    請先 注冊/登錄 后參與評論

      回頂部
    • <option id="cacee"><noscript id="cacee"></noscript></option>
    • <table id="cacee"><noscript id="cacee"></noscript></table>
    • <td id="cacee"></td>
    • <option id="cacee"></option>
    • <table id="cacee"></table>
    • <option id="cacee"><option id="cacee"></option></option>
    • <table id="cacee"><source id="cacee"></source></table><td id="cacee"><rt id="cacee"></rt></td>
      <option id="cacee"><option id="cacee"></option></option>
      妖精视频