作者:安比實驗室
公眾號:安比實驗室SECBIT
安比(SECBIT)實驗室近期發出預警,一種新型蜜罐(詐騙)合約正在泛濫,利用區塊鏈瀏覽器的相關局限,設置陷阱欺騙游戲參與者,且詐騙目標多為具備一定區塊鏈專業素養的人員。據安比(SECBIT)實驗室統計數據顯示,同類合約的數量高達48個,其中一個合約部署于 3 天前,已有玩家受騙的合約超過21份,累計騙取金額超過 25 ETH。
前幾天,小安比從 p0n1 大神那里聽說了一種新型的蜜罐(詐騙)合約,同類蜜罐合約竟有 48 個,而其中近一半的合約已經成功騙取玩家的 ETH,據說連 QSP 團隊的安全大神 Martin Derka 也未能幸免。這不禁激發起了小安比濃濃的好奇心。
一、騙局縮影:安全專家被套路
Martin Derka 所參與的這個名為 QUESTION 的合約,是一款猜答案游戲合約。
合約地址:0xcEA86636608BaCB632DfD1606A0dC1728b625387
合約游戲的規則很簡單:
- 合約創建者會設置一個問題;
- 任何玩家都可以通過向合約打入不低于 1ETH 的手續費參與作答;
- 若猜中答案,將得到合約里所有的 ETH 作為獎勵;
- 若猜不中,無任何獎勵,且事先支付的 ETH 會轉入該合約
合約的巧妙設計會為高階玩家埋下一些陷阱,讓玩家自認為通過Etherscan中的交易數據可以獲知答案,然后不聲不響地就賺取ETH。而實際上恰恰是螳螂捕蟬、黃雀在后,合約創建者讓你邊竊喜邊發現的答案是錯誤答案,技術帝們憑借其“機智”最終不僅賺不到合約中的ETH,還會賠光預先繳納的手續費。
此外,根據QUESTION合約中的特殊權限設置,問題提出者可隨時取走合約中的所有ETH。因此,上述玩家參與游戲時支付的ETH能被迅速提取和套利。
作為安比(SECBIT)實驗室的資深磚家,接下來小安比將以 QUESTION 合約為例向大家講解該類蜜罐合約的詐騙細節。
二、巧妙埋坑:游戲合約的設計
從 QUESTION 合約源碼看,游戲創建者設置問題和答案,啟動游戲,任何人皆可以玩家身份參與游戲,轉入不低于1 ETH 的手續費猜答案,猜中者將收獲合約中所有的 ETH,猜不中手續費自動打入合約地址。

合約源碼中包含了五個接口,啟動游戲,玩家猜答案,終止游戲,更新問題以及空的回落函數。
啟動游戲
由問題提出者啟動游戲(StartGame()),設置問題和答案,傳入的答案以哈希的形式保存在合約中。而游戲啟動僅第一次操作有效。
function StartGame(string _question,string _response)
public
payable
{
if(responseHash==0x0)
{
responseHash = keccak256(_response);
question = _question;
questionSender = msg.sender;
}
}
玩家猜答案
任何人都可以調用Play()接口,參與到游戲當中猜問題的答案,游戲玩家需要支付 1 ETH 以上的費用,否則即使猜中了也不會得到獎勵;若玩家猜測失敗,則無法獲取任何獎勵,并且支付的 ETH 也會轉入合約中。最終猜中結果的玩家將得到合約中所有的 ETH 作為獎勵。
function Play(string _response)
external
payable
{
require(msg.sender == tx.origin);
if(responseHash == keccak256(_response) && msg.value>1 ether)
{
msg.sender.transfer(this.balance);
}
}
另外,問題發布者還具有另外兩個權限,終止游戲和更新問題。
終止游戲
問題提出者有權終止游戲(StopGame()),但令小安比不解的是,終止游戲并非將游戲徹底終結,而是由問題提出者轉出合約中的所有 ETH ,但是后續玩家依舊可以繼續參與到游戲中。也就是說問題創建者可以隨時取走合約中的所有 ETH !!!
function StopGame()
public
payable
{
require(msg.sender==questionSender);
msg.sender.transfer(this.balance);
}
更新問題
問題提出者可以將問題和答案換掉(NewQuestion()),玩家后續針對新的問題進行作答。小安比隱隱覺得哪里不對勁,忍不住拿起小本本,翻出了 ERC 20 Token 中的經典問題——reApproval[3],果然如出一轍。 這是一個依賴交易順序的漏洞,當一個玩家猜中了答案,并發起一筆交易來提交了正確的答案,該筆交易等待被打包。當問題提出者也同時提交一筆交易來更改問題,若更改問題的交易先被礦工打包,則玩家即使先猜中了答案也拿不到獎勵。
function NewQuestion(string _question, bytes32 _responseHash)
public
payable
{
require(msg.sender==questionSender);
question = _question;
responseHash = _responseHash;
}
說到這,小安比突然發現,雖然都是傳入問題和答案,但是StartGame() 和 NewQuestion() 接口傳入的參數卻有所區別。StartGame() 函數傳入的第二個參數是問題答案的明文。然鵝,以太坊上接口調用的參數是可以查詢到的!!!也就是說只要找到啟動游戲的那筆交易,就可以找到問題的答案。小安比不禁露出了狡黠的笑容。

