智能合約史上最大規(guī)模攻擊手法曝光,盤點黑客團(tuán)伙作案細(xì)節(jié)區(qū)塊鏈
2009年,中本聰創(chuàng)造了一個虛擬的去中心化新世界。這仿佛是一片流著奶和蜜糖的應(yīng)許之地,人們歡呼雀躍,蜂擁而至。但與所有的生態(tài)系統(tǒng)一樣,新世界有生命,就有捕食者。有交易者,就有黑客。區(qū)塊鏈上的應(yīng)用在進(jìn)化,攻擊者也同樣,我們給大家展示的是區(qū)塊鏈?zhǔn)澜绮粸槿酥牧硪幻妫盗饔縿印R饬现猓苍谝饬现小?/p>
Last Winner(類 Fomo3D)游戲大火,導(dǎo)致以太坊異常擁堵,Gas 費用暴漲。大量以太幣資金入場。
北京時間 2018 年 8 月 10 日凌晨 1:38,加州時間 9 日上午 10:38,安比(SECBIT)實驗室收到合作伙伴美國硅谷 AnChain.ai 公司消息,基于 AI 的態(tài)勢感知系統(tǒng)發(fā)出預(yù)警信息,發(fā)現(xiàn)部分游戲合約出現(xiàn)大量交易并且存在異常的資金流動情況。安比(SECBIT)實驗室的小伙伴趕緊根據(jù)最新線索,對相關(guān)合約和交易進(jìn)行觀察、跟蹤、分析。
安比(SECBIT)實驗室由中國科學(xué)技術(shù)大學(xué)博士郭宇創(chuàng)建,從密碼學(xué)、代碼語義、形式化驗證、博弈論、編譯器等多種理論角度切入,在智能合約安全技術(shù)上開展全方位深入研究。
AnChain.ai 由辛辛那提大學(xué)計算機(jī)博士方春生 Victor Fang 創(chuàng)建,方博士是硅谷上市網(wǎng)絡(luò)安全公司 FireEye 史上第一位首席數(shù)據(jù)科學(xué)家,負(fù)責(zé) AI 產(chǎn)品研發(fā)。AnChain.ai 專注安全威脅情報、區(qū)塊鏈態(tài)勢感知,憑借 AI 技術(shù)助力區(qū)塊鏈生態(tài)安全。
下文敏感地址只保留前 4 位。片尾有三個彩蛋,智能合約愛好者請不要錯過。
悄然上線:莫名火爆的 Last Winner
Last Winner 是一款基于以太坊智能合約的 DApp 游戲,于 8 月 6 日上線,這款游戲一經(jīng)推出,就“異常”火爆。
這款游戲合約地址為 0xDd9fd6b6F8f7ea932997992bbE67EabB3e316f3C。據(jù) Etherscan 顯示,短短六天時間內(nèi),該游戲合約就已產(chǎn)生 27 萬余筆交易。甚至前段時間以太坊網(wǎng)絡(luò)大擁堵也與 Last Winner 游戲密切相關(guān)。8 月 8 日 和 9 日,在 Last Winner 和 Fomo3D 超大規(guī)模交易量的共同作用下,以太坊未確認(rèn)交易數(shù)量創(chuàng)年內(nèi)新高,平均 Gas 費用一度飆升至正常 10 倍以上。
該游戲第一輪獎池金額為 1.6 萬多個以太幣,而玩家總投資額更超過 10 萬以太幣,資金量巨大。目前游戲第一輪已結(jié)束,第二輪獎金池已迅速累積至 7000 多以太幣。
瘋狂的現(xiàn)象級游戲背后暗流涌動。
疑團(tuán)重重:前期大量參與者的資金來歷不明
據(jù)知名媒體「區(qū)塊律動」報道,Last Winner 由名為「蟻群傳播」的資金盤傳銷組織推廣運營,有著數(shù)量眾多的會員和極強(qiáng)的推廣拉下線能力 [1]。而據(jù)另一款火爆游戲 Fomo3D 開發(fā)團(tuán)隊稱,Last Winner 是仿 Fomo3D 游戲,其背后運營團(tuán)隊準(zhǔn)備了 20 萬 ETH 來進(jìn)行自動刷量交易。因此,Last Winner 游戲火爆的背后,可能是一場精心布局的傳銷游戲,初期利用機(jī)器人發(fā)起批量交易,偽造活躍假象,吸引新韭菜入場。
Last Winner 游戲合約存在大量非正常交易,并且伴隨著大量合約的創(chuàng)建與自毀,與正常人類調(diào)用行為特征偏離很大,這引起了我們的高度警惕。
瘋狂推廣:只面向國人,合約源碼卻未公開
在各大論壇、媒體、以及微信群中,都可以見到 Last Winner 游戲的推廣文章,而這些文章有著類似的描述,并且都附上推廣邀請碼。但 Last Winner 英文相關(guān)資料非常少。
顯然,這是一款針對中國人的游戲,有著誘人的推廣(拉下線)獎勵,因此在網(wǎng)絡(luò)上廣為傳播。并且,這款游戲有適配安卓和 iPhone 手機(jī)的 App,簡化了使用操作,降低了參與門檻。
但是,十分可疑的是,作為一款基于智能合約的區(qū)塊鏈游戲,Last Winner 居然沒有公開合約源代碼!這是一個非常危險的信號。為何這樣一個游戲能這么火爆,吸引這么多人參加?
我們直覺上感到這款游戲到處透露著詭異的氣息。
安全性存疑:實則是 Fomo3D 山寨版
Last Winner 官方宣傳語寫道:Last Winner(LW)是首款完全去中心化的類 Fomo3D 游戲 DApp,完全基于以太坊智能合約原生開發(fā)。只要下載安裝 App 就可參與游戲。
類 Fomo3D 游戲,且未公開源代碼,這不得不讓人產(chǎn)生懷疑。要知道,短短時間內(nèi)原創(chuàng)開發(fā)一個好玩又安全的 DApp 游戲難度非常大。
安比(SECBIT)實驗室迅速使用內(nèi)部工具逆向分析了 Last Winner 的合約代碼(字節(jié)碼)。果不其然,這款游戲合約代碼函數(shù)名稱與 Fomo3D 高度相似,疑似直接拷貝(抄襲)了 Fomo3D 的源碼,但卻又新增了 10 余個可疑未知函數(shù)。
盡管 Fomo3D 在 Etherscan 公開了源代碼,但這并不代表它開源給任何人隨意使用。
安比(SECBIT)實驗室之前報道過:在 Fomo3D 爆紅之后,各類山寨版 Fomo3D 層出不窮。之前這些山寨版游戲往往復(fù)制 Fomo3D 官網(wǎng)和合約源碼,并可疑地在一些地方進(jìn)行修改。而 Last Winner 在此基礎(chǔ)上更進(jìn)一步,推出移動客戶端,并瘋狂推廣,卻不公開智能合約源代碼。
智能合約游戲或 DApp 的亮點之一就是公開透明。Last Winner 游戲則完全違背了這一點,動機(jī)十分可疑,參與該類游戲的風(fēng)險極高!
當(dāng)時嚴(yán)峻的形勢是:一方面有多個地址疑似瘋狂發(fā)起攻擊交易,另一方面項目方游戲合約未公開源碼,高度可疑卻吸引了巨量資金。我們感覺到態(tài)勢十分緊急,于是迅速開展分工合作。AnChain.ai 中美團(tuán)隊日夜交替分析和監(jiān)控異常交易,收集證據(jù),定位攻擊來源與攻擊規(guī)模。
安比(SECBIT)實驗室的小伙伴們則兵分兩路,分別開展對不透明游戲合約和黑客攻擊手法的逆向分析。
前情回顧:類 Fomo3D 游戲空投機(jī)制存漏洞
Fomo3D 游戲參與形式是用以太幣購買游戲道具,除了最后一個購買的人可以獲得巨額大獎外,平時參與者還有機(jī)會獲得“空投”獎勵。
這里有主獎池和副獎池的概念,最終的巨額大獎和空投獎勵分別從從主獎池和副獎池中獲取。
所有進(jìn)入游戲的以太幣,有 1% 數(shù)量會進(jìn)到副獎池。每一次購買道具都會有概率獲得空投。空投的概率從 0% 開始,每增加一筆不小于 0.1 ETH 銷售訂單,空投概率會增加 0.1%。同時空投獎金額與購買金額也掛鉤,如果購買 0.1 ~ 1 ETH,就有概率贏得 25% 副獎池獎金,購買更多則比例越大。
一進(jìn)入游戲界面,就會看到鮮明提示,通知當(dāng)前中獎概率和獎池金額。這一設(shè)計,原本是想增加游戲趣味性,并起到吸引資金入場、延長游戲時間的作用。但實際情況卻并非如此。
通過觀察 LastWinner 游戲合約以及部分地址的異常交易行為,我們心中有了初步答案。
讓我們把時間退回到 20 多天前,早在 7 月 24 日,安比(SECBIT)實驗室和派盾(PeckShield)科技分別同時預(yù)警:Fomo3D 游戲的智能合約存在隨機(jī)數(shù)漏洞可被利用,F(xiàn)omo3D 及所有抄襲源碼的山寨合約均存在該安全漏洞 [2]。原本設(shè)計上隨機(jī)性較大的空投游戲可通過特殊手段操縱,大大提高中獎概率。
經(jīng)安比(SECBIT)實驗室字節(jié)碼智能掃描工具逆向分析,Last Winner 游戲空投獎勵代碼與 Fomo3D 基本一致,相似度達(dá) 91%,可能存在同樣漏洞。隨著游戲火爆進(jìn)行,機(jī)敏的黑客肯定也聞風(fēng)而動。
不能說的秘密:黑客制造秘密武器攫取高額收益
在區(qū)塊鏈態(tài)勢感知系統(tǒng)所展現(xiàn)出來的數(shù)據(jù)面前,我們不由地倒吸一口涼氣。
圖中的這些可疑地址,如同“病毒”一般緊緊纏繞在 Last Winner 合約四周,肆意吞噬著 Last Winner 內(nèi)的資金。
我們觀察到,圖中緊靠 Last Winner 的這些地址,有著類似的行為模式。
如:
1.不停地往某合約地址上發(fā)起交易,同時附帶 0.1 個以太幣
2.不少交易狀態(tài)為失敗
3.成功的交易又會涉及大量“內(nèi)部交易”
4.“內(nèi)部交易”調(diào)用邏輯十分復(fù)雜,并伴隨大量合約的創(chuàng)建和自毀
安比(SECBIT)實驗室迅速得出初步結(jié)論:這些不明合約就是黑客用來攻擊 Last Winner 的秘密武器,黑客正是通過這些合約,持續(xù)吸走 Last Winner 游戲內(nèi)的以太幣。
案發(fā)現(xiàn)場:大量類似交易,超高回報率
上面態(tài)勢感知圖中,占地面積最大的嫌疑地址引起了我們的注意:0xae58,于是從這個地址展開了追蹤。
8 月 9 號當(dāng)天,0xae58 地址內(nèi)以太幣余額就以超過 300 個,而當(dāng)時他正在大量往地址 0x5483 上發(fā)起交易,每筆交易轉(zhuǎn)賬金額都是 0.1 Ether。顯然,黑客正通過 0x5483 智能合約向 LW 發(fā)起攻擊。
讓我們觀察下面這條狀態(tài)顯示為成功的交易。表面上看是 0xae58 向攻擊合約 0x5483 轉(zhuǎn)了 0.1 Ether,實際卻涉及了一大堆地址間的相互轉(zhuǎn)賬,最終隨著 0x7c77 合約自毀,0.189 個 Ether 轉(zhuǎn)移回 0xae58 的賬戶中。
這十分神奇,攻擊者投入 0.1 個以太幣,最終收獲 0.189 個,瞬間回報率高達(dá) 89%,簡直暴利。
我們很快發(fā)現(xiàn),除了 0xae58 地址外,還有四個地址也持續(xù)不斷地向 0x5483 合約發(fā)起類似交易,持續(xù)獲得高額回報。
而失敗的交易,僅消耗 27712 燃料(Gas),成本損耗十分低。
研究目標(biāo)立刻鎖定為攻擊合約 0x5483。由于無法獲得源碼,安比(SECBIT)實驗室立刻使用內(nèi)部工具展開逆向分析。
暴利:數(shù)據(jù)面前我們再次震驚
8 月 13 日,當(dāng)我們沉浸在研究黑客的攻擊合約各種細(xì)節(jié)優(yōu)化和精巧設(shè)計之時,黑客攻擊數(shù)據(jù)全景分析新鮮出爐。
其中,攻擊獲利最大的是以 0x820d 地址為首的團(tuán)隊。他們累計獲利超過 5000 個以太幣。AnChain.ai 團(tuán)隊和安比(SECBIT)實驗室將該黑客團(tuán)伙精確定位,并將其命名為 BAPT-LW20 (Blockchain APT – Last Winner)。
BAPT-LW20 團(tuán)隊在短短 6 天時間內(nèi),共發(fā)送將近 5 萬筆交易,從中攫取 5194 個 Ether,獲利價值將近 1200 萬人民幣。
由下圖每小時發(fā)起的攻擊交易數(shù)量趨勢圖(下圖),我們可以看出攻擊的高峰期發(fā)生在 8 月 8 日 ~ 10 日,每小時平均攫取將近 100 以太幣,將近 22 萬人民幣。這正好也是 LW 游戲最火爆的時間段。隨著游戲進(jìn)入后期,入場資金急劇下降,收益降低,黑客也不得不也降低了攻擊頻率。
再看看黑客每小時攫取以太幣數(shù)量趨勢圖(下圖)。慘淡的漫漫熊市里,黑客卻在狂賺以太幣。
下圖是“Last Winner 中黑客的交易量占比和攫取 ETH 占比”,可見黑客發(fā)送的交易量只占總交易量的 9.877%,但是去攫取了Last Winner獎金池中49%的獎金。黑客的嫻熟攻擊技能,為他們帶來了普通玩家難以企及的好運,而普通玩家在這場游戲里面幾乎很難獲得空投獎勵。
火線追兇:BAPT-LW20 團(tuán)隊攻擊 LW 始末
安比(SECBIT)實驗室嘗試追蹤復(fù)原 BAPT-LW20 團(tuán)隊攻擊時間線。
下圖是 BAPT-LW20 團(tuán)隊某賬戶余額變動情況。
0x820d 是 BAPT-LW20 團(tuán)隊所有攻擊合約的部署者,也是攻擊的實施者之一,可認(rèn)為是 BAPT-LW20 團(tuán)隊的隊長。0x820d 地址最早活躍于 7 月 20 日,賬戶中的初始以太幣均由 0x73B6 地址轉(zhuǎn)入。而 0x73B6 也是同一天開始活躍的新地址,它的初始以太幣來自總部位于美國舊金山的 Kraken 交易所。
0x820d 在收到來自 0x73B6 的 10 個以太幣后,隨即部署了它的第一個合約。可能有些地方不太理想,他并沒有繼續(xù)使用該合約。三分鐘后,0x820d 部署下了第二個合約,攻擊對象是 Fomo3D。在一組準(zhǔn)備工作設(shè)置、若干次失敗的調(diào)用以及兩次雖然成功但卻沒有收益的嘗試過后,0x820d 應(yīng)該是發(fā)現(xiàn)了攻擊合約里的 bug 和優(yōu)化空間。
在接下來的 14 個小時內(nèi),他依次部署了 8 個合約進(jìn)行攻擊測試,無奈都不成功。終于在第 9 個合約 0xBad7 中首次完成攻擊,以 0.1 ETH 的投入換回了 0.125 ETH。
0xBad7 是 0x820d 團(tuán)隊首個可以正常工作的攻擊合約,他們在 7 月 21 日至 7 月 23 日三天時間內(nèi)總計調(diào)用該合約 11551 次,小有斬獲。
7 月 23 日,0x820d 又部署了新的合約,將攻擊對象轉(zhuǎn)移為另一款 Fomo3D 山寨游戲老鼠會 RatScam (0x5167350d082c9ec48ed6fd4c694dea7361269705),0x820d 團(tuán)隊在一天時間內(nèi)使用了 2299 次攻擊合約。
一天后,0x820d 又找到了新目標(biāo),一個名為 FoMoGame(0x86D179c28cCeb120Cd3f64930Cf1820a88B77D60) 的山寨游戲,部署新合約(0xb599)進(jìn)行攻擊。這款游戲知名度不高,入場資金并不多,黑客調(diào)用了 126 次之后就放棄。
接下來的三天內(nèi),0x820d 前后部署了 10 個新合約進(jìn)行優(yōu)化與攻擊測試。
終于,在 7 月 26 日上線了他們的新版攻擊合約(0x5483)。該合約總共發(fā)生過 23835 筆交易,最近一次活躍時間在 8 月 10 號(7 天前)。這款攻擊合約,可由攻擊者 自定義受害游戲合約地址。因此 0x820d 在接下來的幾天內(nèi),持續(xù)混合攻擊 Fomo3D 原版、RatScam、FoMoGame 等游戲,并持續(xù)觀察其他山寨游戲的動態(tài),等待時機(jī)。同時,繼續(xù)部署若干個新合約進(jìn)行調(diào)優(yōu)測試。
終于,8 月 6 日 Last Winner 游戲上線,24 小時后 0x820d 團(tuán)隊就使用準(zhǔn)備好的 0x5483 合約,針對 Last Winner 發(fā)起第一次攻擊,并在接下來的 4 天內(nèi)集中力量,瘋狂利用空投漏洞展開攻勢。
8 月 10 日,0x820d 調(diào)用 0x5483 攻擊合約 withdraw 接口,提走了里面的余額,攻擊疑似暫停。
原來,他們早已經(jīng)部署了新版合約攻擊合約 0x9C10,又發(fā)起了超過 30000 筆交易,至今仍在活躍攻擊。
不僅僅是空投:BAPT-LW20 黑客團(tuán)隊拿走 LW 最終大獎
北京時間 8 月 17 日上午,Last Winner 游戲第一輪最終結(jié)束,最終大獎由 0x5167 地址獲得,獎金額總計 7,754 以太幣。
而這個地址正是 BAPT-LW20 黑客團(tuán)隊的五個地址之一。
如下圖,14 小時前,黑客還在利用攻擊合約獲取空投獎勵。隨后,他改變了方案,直接用自身地址購買道具參與游戲,不斷嘗試奪取最終大獎。在此之后,又繼續(xù)調(diào)用合約攻擊 LW 游戲。
安比(SECBIT)實驗室猜測黑客潛伏很久,早已做好充分的準(zhǔn)備,長時間利用腳本監(jiān)控 LW 游戲狀態(tài),最終才能在眾人放松警惕之時獲得大獎。
BAPT-LW20 黑客團(tuán)隊利用空投漏洞獲利超 5,194 Ether,同時又奪取最終大獎 7,754 Ether,累計獲利 12,948 Ether。
同行相殺:Zethr 團(tuán)隊兩天時間就成功利用漏洞
這場超大規(guī)模的類 Fomo3D 智能合約游戲被攻擊事件,攻擊者使用的秘密武器也正是智能合約。
據(jù)安比(SECBIT)實驗室調(diào)查分析,0x20C9 地址最先成功利用原版 Fomo3D 空投漏洞并獲取獎勵。我們將他定位,并將其命名為 BAPT-LW10。
0x20C9 于 7 月 8 日 10 點 07 分創(chuàng)建了攻擊合約 0xe7ce,在接下來的十分鐘內(nèi),前后調(diào)用了三次,最終在第四次時成功獲得獎勵,投入 0.1 以太幣,收回 0.19 個,回報率高達(dá) 90%(見下圖)。
此后,0x20C9 繼續(xù)部署多個攻擊合約,進(jìn)行調(diào)試優(yōu)化。最終,在 7 月 23 日部署了最終版本 0x39ac 攻擊合約,接下來的時間前后調(diào)用過 90 余次,而攻擊對象涉及 Fomo3D 原版、Last Winner 以及其他山寨版 Fomo3D。
據(jù)我們觀察,0x20C9 是最早研究并成功利用空投漏洞的黑客。研究過程中,安比(SECBIT)實驗室發(fā)現(xiàn) 0x20C9 與另一款游戲 Zethr 密切關(guān)聯(lián)。
最終我們在 Zethr 游戲合約代碼中發(fā)現(xiàn)了他的身影。他是熱門游戲 Zethr 的八位核心開發(fā)者之一,代號為 Etherguy。
顯然,作為 DApp 游戲開發(fā)同行,Etherguy 以及他所在的 Zethr 團(tuán)隊很早就研究了 Fomo3D 項目代碼。Fomo3D 合約 7 月 6 日部署上主網(wǎng),Etherguy 兩天后就發(fā)現(xiàn)并成功利用了漏洞。從調(diào)用規(guī)模來看,Etherguy (BAPT-LW10) 應(yīng)該主要還是出于研究目的,并沒有太多獲利。
讓其他黑客獲利最多的正是 Last Winner 游戲。
游戲細(xì)節(jié):Last Winner 為何讓黑客如此瘋狂
從最初 Fomo3D 上線后不久,空投漏洞就已被人發(fā)現(xiàn)并成功利用。隨著游戲的廣泛傳播,以及該漏洞被逐漸披露,空投漏洞的攻擊手段也在這一過程中不斷升級進(jìn)化,最終部分黑客團(tuán)隊完成了精巧的攻擊方案,可低成本、高效率獲得獎勵,并可大規(guī)模工程化地攻擊任意任何同類游戲合約,瘋狂收割以太幣。
據(jù)安比(SECBIT)實驗室分析,除 LW 游戲以外,不少黑客團(tuán)隊都曾嘗試攻擊其他類 Fomo3D 游戲合約。但獲利都遠(yuǎn)小于 BAPT-LW20 團(tuán)隊在 LW 游戲中所得。
我們試圖從 LW 游戲本身尋找答案。
LW 游戲是 Fomo3D 山寨版,本身沒有太多創(chuàng)新,但入場資金完全集中在游戲開始后的第 2 天至第 5 天內(nèi)。巨量入場資金,會讓游戲空投獎池迅速累積,因此這段時間也是黑客攻擊的黃金時機(jī)。
更要命的是,Last Winner 團(tuán)隊修改了空投游戲參數(shù),使進(jìn)入副獎池(空投獎池)的以太幣比例由 1% 調(diào)整到 10%,相當(dāng)于空投獎勵金高了 10 倍!
一方面,游戲運營團(tuán)隊可能是利用高額空投獎勵吸引用戶瘋狂加入;另一方面,他們可能并不知道空投漏洞的嚴(yán)重性,而提高獎勵比例則會讓該問題進(jìn)一步放大。
Last Winner 游戲簡直成為了黑客的提款機(jī)!
特別地,前面提到 Last Winner 游戲第一輪入場資金已達(dá) 10 萬以太幣,這也就是說,單單這一款游戲就有超過 1 萬個以太幣都持續(xù)暴露在被攻擊的風(fēng)險下,成為黑客的囊中之物。要知道,這款游戲第一輪最終獎池也才 1.6 萬余以太幣。本來空投獎勵都是很小的金額,但黑客持續(xù)利用空投漏洞,積少成多,終成 Last Winner 最大贏家。
我們追蹤到有多個團(tuán)隊對 Fomo3D 及山寨合約開展大規(guī)模自動化攻擊,企圖攫取利益。
而 BAPT-LW20 團(tuán)隊在游戲開始后 24 小時左右就加入了戰(zhàn)局,并迅速擴(kuò)大作戰(zhàn)規(guī)模,最終占得先機(jī),獲取巨額收益。
安比(SECBIT)實驗室追蹤到還有其他黑客團(tuán)隊向 Last Winner 合約開展攻擊。部分黑客 8 月 11 號以后才入局,雖規(guī)模也很大,但終究因為錯過黃金時機(jī)而獲利較少。
攻擊合約:設(shè)計復(fù)雜又精巧
攻擊合約 0x5483,創(chuàng)建于 7 月 26 日,創(chuàng)建者為 0x820D,同時也是持續(xù)調(diào)用攻擊合約的五個地址之一。
起初,攻擊合約的創(chuàng)建時間讓我們感到疑惑,前面提到 LW 游戲合約于 8 月 6 日才部署上主網(wǎng)。難道 0x820D 可以未卜先知,或者他與項目方有什么不可告人的秘密?
帶著這個疑問,我們嘗試從合約 0x5483 的代碼(字節(jié)碼)中尋找答案。
經(jīng)過逆向發(fā)現(xiàn),該合約有七個公開函數(shù),其中一個疑似函數(shù)名是 withdraw(uint256),用于將攻擊合約中積累的以太幣轉(zhuǎn)走。
安比(SECBIT)實驗室在字節(jié)碼中發(fā)現(xiàn)了上面提到的五個地址。原來這兩個函數(shù)都會跳轉(zhuǎn)到同一個內(nèi)部函數(shù),檢查交易發(fā)起人是否是這五人地址之一。如果是,則可繼續(xù)執(zhí)行,如果不是,則提前讓交易失敗。
這也解釋了為什么偏偏是這五個地址一直在調(diào)用攻擊合約。因為他們是一個團(tuán)隊,合約特地為他們而設(shè)計,而其他人根本無法正常調(diào)用。
初步猜測,攻擊合約這么設(shè)計是為了分散權(quán)限和資金,降低出問題或被發(fā)現(xiàn)的風(fēng)險。
上圖正是一筆攻擊交易的傳入?yún)?shù)。第一部分是調(diào)用函數(shù)哈希 ID,后面跟著三個參數(shù)。注意看第一個參數(shù),攻擊者傳入的明顯是一個地址。顯然,這個地址正是 LW 游戲合約地址。
原來如此,攻擊目標(biāo)對象可以作為參數(shù)傳入。“黑客真機(jī)智!”,我們不由地感慨。之前的一個困惑被解開,早在 LW 游戲上線前就已部署好的攻擊合約 0x5483,其實是一個通用型武器。
繼續(xù)研究,接下來合約的復(fù)雜程度出乎我們意料。我們沿著生成的控制流程圖(CFG)追蹤合約函數(shù)調(diào)用過程,程序指令以及分支情況非常之多(下圖是一小部分截圖),讓人難以完全跟上。
安比(SECBIT)實驗室使用動態(tài)追蹤調(diào)試技術(shù),結(jié)合逆向分析結(jié)果與攻擊交易內(nèi)部記錄,搞清楚了黑客所使用的手法。
其他攻擊交易也都是類似的過程,黑客調(diào)用攻擊合約,攻擊合約再調(diào)用提前創(chuàng)建好的合約,進(jìn)而創(chuàng)建新的合約,以新合約的身份參與 LW 游戲,買游戲道具,然后幾乎必定獲得空投獎勵。
這一過程中不斷新建的合約,就是態(tài)勢感知系統(tǒng)中預(yù)警的大量異常合約創(chuàng)建與自毀。
追蹤攻擊合約調(diào)用歷史,發(fā)現(xiàn)攻擊者在部署完攻擊合約后,就立即多次調(diào)用特定函數(shù),每次新建 10 個新合約。而函數(shù)總共恰好調(diào)用了 100 次,因此新建了 1000 個新合約(記住這個細(xì)節(jié))。
在攻擊交易中,攻擊合約最先調(diào)用的就是這預(yù)先創(chuàng)建好的 1000 個合約之一,似乎是特地從中挑選出來一個地址。
智能合約:一切皆可預(yù)測
攻擊函數(shù)控制流程圖(CFG)中一個相隔很遠(yuǎn)的循環(huán)引起了我們的注意。
我們恍然大悟。攻擊函數(shù)所做的就是不斷循環(huán)地在 1000 個合約中,挑選“合適”的地址來完成下一步新建合約操作。所謂“合適”的地址,就是指能確保每次參與游戲都能獲得空投獎勵。
前面提到,以太坊智能合約中可以很容易的預(yù)測隨機(jī)數(shù),因為隨機(jī)數(shù)的來源都是區(qū)塊或者交易中特定的一些公開參數(shù),如交易發(fā)起者地址、區(qū)塊時間戳、區(qū)塊難度等等。因此空投游戲利用隨機(jī)數(shù)來控制中獎概率是不可行的。
而這里,黑客利用了另一個以太坊的特征,一個地址(賬戶)創(chuàng)建一個合約,合約地址是可按照特定規(guī)則計算得到的,任何人都可以根據(jù)已知信息進(jìn)行推算。
因此,黑客循環(huán)利用自己控制的 1000 個合約地址,推算各地址下一次新建的合約地址,而該地址恰恰是空投游戲中獎數(shù)字的隨機(jī)源。攻擊合約通過一系列預(yù)演推算來篩選出“合適”的地址來完成攻擊操作(技術(shù)細(xì)節(jié)后文會詳細(xì)討論)。
這才是黑客能夠以超高概率獲得空投的真正原因!
技術(shù)流:攻擊手法細(xì)節(jié)披露
類 Fomo3D 游戲空投漏洞的根本原因在于,以太坊智能合約環(huán)境中難以生成無法預(yù)測的隨機(jī)數(shù)。而 Fomo3D 開發(fā)者在其合約中增加了「判斷調(diào)用者是普通人類還是合約」的邏輯來嘗試規(guī)避,但此邏輯實現(xiàn)存在漏洞。黑客利用攻擊合約提前預(yù)測隨機(jī)數(shù),并通過在構(gòu)造函數(shù)內(nèi)調(diào)用游戲合約的方法來偽裝成普通人類(非合約)地址,從而大大增加自身中獎概率。
時間再次回到 7 月 23 日,以太坊基金會開發(fā)團(tuán)隊負(fù)責(zé)人之一 Péter Szilágyi 在 Reddit 上首次公開爆出這個漏洞并給出 1.0 版本的 POC 方案(詳細(xì)可以參考引文 [3])。這主要是利用了這些特點:
空投游戲用來控制中獎概率的隨機(jī)源,可被提前獲得
用戶能否獲得空投獎勵以及獎勵金額,可在另外一個合約中提前計算出來,從而決定后面的操縱邏輯
Fomo3D 空投機(jī)制中嘗試限制只有非合約地址(普通人類)才能參加游戲以防止上述情況的發(fā)生。但該判斷方法存在漏洞,在構(gòu)造合約的過程中(即合約構(gòu)造方法里)參與游戲即可繞過該限制。
因此攻擊者可以部署一個智能合約,并在合約的構(gòu)造方法中計算出自己是否能夠獲益,如果能則投入以太幣參加游戲空投獲利,否則就不參加(參見下圖)。
Péter 提出的這個方案只是一個最簡單的原型,因為每次部署合約都要消耗不少 Gas,而且工作效率很低且收益率并不高,采用該方案攻擊,發(fā)起上千筆交易,都不一定能夠真正獲得空投獎勵。
看到這里你可能會有疑問,上文的攻擊者似乎手法更高明,而且實際成功攻擊的發(fā)生時間要早得多。
Zethr 開發(fā)者 Etherguy 早在 7 月 8 日就已使用更高明的手法成功獲利,解決了上文 1.0 方案中的部分問題,我們姑且稱之為 2.0 版本。
這個思路是通過合約循環(huán)創(chuàng)建子合約(參見下圖),直到子合約滿足空投條件可以獲利為止。這樣做的好處是,在 Gas 充足的情況下,每次調(diào)用合約幾乎一定可以獲得收益,提高了工作效率。然而這種方案和 1.0 版本的攻擊成本接近,并沒有從本質(zhì)上提高收益率。
而這次事件的最大獲利者 BAPT-LW20 團(tuán)隊,就是在 2.0 版本的思路上進(jìn)行了進(jìn)一步優(yōu)化降低了投入成本,提高了收益率。 3.0 版本則瘋狂創(chuàng)建代理合約,通過利用計算下一步新建合約地址的技巧提前預(yù)判,篩選出符合條件的代理合約再創(chuàng)建出新的子合約,在子合約的構(gòu)造函數(shù)中再完成上述攻擊(見下圖)。而且攻擊目標(biāo)地址可配置,可多人同時協(xié)作攻擊。當(dāng)游戲獎池金額不足以覆蓋攻擊成本時,發(fā)出的攻擊交易會自動提前失敗,僅消耗很低的 Gas 費用。
在分析各類攻擊合約過程中,我們還見到另外一種更高明的做法:主攻擊合約有著良好的設(shè)計模型,支持核心算法動態(tài)替換與升級。原理上則是利用了 delegatecall 進(jìn)行操作。安比(SECBIT)實驗室會持續(xù)關(guān)注這批黑客的動向。
彩蛋一:空投與挖礦
我們知道在 PoW 挖礦的時候,礦工通常需要進(jìn)行如下計算:
BlockHash = Hash(Header Nonce) Check(BlockHash < Diff)
當(dāng) BlockHash 結(jié)果小于當(dāng)前難度值的時候,代表找到了一個合法的 Nonce。
在 Fomo3D 的空投獎勵里有著類似挖礦的機(jī)制:
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 來挖礦呢?
答案顯然是可以的,智能合約的地址是根據(jù) 發(fā)起者賬戶 nonce 決定的,于是有了第 1 代方法:
創(chuàng)建合約 用戶(地址 nonce0) --------------------> 新合約(嘗試攻擊) 用戶(地址 nonce1) --------------------> 新合約(嘗試攻擊) 用戶(地址 nonce2) --------------------> 新合約(嘗試攻擊) 用戶(地址 nonce3) --------------------> 新合約(嘗試攻擊)
但是這種方式需要用戶持續(xù)部署合約,消耗的礦工費代價非常大,且成功率極低,每次都是以 1/1000 的中獎概率在嘗試。
由于第 1 代驚人的失敗率,顯然無法利用,于是有了第 2 代攻擊方法:
這種方法的主要思想是,合約創(chuàng)建的新合約地址由 合約地址 nonce 確定:
部署合約 |------------------| hash(caddr, nonce) 用戶 ----------> |循環(huán)創(chuàng)建合約, | -------> 新合約(嘗試攻擊) |直到攻擊成功或到達(dá)終 | -------> 新合約(嘗試攻擊) |止條件才停止,可能需 | -------> 新合約(嘗試攻擊) |要部署大量合約。 | -------> 新合約(嘗試攻擊) |----------------- |
這種方式類似于挖礦,固定區(qū)塊頭部,不斷修改 nonce 來試探能否成功獲得獎勵,但是問題在于,如果在循環(huán)第 1000 次才發(fā)現(xiàn)合法的 nonce,那么意味著之前部署的 999 個合約都屬于浪費 Gas 的操作。
那么如何更高效地尋找合法的 nonce 呢?
我們回想比特幣挖礦,一個挖礦任務(wù)中,不僅有 nonce,還有 extraNonce [4]。
在比特幣區(qū)塊的 Coinbase 字段中,有一個自由修改的區(qū)域,修改這個區(qū)域會導(dǎo)致 MerkleRoot 被修改,從而實現(xiàn) Header 被修改,具有 nonce 的效果,因此被稱作 extraNonce。
為什么需要引入 extraNonce 呢?原因在于 nonce 為 32 bit 數(shù)字,搜索范圍只有 2^32,礦機(jī)幾乎一瞬間就遍歷完了,通過不斷修改 extraNonce 來擴(kuò)大本地搜索范圍,我們甚至可以不修改 nonce 只修改 extraNonce 來挖礦。
也許黑客也想到了這一點,他們通過提前部署 1000 個代理合約來實現(xiàn)有 1000 個 extraNonce 的效果。 至此,攻擊方法升級到了第 3 代:
部署合約 用戶 --------------------------------------> 管理合約 C 調(diào)用合約C,預(yù)先創(chuàng)建代理合約(extraNonce) 用戶 --------------------------------------> 1000個代理合約 調(diào)用合約C,循環(huán)嘗試可以成功攻擊的代理合約 用戶 --------------------------------------> 部署合約(嘗試攻擊)
顯而易見,這種攻擊方式同時實現(xiàn)了 2 個效果:
提升了攻擊成功率
減少了攻擊合約部署數(shù)量,大大減少了 Gas 消耗。
彩蛋二:黑客預(yù)先創(chuàng)建的合約數(shù)量與中獎概率
前文提到黑客預(yù)先部署 1000 個代理合約,這個數(shù)字有什么講究呢?
if((seed - ((seed / 1000) * 1000)) < airDropTracker_)
seed 經(jīng)由一系列以太坊鏈上環(huán)境以及多次 Hash 運算得出。Hash 結(jié)果對 1000 取余數(shù),可以得到 0~999 的偽隨機(jī)數(shù)。
我們假設(shè)哈希輸出結(jié)果是均勻的,并且哈希是抗碰撞的,那么平均每次中獎的概率為 1/1000。
模擬結(jié)果:
公式運算結(jié)果:
盡管更多合約能夠提供更高的中獎概率,但是需要考慮到 Gas 消耗與 Gas Limit 等因素,不宜過大。
安比(SECBIT)實驗室認(rèn)為黑客選擇部署 1000 個合約,是根據(jù)概率代碼 1/1000 想當(dāng)然做出的判斷。
彩蛋三:黑客可能利用了空投概率計算的另一個 bug
黑客仍然需要更高效地攫取利潤,他們甚至“發(fā)現(xiàn)”了 Fomo3D 空投規(guī)則在這種攻擊方式下暴露出的缺陷。
攻擊合約需要在最開始獲取空投獎勵信息,作為后續(xù)操作的依據(jù)。因此,攻擊合約會先依次調(diào)用游戲合約的兩個查詢接口,分別是 0xd87574e0 airDropPot_() 和 0x11a09ae7 airDropTracker_()。
Fomo3D 空投獎勵的 airDropTracker_ 計算方式為如下方法:
if (_eth >= 100000000000000000) { airDropTracker_ ; if (airdrop() == true) {...} }
Fomo3D 判斷是否能中空投獎勵使用了如下方法:
if((seed - ((seed / 1000) * 1000)) < airDropTracker_) return(true);
根據(jù)我們分析,0x820d 后期更新的攻擊合約直接去除了對 airDropTracker_ 的判斷,但這樣做其實有利有弊。
如果你了解細(xì)節(jié),猜出了黑客的用意,或者知曉這種做法的優(yōu)缺點,歡迎添加小安同學(xué)微信(secbit_xiaoanbi),她會把你加入到「SECBIT 智能合約安全技術(shù)討論」的群里。
尾聲:下一個是誰?
8 月 14 日,BAPT-LW20 黑客團(tuán)隊的 0x820d 再次部署了兩個新版攻擊合約,這一次他們將炮筒又對準(zhǔn)了另一款一天前新部署的不知名合約。
望著大屏幕上 AnChain.ai 態(tài)勢感知態(tài)勢感知平臺不斷閃爍的紅點,安比(SECBIT)實驗室和 AnChain.ai 都很清楚,區(qū)塊鏈?zhǔn)澜缋锏膽?zhàn)役還遠(yuǎn)遠(yuǎn)沒有結(jié)束。
2009年,中本聰創(chuàng)造了一個虛擬的去中心化新世界。這仿佛是一片流著奶和蜜糖的應(yīng)許之地,人們歡呼雀躍,蜂擁而至。但與所有的生態(tài)系統(tǒng)一樣,新世界有生命,就有捕食者。有交易者,就有黑客。區(qū)塊鏈上的應(yīng)用在進(jìn)化,攻擊者也同樣,我們給大家展示的是區(qū)塊鏈?zhǔn)澜绮粸槿酥牧硪幻妫盗饔縿印R饬现猓苍谝饬现小?/span>
1.TMT觀察網(wǎng)遵循行業(yè)規(guī)范,任何轉(zhuǎn)載的稿件都會明確標(biāo)注作者和來源;
2.TMT觀察網(wǎng)的原創(chuàng)文章,請轉(zhuǎn)載時務(wù)必注明文章作者和"來源:TMT觀察網(wǎng)",不尊重原創(chuàng)的行為TMT觀察網(wǎng)或?qū)⒆肪控?zé)任;
3.作者投稿可能會經(jīng)TMT觀察網(wǎng)編輯修改或補充。