作者:Sissel@知道創宇404區塊鏈安全研究團隊
時間:2018年8月24日
0x00 前言
購買token
tx:2. 購買token
攻擊者購買一定量token,準備攻擊。
向攻擊合約轉賬token
tx:3. transfer(attacker -> attack-contract)
攻擊者本身購買了少量token,使用遊戲合約中的transfer(),向攻擊合約轉賬。
攻擊合約withdraw()
tx:4. withdraw()
攻擊合約調用了God的withdraw(),攻擊合約因此獲得了紅利對應以太幣【不重要】
攻擊合約transfer()
tx:5. transfer(attack-contract -> attacker)
將token轉回,攻擊合約token不變,紅利溢出。
攻擊合約reinvest()
tx:6. reinvest()
再投資,將紅利買token,可以大量購買token。
攻擊合約sell()
tx:7. sell()
賣出一部分token,因為發行的token過多,會導致token價值太低,提取以太幣較少。
攻擊合約transfer()
tx:8. transfer(attack-contract -> 受益者)
把智能合約賬戶的token轉給受益者(0xc30e)一部分。
受益者sell()+withdraw()
受益者(0xc30e)賣掉token,並withdraw()紅利,得到以太幣。
0x05 更簡單的攻擊手法
回顧上述攻擊流程,攻擊成立主要依賴紅利由 token – payout 得到,時常變化,而不是記錄這個特性。
在交易token時,變化的只是雙方持有的token數,雙方的紅利應該不變,換言之,就是用戶的payout也需要變化才能保證紅利變化。
漏洞就在於在用戶和合約交易token時,合約方的payout並沒有相應的增加,導致紅利平白無故的多出來,最終導致了憑空生幣。
這樣一來,我們就可以使用更簡單的攻擊手法。
下面是詳細的介紹:
-
攻擊者 ==轉賬==> 攻擊合約
合約收到轉賬時,紅利本應為0,卻變得很多,賬戶可用資金變得很多。 -
攻擊合約 withdraw()
把可用的錢提款為eth,token不變。 -
攻擊合約 ==轉賬==> 攻擊者
token原路返回攻擊者,token不變,但合約中多出了 eth 。
我們發現智能合約在這個過程中,因為接受轉賬未增加payout,導致在第二步中可以提取不少的以太幣,並在第三步將token原路轉回。
這一過程,合約賬戶便可憑空得到以太幣。而只需要支付一部分手續費以及token的輕微貶值。如此反覆創建新的合約,並按以上步驟,可以提出God.Game中大量的以太幣。
God.Game官網
http://god.game/#/
智能合約審計服務
針對目前主流的以太坊應用,知道創宇提供專業權威的智能合約審計服務,規避因合約安全問題導致的財產損失,為各類以太坊應用安全保駕護航。
知道創宇404智能合約安全審計團隊: https://www.scanv.com/lca/index.html
聯繫電話:(086) 136 8133 5016(沈經理,工作日:10:00-18:00)
歡迎掃碼諮詢:
转载请注明:IAMCOOL » 智能合約遊戲之殤——God.Game 事件分析