不過,在看完了 QSP 團隊安全大神的文章后,瞬間感覺閃瞎小安比雙眼,只能感嘆自己還是太年輕呀。合約中那些特殊權限的隱患只是騙子的障眼法,原來套路才剛剛開始。接下來小安比將帶領大家分析游戲的陷阱是如果設置的。
三、蜜罐陷阱:巧借 Etherscan 缺陷
由于 Etherscan 上僅涉及ETH轉賬或 Token 轉賬的交易,部分交易不會顯示,合約創建者果斷利用了這一特性來隱藏設置答案的交易,將假的答案暴露在Etherscan 上。讓聰明且有心者誤以為發現了問題答案。

首先,合約創建者先創建了一份中間合約, 然后再創建當前的游戲合約。
中間合約地址:0x4B2838d9326bD5126F0573D9b5c71C0626Ab28f2
游戲合約地址:0xcEA86636608BaCB632DfD1606A0dC1728b625387
然后,合約創建者向中間合約發起一筆交易,這筆交易使得中間合約向游戲合約發起兩次調用。但是這兩次調用在 Etherscan 的交易歷史中都不會顯示出來。但可以在交易的 Trace 中查看到,兩次調用及其參數又可以通過合約的 ABI 解碼得出。
從解碼后的結果來看,第一次是調用了 StartGame() 接口,傳入的參數,其中 _question 為 Imagine you are swimming in the sea and a bunch of hungry sharks surround you. How do you get out alive? , 答案為 sZs。第二次調用是 NewQuestion() 接口,更新了問題和答案,傳入的問題與上一次調用一致,答案是一串小安比看不太懂的鬼東西。

也就是說到目前為止,游戲的問題和答案已經偷偷的設置完成了,而第二次調用的參數中的答案才是問題的真正答案。
隨后,合約創建者又向游戲合約發起了一筆交易,調用 StartGame() 接口,也就是我們之前看到的那個答案 Stop Imagining。而這筆調用實際上并沒有起任何作用,也不是問題的答案,因此若將 Stop Imagining 作為問題的答案輸入,結果必定是錯誤的。
小安比查閱了另一個區塊鏈瀏覽器,也印證了該問題。

