God.Game智能合約攻擊事件分析

2021-02-16 ADLab

通過etherscan可以看到攻擊者的以太幣提取交易:

交易詳情如下,即攻擊者0xc30e89db73798e4cb3b204be0a4c735c453e5c74(簡稱攻擊者1)調用了God合約的withdraw函數進行提幣:

查看攻擊者1在God合約中是否持有token,接近20萬的數量。

查看攻擊者1在withdraw調用之前對God合約的調用,如下:

從攻擊者1的交易來看,它發往God合約的最早交易是sell調用,說明在sell之前它就已經有了God合約的token。那麼攻擊合約在此之前,肯定有其它帳戶給它轉移過token。否則,它不會有可以sell的token。

在追蹤攻擊者1的token變化過程中,我們發現另外一個攻擊者(簡稱攻擊者2,地址為0x2368beb43da49c4323e47399033f5166b5023cda),它調用了一個攻擊合約(地址為0x7f325efc3521088a225de98f82e6dd7d4d2d02f8)給攻擊者1轉移了20萬token:

攻擊者2調用攻擊合約的transfer函數,目標地址為攻擊者1,數量為20萬。由於攻擊合約並沒有開放源碼,因此這裡的transfer函數僅僅是函數籤名匹配的結果(有一定機率是其它名字)。那麼,攻擊合約的20萬token是從哪裡得到的?

繼續跟蹤攻擊者2和攻擊合約,發現攻擊合約是由攻擊者2創建的,且攻擊者2對攻擊合約的調用就是在God合約被攻擊提現的時間窗口中。

從攻擊者2的交易行為,可以看出他先給攻擊合約轉入4.3 token,然後從攻擊合約轉出4.3 token。此時,攻擊合約的token為0。隨後,攻擊合約直接轉20萬token給攻擊者1(還轉移了21萬給另外一個地址),這表明攻擊者在調用reinvest函數時應該使攻擊合約的token發生了某種變化。

接著分析這個reinvest交易,它是直接調用不開源的攻擊合約,其內部機制我們並不清楚。但是,這個交易過程會觸發God合約的兩個事件,onTokenPurchase和onReinvestment: 

通過這個事件的記錄數據,可以看到該reinvest調用使得合約判定購買token的以太代幣數量為一個大數,並且遠遠超出以太幣發行總量。這個信息也反應出reinvest函數內部邏輯一定產生了某種非預期的行為。

通過分析God合約源碼,發現onReinvestment事件僅在God合約的reinvest函數中觸發:

可見,onReinvestment的以太幣參數的最終計算方式為:

這一行代碼明顯存在整數溢出的理論可能,因為它沒有使用SafeMath等類似安全運算操作。但這裡溢出的值並不是經典0xfffff…等類似的大數,而是一個夠大但又遠不及uint256極大值的數。

仔細觀察發現,magnitude變量是2的64次方,然後我們做一個等式變換:

這樣我們就找到了經典整數溢出的第一現場指紋,只需要上面減法操作的第一操作數比第二操作數略小即可。很顯然,第一操作數又可劃分為兩個子操作數的乘法,只要任一個為零即導致結果為零。此時,第二操作數隻要是任意一個小正數即可產生上面的經典指紋。

繼續構造上述的操作數。首先,tokenBalanceLedger_[_customerAddress]在合約調用的上下文中表示調用者持有的token。因此,只要調用者不持有合約token,這個值就是零。此時無論profitPerShare_值為多少,乘法結果都為零。這樣減法的第一操作數為零的條件,就輕易構造出來了,即調用者不持有God合約token。然後,payoutsTo_是一個mapping對象,合約調用者的初始值為零,需要使其為一個正數。

分析God合約中修改payoutsTo_的代碼有:

攻擊合約在reinvest調用之前只執行過transfer調用和withdraw調用。其中transfer調用從攻擊合約轉token到外部帳戶,所以不會修改合約的payoutsTo_值,但withdraw函數會直接修改合約的payoutsTo_值。因此,只要在reinvest之前調用一次withdraw函數就可以使得減法的第二操作數為一個正數。

最後,第一個操作數為零值,第二個操作數為正數,並且減法結果強制轉換為無符號整數,在沒有運用安全運算庫的前提下直接使用減法操作就會導致溢出,結果為一個很大的正數。至此,攻擊者的完整攻擊過程如下:

在分析了完整攻擊路徑後,我們可以構造出如下的攻擊合約:

在remix中按照如下步驟進行操作:

(1)部署God合約(為了方便追蹤內部數據結構的變化,直接把全部成員和函數都重新定義為public);

(2)用1eth,購買第一次token,引用地址設置為0x00…;

(3)再用相同的參數來購買一次(一定要再來一次,因為此時合約的profitPerShare_仍然是零值,這會導致withdraw調用的函數修飾符失敗);

(4)部署攻擊合約Test(傳遞God合約地址給Test);

(5)調用God合約的Transfer給Test發送Token(這裡直接把購買的全部token都發送過去);

(6)調用攻擊合約Test的withdraw函數,攻擊合約的payoutsTo_已經被修改為大數;

(7)調用攻擊合約Test的transfer函數把token全部給創建者,Test此時擁有的token為0,payoutsTo_為大數;

(8)調用攻擊合約的reinvest函數,在日誌中可以看到記錄購買token的eth為海量,並且成功購買了大量token;

(9)攻擊合約Test通過溢出獲得了大量token,攻擊者就可以從這個合約給其它地址轉移token,並進行售賣套取eth。

God合約被攻擊的漏洞點比較簡單,即標準的整數溢出。它的複雜在於整數溢出的利用有多個約束條件,並且是在不同的業務邏輯中:

(1)在溢出攻擊的業務邏輯中,攻擊者必須沒有God的token,且payoutsTo_值必須為正數;

(2)要使payoutsTo_為正數,攻擊者就必須在其它業務邏輯中修改,比如withdraw;

(3)要執行withdraw,攻擊者就必須持有God的token(最終溢出時又不能持有token)。

因此,攻擊者需要通過多次觸發God合約的不同業務邏輯才能最終造成整數溢出。

God合約的代碼編寫存在多處缺陷:

(1)給管理員留下任意地址的token操控能力,並且操控不觸發事件。這意味著修改是悄無聲息的,除非有人去輪詢監控每個地址的token變化;

(2)Token的某些轉移過程沒有調用標準ERC20事件接口,導致etherscan上看到的token變化是極度不準確的,不利於公開透明監督;

(3)代碼中不考慮限制循環,無意義的gas浪費(這也導致了在Remix調試中經常崩潰);

(4)合約中的業務邏輯沒有說明規範,僅開放合約代碼並不能等價於項目透明。



ADLab成立於1999年,是中國安全行業最早成立的攻防技術研究實驗室之一,微軟MAPP計劃核心成員,「黑雀攻擊」概念首推者。截止目前,ADLab已通過CVE累計發布安全漏洞近1000個,通過 CNVD/CNNVD累計發布安全漏洞近500個,持續保持國際網絡安全領域一流水準。實驗室研究方向涵蓋作業系統與應用系統安全研究、移動智能終端安全研究、物聯網智能設備安全研究、Web安全研究、工控系統安全研究、雲安全研究。研究成果應用於產品核心技術研究、國家重點科技項目攻關、專業安全服務等。

