WF曲速未來揭秘:God.Game被盜事件具體分析區(qū)塊鏈
WF曲速未來對該攻擊進行詳細了解,簡稱God合約。時隔一天攻擊者就盜取了該合約的243個以太幣,價值超過6萬美元。該項目方籌備兩個月游戲在運營不久后迅速夭折。
8月19日,God.Game在以太坊區(qū)塊鏈上部署了自己的智能合約(地址位于https://etherscan.io/token/0xca6378fcdf24ef34b4062dda9f1862ea59bafd4d,簡稱God合約),時隔一天攻擊者就盜取了該合約的243個以太幣,價值超過6萬美元。WF曲速未來對該攻擊進行詳細了解,簡稱God合約。時隔一天攻擊者就盜取了該合約的243個以太幣,價值超過6萬美元。該項目方籌備兩個月游戲在運營不久后迅速夭折。
簡單介紹
God.Game是一個基于以太坊網(wǎng)絡的博彩類區(qū)塊鏈游戲平臺,獨立運行在智能合約上,一切由機器人自動執(zhí)行,一旦運行,人無法對它進行干預和操控,達到一個去中心化的目的。God.Game還打出這樣的口號:高分紅、全透明、防止作弊,打造全球最安全的智能合約游戲平臺。此外,God.Game還設有GOD股份機制。用戶通過購買GOD股份(GOD代幣)來獲得分紅。并且,如果擁有了100個GOD 股份,用戶即可以成為超級節(jié)點,激活邀請系統(tǒng)。
漏洞定位
經(jīng)過對源代碼進行漏洞排查后發(fā)現(xiàn)漏洞原因為dividends變量異常:
首先看一下dividends的計算邏輯:
return (uint256) ((int256)(profitPerShare_*tokenBalanceLedger_[_customerAddress]) - payoutsTo_[_customerAddress]) / magnitude;
每當一個地址token增加或減少操作時,都會對該地址的payoutsTo這個變量進行操作,
購買token增加payoutsTo變量:
賣出或轉賬token減少payoutsTo變量:
這些都很容易理解。
但是在轉賬邏輯我們卻發(fā)現(xiàn),對于合約地址,是沒有payoutsTo的,這個疑點先記在小本本上。
這是源碼的轉賬部分
轉賬:
我們再仔細查看一下withdraw函數(shù)里面:
我們驚訝的發(fā)現(xiàn)在withdraw函數(shù)中,會對payoutsTo進行一個賦值操作,賦值為dividends*magnitude;這里magnitude=2**64;
從上面dividends的邏輯的(profitPerShare_*tokenBalanceLedger_[_customerAddress])部分可以看出,只要有賬戶有token那dividends就一定有值的,dividends有值我們就可以進行withdraw操作。
攻擊流程推理
對照攻擊者交易明細,我們來復現(xiàn)攻擊流程。我們假設token對應紅利是1:1,便于解釋。
1.部署攻擊合約
tx:1.部署合約攻擊者部署合約,準備攻擊。合約地址:0x7F325efC3521088a225de98F82E6dd7D4d2D02f8
2.購買token
tx:2. 購買token攻擊者購買一定量token,準備攻擊。
3.向攻擊合約轉賬token
tx:3.transfer(attacker->attack-contract)攻擊者本身購買了少量token,使用游戲合約中的transfer(),向攻擊合約轉賬。
4.攻擊合約withdraw()
tx:4.withdraw()攻擊合約調用了God的withdraw(),攻擊合約因此獲得了紅利對應以太幣不重要
5.攻擊合約transfer()
tx:5.transfer(attack-contract->attacker)將token轉回,攻擊合約token不變,紅利溢出。
6.攻擊合約reinvest()
tx:6.reinvest()再投資,將紅利買token,可以大量購買token。
7.攻擊合約sell()
tx:7.sell()賣出一部分token,因為發(fā)行的token過多,會導致token價值太低,提取以太幣較少。
8.攻擊合約transfer()
tx:8.transfer(attack-contract -> 受益者)把智能合約賬戶的token轉給受益者(0xc30e)一部分。
9.受益者sell() withdraw()
受益者(0xc30e)賣掉token,并withdraw()紅利,得到以太幣。
攻擊流程總結
(1) 創(chuàng)建一個攻擊合約,可以調用God合約并且向該合約轉入幾個God token
(2) 攻擊合約調用God合約withdraw的函數(shù),觸發(fā)payouts[address]值增加
(3) 調用攻擊合約將攻擊合約中的God token全部轉出,使合約token=0,攻擊合約地址的dividends出現(xiàn)異常;
(4) 調用reinvest()可以使用異常devidends購買大量token,因為合約token總量增加,分紅增加,token價格上漲,此時任何人都可以賣出少量token來獲取到大量的eth蛛絲馬跡
我們查看游戲合約異常的dividends證據(jù):
紅框內“00000000ffffffffff”的類似結構代表其為負數(shù)
由此證明dividends確實出現(xiàn)了類型轉換異常的情況。
攻擊者通過攻擊合約調用God合約的reinvest()函數(shù),使用異常的dividends購買了大量God代幣,總量約為300億,此時代幣價格迅速攀升,最后,攻擊者只賣出了0.9個token就已經(jīng)將合約中的200多以太坊轉走。
復現(xiàn)步驟:
1.部署God合約在測試鏈上,God地址: 0x92cbCBc31f6bb209f2C4F6cbd0596ba22D71979d
2.普通用戶支付1 ETH購買代幣
3. 攻擊者支付0.1 ETH購買代幣
4. 攻擊者部署攻擊合約PWN,PWN合約地址: 0x88DF1483Db9d3720378d2CB6859c8487e4412ac7攻擊合約代碼地址:https://ropsten.etherscan.io/address/0x88DF1483Db9d3720378d2CB6859c8487e4412ac7#code
5. 攻擊者向PWN合約轉4 GOD代幣
6. 攻擊通過PWN合約調用God合約的withdraw函數(shù),使PWN合約的payoutsTo_變?yōu)椋?/span>
7. 攻擊者轉出PWN合約下的God代幣,使得tokenBalanceLedger_為零,此時計算PWN合約的dividendsOf 值所需參數(shù)的值為:profitPerShare_ = 8997439772575371tokenBalanceLedger_[PWN] = 0payoutsTo_[PWN] = 0x254197237940000000000000000
執(zhí)行dividendsOf函數(shù),得到PWN合約地址的分紅為dividendsOf = uint(-0x25419723794),此處在由int轉化為uint中出現(xiàn)錯誤:
8. 攻擊者通過PWN合約調用GOD合約reinvest函數(shù),利用超大的dividendsOf 值購買代幣,獲得了大量代幣,使得profitPerShare提升到極大值,進而破壞了God 與ETH之間的匯率
異常的profitPerShare值
PWN購買的God代幣數(shù)
9. God合約的代幣數(shù)量與主鏈上數(shù)量相近,復現(xiàn)成功
測試God合約代幣總量300億
真實God合約代幣總量330億
總結
經(jīng)由以上推理與證據(jù)的理論驗證,以及復現(xiàn)與真實的數(shù)據(jù)驗證,我們確定此次攻擊手段定義為類型轉換漏洞攻擊。
攻擊者巧妙利用God合約的設計漏洞,在計算dividends時,未考慮int類型的負值轉化為uint時的情況,導致合約被攻擊。
從Etherscan上查到的信息來看,部署攻擊合約為8月20日04:42:27 PM,卷走ETH為04:57:26 PM。黑客僅僅用了15分鐘完成上述所有操作。
除此漏洞之外,我們還在合約中發(fā)現(xiàn)如下兩個“后門”,God合約的owner(在下列代碼中體現(xiàn)為Administrator)可以使用這兩個函數(shù)轉出合約地址下的所有ETH。
此處Administrator可以指定任意賬戶的代幣數(shù),然后可以將這部分代幣數(shù)兌換為ETH
此處Administrator取走項目獎勵時沒有減去已經(jīng)取走的value值,導致Administrator可以重復取出ETH。
WF曲速區(qū)提醒:總而言之,目前的游戲合約,尤其是交易屬性較重的游戲合約,安全漏洞出現(xiàn)的情況非常普遍。
不僅是God.Game,區(qū)塊鏈博彩類游戲已是漏洞重重。
8月17日,一款火爆程度堪比“Fomo3D”的區(qū)塊鏈游戲“Last Winner”首輪已經(jīng)宣告結束,最終Winner一舉斬獲了7,755個ETH,以當時行情來預估,獎金高達1500萬元。而PeckShield安全研究人員進一步跟蹤研究發(fā)現(xiàn),該獲獎賬戶正是此前發(fā)現(xiàn)的利用合約攻擊合約,提升中大獎的概率的“外掛”賬戶,同時,該外掛賬戶還在利用游戲的空投機制進行薅羊毛,總計獲利231個ETH。
而炙手可熱的Fomo3D首輪結束疑為“黑天鵝”,獲獎者投入僅0.8個ETH,回報超13,000倍,PeckShield安全人員追蹤該用戶地址發(fā)現(xiàn),該用戶于8月15日開始投注,每次投注金額約為一個Key的價錢,截至獲得大獎,共計投入了0.8個ETH,投資回報率超13,000倍,回報驚人。需要說明的是,該地址為普通賬戶并非“合約”,只不過采用了一個簡單的自動交易“腳本”,由于最后40次平均投注間隔長約183秒,頻率不算太高。
區(qū)塊鏈安全公司W(wǎng)F曲速未來提醒廣大玩家和投資者,在進入一些“一夜爆紅”的游戲之前,要擦亮眼睛,理智投資,最好是參與已經(jīng)提供審計報告的區(qū)塊鏈游戲,對于未經(jīng)過合約安全驗證的游戲不可盲從。同時,各游戲項目方也應該在游戲上線前做好對智能合約的安全審計,以保護自己的項目運營和玩家的資產(chǎn)安全。區(qū)塊鏈為游戲行業(yè)帶來變革的同時,保證游戲的安全性可能也是當務之急。
1.TMT觀察網(wǎng)遵循行業(yè)規(guī)范,任何轉載的稿件都會明確標注作者和來源;
2.TMT觀察網(wǎng)的原創(chuàng)文章,請轉載時務必注明文章作者和"來源:TMT觀察網(wǎng)",不尊重原創(chuàng)的行為TMT觀察網(wǎng)或將追究責任;
3.作者投稿可能會經(jīng)TMT觀察網(wǎng)編輯修改或補充。