在Martin Derka 大神轉入了 1.05 個 ETH 到 QUESTION 合約不久后,合約創建者立即終止合約,取走了合約中所有的 ETH,至此游戲提出者成功得騙走了ETH。
四、蜜罐調查:還有多少坑在等你?
安比(SECBIT)實驗室智能合約風險監控平臺顯示,同類蜜罐合約高達 48 份,而其中已有玩家受騙的合約,竟有 21 份,受騙金額超過 25 ETH。
部分成功套取ETH的蜜罐合約地址:
0xFf45211eBdfc7EBCC458E584bcEc4EAC19d6A624_ENIGMA_GAME.sol
0xcEA86636608BaCB632DfD1606A0dC1728b625387_QUESTION.sol
0x70bf9Df6967Dc96156e76Cc43b928A7eF02E159a_X_GAME.sol
0x4a73D9fe078fA67601047F88C3e6C270602E5709_ETH_GAME.sol
0x3CAF97B4D97276d75185aaF1DCf3A2A8755AFe27_G_GAME.sol
0x8cc5d9de2c8df87f2d40d84aa78049ea6e61f973_GO_TO_PLAY.sol
0xC034CF94f7cEd9C968cC75210d1B5DdAccACFbf4_ANSWER_AND_RECIVE.sol
0xeD710216DA4B1416A78768790Ca9Aa3633Ca110f_PLAY_AND_GAIN.sol
0x1fBf025AD94ddE79f88732F79966A9A435F2772f_BLITZQUIZ.sol
該類蜜罐合約通常都在有玩家受騙后短時間內迅速結束套利,受騙群體較小,金額較少,不會造成大范圍的影響,因此也比較容易被忽視。但值得注意的是,在這些同類合約中,有一份合約是 3 天前剛部署上線的(合約地址:0x3fAb284a3cD0A6d88d18D0fdA4bc1a76cdacd68A),目前尚未發現有玩家受騙,也就是說這種詐騙手段還在繼續實施。
另外,由于合約中終止游戲接口的實際功能是使問題提出者取走合約中所有 ETH,并不是真正終止合約,也就是說,即使問題提出者成功套取利益,游戲也并沒有真正結束,玩家還是有繼續掉入合約陷阱中的風險。
小安比提醒各位 DApp 游戲愛好者提高警惕,切勿參與到以上合約的游戲中,也不要參與各種安全性不明的游戲合約。
五、蜜罐總結:幣圈套路深
設計該類蜜罐合約需要一定的技術積累和對玩家心理的把握,而受騙者大部分都是具備一定專業知識的技術人員,而這些人員往往也更容易參與到DAPP游戲中。不得不說這屆騙子很有水平啊,小安比摸了摸自己干癟的錢包,雖然躲過了被割韭菜的命運,卻很難躲得過騙子的套路!于是小安比決定從今以后多加學習,好好修煉內功,防止上當受騙。
安比(SECBIT)實驗室提醒廣大 DApp 游戲愛好者提高警惕,重視智能合約安全,切勿參與不明合約游戲。區塊鏈瀏覽器作為一種工具,其產品特性存在著一定的針對性和局限性,因此實際應用中,我們不能完全依賴于某一款區塊鏈瀏覽器所提供的數據。當然,各類區塊鏈瀏覽器網站也應在用戶界面上作出改進,盡可能降低被利用風險以及由此導致的用戶損失。
作為一個爆發式增長的領域,智能合約技術和應用的革新離不開大量涌入的專業人員的貢獻,但這其中也不免摻雜了諸多不和諧的因素,諸如本文所提到的合約以及不久前爆出的另一種蜜罐合約[4]。但小安比認為,任何一個領域的發展過程都會面臨諸多挑戰。也正因這些因素的存在,才促使行業不斷尋找新的解決方案,促進技術和社區進步,整個過程需要包括安全團隊在內的更多專業人士共同努力。
參考文獻
[1] Exploiting the interface of Etherscan for Ethereum attacks
https://medium.com/quantstamp/exploiting-the-interface-of-etherscan-for-ethereum-attacks-17b72d2897e0
[2] 【得得預警】安全公司:新型DApp游戲詐騙“現形”,隱藏特定交易記錄
http://www.chaindd.com/nictation/3103191.html
[3] ERC20 API: An Attack Vector on Approve/TransferFrom Methods
https://docs.google.com/document/d/1YLPtQxZu1UAvO9cZ1O2RPXBbT0mooh4DYKjA_jp-RLM/edit#heading=h.m9fhqynw2xvt
[4] 警惕!Solidity缺陷易使合約狀態失控
https://mp.weixin.qq.com/s/xex9Eef6Hz5o24sX5vE1Yg
本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/671/
暫無評論