相關焦點

  • 成都鏈安:VETH智能合約被攻擊事件分析
    2020年6月30日下午5:46,Beosin-OSINT威脅情報系統發現VETH智能合約(0x75572098dc462F976127f59F8c97dFa291f81d8b)遭受攻擊,被盜919299個VETH。成都鏈安·安全實驗室第一時間對本次事件進行跟蹤分析。
  • 真相只有一個 God.Game 代幣被盜事件原理分析
    攻擊流程推理1. 首先創建一個攻擊合約並轉入一定token,調用一次withdraw之後,該攻擊合約地址對應的的payoutsTo值變為dividends*magnitude;2.攻擊流程總結(1) 創建一個攻擊合約,可以調用God合約並且向該合約轉入幾個God token(2) 攻擊合約調用God合約withdraw的函數,觸發payouts[address]值增加(3) 調用攻擊合約將攻擊合約中的God token全部轉出,使合約token=0,攻擊合約地址的dividends出現異常;(
  • 首發|CertiK:DeFi項目Walletreum內部操作攻擊事件分析
    CertiK安全研究團隊通過分析其智能合約代碼,發現其智能合約代碼中心化風險極高,存在安全隱患,項目擁有者擁有權限向任意地址鑄造任意數目的代幣。完整技術分析如下:攻擊詳情分析項目擁有者地址:0xa5e552e3d643cc89f3b1ceccfd6f42c5c1aee775圖一:內部操作攻擊交易信息圖一是Walletreum項目中WALTToken
  • 金色✖️成都鏈安 |第三期:智能合約安全問題
    根據央行提交的專利,為了實現該目的,DCEP可能加載智能合約功能,使DCEP只有在滿足特定條件(例如特定的經濟狀態、時點、利率、流向主體)的情形下才生效。隨著技術的發展,智能合約現在逐步延伸到物聯網、智能家居和供應鏈管理等多個領域。問題三:2019年智能合約有哪些典型的安全事件發生?可以具體說明麼?
  • 零時科技丨CTF技能寶典之智能合約 薅羊毛漏洞
    前言近年來,各個大型CTF(Capture The Flag,中文一般譯作奪旗賽,在網絡安全領域中指的是網絡安全技術人員之間進行技術競技的一種比賽形式)比賽中都有了區塊鏈攻防的身影,而且出現的題目絕大多數都是區塊鏈智能合約攻防。此系列文章我們主要以智能合約攻防為中心,來剖析智能合約攻防的要點,前兩篇我們分享了合約反編譯,反彙編的基礎內容。
  • 零時科技丨CTF技能寶典之智能合約#薅羊毛漏洞
    此系列文章我們主要以智能合約攻防為中心,來剖析智能合約攻防的要點,前兩篇我們分享了合約反編譯,反彙編的基礎內容。後續的文章中,我們會繼續分享CTF比賽中智能合約常見題型(重入,整數溢出,空投,隨機數可控等)及解題思路,相信會給讀者帶來不一樣的收穫。
  • 智能合約很傻?聽 Jimmy Song 揭開智能合約的真相
    事實上,智能合約早在 1995 年就存在了,那時候比特幣還沒影子呢。比特幣的智能合約語言與以太坊的區別在於以太坊是圖靈完備的。也就是說,以太坊的智能合約語言 Solidity 令更複雜的合同成為可能,但卻使它們更難以分析。複雜性有一些重大後果。雖然複雜的合同可以包容更複雜的情況,但複雜的合同也很難確保安全。
  • 智能合約Bug湧現,Okex、Poloniex、Coinone交易所暫停ERC20存款
    近日,以太坊智能合約漏洞不斷湧現。今日,隨著承載大批幣種交易的智能合約批量漏洞再度曝光,Okex,Poloniex,Coinone和Hitbtc等多家交易所宣布暫停ERC20存款。 由以太坊智能合約溢出漏洞引發的安全事件並不是第一次。
  • 以太坊中智能合約的編排模式
    除了最簡單的以太坊應用程式之外,所有其他應用程式都由幾個智能合約組成。這是因為在任何已部署的智能合約中都會有24KB的硬限制,並且隨著智能合約的複雜性增加,你的煩惱也會增加。 你可以將代碼分解為可管理的智能合約,您肯定會發現一個智能合約具有僅應由另一個智能合約調用的函數。
  • 零時科技丨CTF技能寶典之智能合約 整數溢出漏洞
    前言近年來,各個大型CTF(Capture The Flag,中文一般譯作奪旗賽,在網絡安全領域中指的是網絡安全技術人員之間進行技術競技的一種比賽形式)比賽中都有了區塊鏈攻防的身影,而且出現的題目絕大多數都是區塊鏈智能合約攻防。此系列文章我們主要以智能合約攻防為中心,來剖析智能合約攻防的要點,前兩篇我們分享了合約反編譯,反彙編的基礎內容。
  • SolarWinds供應鏈攻擊事件分析
    事件簡述  Solars是一家國際IT管理軟體供應商,其Orion軟體更新伺服器上存在一個被感染的更新程序,這導致美國多家企業及政府單位網絡受到感染,根據軟體裝機量來看,目前該事件對國內影響較小。
  • 如何創建通用的區塊鏈智能合約
    區塊鏈技術的興起引入了智能合約,這是一種防止篡改、透明、公平的管理此類協議的系統。智能合約是由數學而不是組織來管理的。一旦合同生效,它們會自動執行合同的參數,為各方創造一個更加公平的結構。 智能合約的挑戰在於,它們通常依賴於將現實世界數據與區塊鏈(或數據從一個區塊鏈轉移到另一個區塊鏈)進行橋接的能力,以便智能合約能夠識別質量、評估可靠數據並觸發商定的結果滿足條件。而在以往這是一個過於複雜和困難的過程,限制了更廣泛的採用。
  • 火幣觀察:一周四起攻擊事件 DeFi閃電貸組合漏洞亟待解決
    進入11月,DeFi領域已經有6起閃電貸攻擊事件。其中包括Value DeFi項目損失了540萬美元、Cheese Bank項目損失330萬美元、Akropolis項目損失200萬美元以及OUSD的700萬美元。
  • 智能合約:Web3.0時代規則的制定者
    小編:記得關注哦來源:IPFS原力區原文標題:智能合約:Web3.0時代規則的制定者本文來自 IPFS原力區(ID:IPFS-FORCE),作者:招寶智能合約 (Smart Contract)伴隨著2014年以太坊的出現逐漸被圈內人熟知,又因為近些年DeFi的火熱,智能合約的應用也得到了極大的推廣。
  • 什麼是九環智能合約(Nine Ring Smart Contract)第一個真正的鏈上...
    九環智能合約,第一個真正的,鏈上智能合約。數據公開透明。九環智能合約(Nine Ring Smart Contract),是由杜克大學區塊鏈實驗室研發的去中心化智能合約系統,通過區塊鏈技術促進全球經濟的循環與短期資金流動,幫助全球受疫情影響的人群,渡過當前的經濟困境。
  • 打造2020最火爆智能合約風口——TronChain波場鏈
    一個項目,一個生意通過了解分析,將來可能大火大熱。若想賺大錢,就得在多數人還沒有覺察覺知覺醒的時候做好抉擇並用力執行。因為金融的本質就是賺的時間差的錢。TronChain波場鏈——全開源鼻祖級去中心化智能合約之一。TronChain波場鏈把區塊鏈的兩大優勢,用到了極致。區塊鏈具備匿名性、透明性匿名性保護投資者的個人信息安全,而TronChain全開源做到的透明性又保護了投資者的資金安全。
  • ccr智能炒幣機器人:合約是什麼?
    合約代表了買賣雙方所擁有的權利和義務。   簡單點說就是現在約好未來某個時間地點交易一定數量的某種商品。     在這個市場上合約基本分為兩大類: 永續合約,交割合約 永續合約是什麼意思呢?簡單來說永續合約是一種數字資產衍生產品,它是以USDT進行結算的虛擬合約產品,每一張合約代表一定數量的數字貨幣(例如BTCUSDT合約,每一張合約代表0.01BTC),投資者可以通過買入做多合約來獲取虛擬數字貨幣價格上漲的收益,或通過賣出做空來獲取虛擬數字貨幣價格下跌的收益。它的價格接近於標的參考指數價格,錨定現貨價格的主要機制是資金費用。合約槓桿倍數為1~100倍。
  • 零時科技 | 智能合約安全系列文章之反編譯篇
    本此系列文章我們也以智能合約攻防為中心,來刨析智能合約攻防的要點,包括合約反編譯,CTF常見題型及解題思路,相信會給讀者帶來不一樣的收穫。由於CTF比賽中的智能合約原始碼沒有開源,所以就需要從EVM編譯後的opcode進行逆向來得到原始碼邏輯,之後根據反編譯後的原始碼編寫攻擊合約,最終拿到flag。
  • ...未來 發布:遭黑客兩連擊,如何解決以太坊屢遭利用的重入攻擊漏洞?
    這曾經是防止一類被歸為「重入」的智能合約漏洞最有效率的方式。重入的概念是,一個智能合約調用另一個智能合約,最終(在同一次執行過程中)再一次調用了原來的智能合約。重入是在臭名昭著的the DAO黑客事件中被利用的主要漏洞。當時提出的解決方案不是通過改變以太坊協議來允許合約阻止這種行為,而是最終通過改變Solidity讓向智能合約發送ETH的默認行為使用非常少量的gas,這樣重入問題就無法再被利用。
  • BeeX區塊鏈百科 |第4期:一文讀懂什麼是智能合約
    區塊鏈技術的出現解決了該問題,不僅可以支持可編程合約,而且具有去中心化、不可篡改、過程透明可追蹤等優點,天然適合於智能合約。而智能合約在2008年依然無法融入比特幣區塊鏈網絡,但在五年後,以太坊讓它浮出水面。從此,湧現出了各種不同形式的智能合約,其中以太坊智能合約使用最廣。有了智能合約,以太坊也被稱為區塊鏈2.0。