高手過(guò)招:這波騙子的目標(biāo)是區(qū)塊鏈專業(yè)技術(shù)人員!區(qū)塊鏈

小蔥區(qū)塊鏈 2018-08-12 10:25
分享到:
導(dǎo)讀

實(shí)際應(yīng)用中,廣大用戶或開(kāi)發(fā)者不能完全依賴于某一款區(qū)塊鏈瀏覽器所提供的數(shù)據(jù)。

近日,一種新型蜜罐合約正在泛濫。這類合約利用區(qū)塊鏈瀏覽器 Etherscan 顯示特性,蓄意隱藏特定合約調(diào)用記錄,布局欺騙游戲參與者。且該類蜜罐合約的設(shè)計(jì)者具有較強(qiáng)的技術(shù)積累并能很好把握玩家心理,針對(duì)目標(biāo)多為具備一定區(qū)塊鏈專業(yè)素養(yǎng)的人員。當(dāng)前市場(chǎng)上的同類合約數(shù)已達(dá)48個(gè),其中近一半合約已有玩家受騙。

出于好奇,我參與了一款猜答案游戲

Martin Derka是加拿大滑鐵盧大學(xué)的一名博士,擁有10余年計(jì)算機(jī)軟件相關(guān)的科研與工作經(jīng)歷,今年6月份,他加入了知名安全團(tuán)隊(duì)Quantstamp,現(xiàn)擔(dān)任QSP高級(jí)軟件研發(fā)工程師一職。

7月的一個(gè)周末,Martin Derka在家中閑來(lái)無(wú)事,便開(kāi)始瀏覽區(qū)塊鏈瀏覽器(Etherscan)上新增的ICO項(xiàng)目及游戲項(xiàng)目,其中一份名為QUESTION的合約勾起了他的興趣,合約地址為0xcEA86636608BaCB632DfD1606A0dC1728b625387

這份合約寫(xiě)的是一個(gè)游戲,大致規(guī)則是:

合約創(chuàng)建者會(huì)設(shè)置一個(gè)問(wèn)題;

任何玩家都可以通過(guò)向合約打入不低于1ETH的手續(xù)費(fèi)參與作答;

若猜中答案,將得到合約里所有的ETH作為獎(jiǎng)勵(lì);

若猜不中,無(wú)任何獎(jiǎng)勵(lì),且事先支付的ETH會(huì)轉(zhuǎn)入該合約。

Martin Derka看到合約時(shí),里面有1.03個(gè)ETH。

Martin Derka初次見(jiàn)到的QUESTION合約狀態(tài)

一個(gè)以太幣的金額不少,只需要回答一個(gè)問(wèn)題就能到手?Martin Derka隱約覺(jué)得這個(gè)游戲有貓膩,于是他開(kāi)始查看合約的構(gòu)造邏輯。

一番瀏覽后,他發(fā)現(xiàn)合約的設(shè)計(jì)似乎存在很多不得當(dāng)之處。例如,Solidity編譯器版本老舊,標(biāo)注不規(guī)范,合約方案設(shè)計(jì)既費(fèi)力又浪費(fèi)以太坊GAS,不過(guò)他把這些都視作以太坊“初學(xué)者的失誤”。

我的第一印象是,這份合約肯定是剛接觸Solidity 和以太坊的初期開(kāi)發(fā)者撰寫(xiě)的”Martin Derka事后回憶時(shí)表示。

他進(jìn)一步分析代碼,發(fā)現(xiàn)了更多疑點(diǎn):

合約存在一些怪異、低效的構(gòu)造;

合約想要隱藏一些私有的數(shù)據(jù);

存在一些低級(jí)錯(cuò)誤:玩家能通過(guò)在以太坊瀏覽器上查看交易記錄準(zhǔn)確破解出答案。

至此,Martin Derka基本確定這份合同是個(gè)騙局,合約中的以太坊余額大概是個(gè)誘餌,很大可能會(huì)讓玩家損失其加入游戲時(shí)支付的ETH,因?yàn)樗X(jué)得這個(gè)合約的設(shè)計(jì)實(shí)在有太多無(wú)法解釋的地方。

帶著種種猜測(cè)與疑惑,Martin Derka加入了游戲,試圖摸清騙局真相。

我十分謹(jǐn)慎,但我被騙了1.05個(gè)ETH

Martin Derka十分謹(jǐn)慎地留意合約創(chuàng)建者所進(jìn)行的每一個(gè)動(dòng)作:

首先合約創(chuàng)建者在5873826區(qū)塊高度上通過(guò)一筆交易創(chuàng)建了一個(gè)智能合約;

其次,合約創(chuàng)建者啟動(dòng)游戲,將問(wèn)題“Imagine you are swimming in the sea and a bunch of hungry sharks surround you. How do you get out alive?”和答案“Stop Imagining”以及1.03個(gè)ETH寫(xiě)入了高度為5873943的區(qū)塊,1.03個(gè)ETH順利打入其創(chuàng)建的智能合約;

除此之外Etherscan上未見(jiàn)到任何其他交易記錄。

啟動(dòng)游戲的交易記錄:包括問(wèn)題和答案(答案是明文顯示的)

Martin Derka首先對(duì)正確答案進(jìn)行了判斷。

QUESTION游戲中與設(shè)置問(wèn)題和答案相關(guān)的接口只有兩個(gè)(一個(gè)是啟動(dòng)游戲,一個(gè)是更新問(wèn)題)。啟動(dòng)游戲接口只在最開(kāi)始時(shí)調(diào)用才有效,一旦啟動(dòng)了下次再調(diào)就無(wú)效;更新問(wèn)題接口要在游戲啟動(dòng)后才能調(diào)。游戲啟動(dòng)以后,若調(diào)用了更新問(wèn)題接口,則最后一次更新設(shè)置的問(wèn)題和答案才是游戲當(dāng)前真正的問(wèn)題和答案,若沒(méi)有調(diào)用更新問(wèn)題,則第一次啟動(dòng)游戲的時(shí)候設(shè)置的問(wèn)題和答案就是正確的問(wèn)題和答案。

從etherscan上的交易記錄來(lái)看,該合約只調(diào)用了一次啟動(dòng)游戲,所以Martin Derka判斷這條交易記錄中記錄的就是正確答案,而由于合約設(shè)計(jì)者的“失誤”,答案是以明文傳輸?shù)模灰子涗浿兄苯泳湍塬@取到。

Martin Derka隨后轉(zhuǎn)了一些ETH到自己的Metamask錢包賬戶里。

不過(guò)謹(jǐn)慎的Martin Derka第一次回答這個(gè)問(wèn)題時(shí)沒(méi)打ETH進(jìn)合約,因?yàn)樗雱?chuàng)建個(gè)交易驗(yàn)證一下,創(chuàng)建者提交的正確答案是不是能夠被準(zhǔn)確破解;如果是,SHA256應(yīng)該產(chǎn)生相同結(jié)果;他調(diào)用合約方法并進(jìn)行一番驗(yàn)證后,覺(jué)得沒(méi)什么問(wèn)題。

第二次,他將1.05個(gè)ETH連同正確答案一同提交參與作答,然后等待答題結(jié)果。

當(dāng)他的交易被挖掘出來(lái)時(shí),預(yù)料中的騙局出現(xiàn)了:游戲合約的余額增加到超過(guò)2.08個(gè)ETH,而Martin Derka錢包里的1.05個(gè)ETH不見(jiàn)了。

按照游戲規(guī)則,Martin Derka提交了正確答案、且事先支付了1.05個(gè)ETH,他理應(yīng)贏得合約里所有以太坊余額的,但他卻賠了。以太坊瀏覽器上也真實(shí)記錄了他的1.05個(gè)ETH轉(zhuǎn)入游戲合約的記錄。

圖中Etherscan記錄的最近2筆交易正是Martin Derka創(chuàng)建的

一時(shí)間,Martin Derka 有點(diǎn)不相信自己的眼睛。他一直在檢查代碼和交易,絲毫沒(méi)有放松過(guò),但騙子就在他眼皮底下騙走了他的以太幣。他開(kāi)始重新梳理這個(gè)過(guò)程,交易的排序是正確的,代碼也看不出任何蹊蹺,他在本地部署了代碼,并進(jìn)行測(cè)試驗(yàn)證,一切都好像沒(méi)什么問(wèn)題。

而就在這時(shí),游戲合約的余額突然降到了0,問(wèn)題創(chuàng)建者終止了游戲,此時(shí)距離Martin Derka 答題結(jié)束大約1個(gè)小時(shí)。

我看到的一切,都只是對(duì)方想讓我看到的

恰恰是合約創(chuàng)建者急忙提走2.08個(gè)ETH的這筆交易揭開(kāi)了謎底。

Martin Derka注意到,合約余額(2.08ETH)并未被轉(zhuǎn)移到某個(gè)錢包,而是被轉(zhuǎn)入了另一個(gè)專用源碼合約。并且他在交易歷史中,發(fā)現(xiàn)有一筆指向游戲合約的內(nèi)部交易并未被以太坊瀏覽器記錄。

經(jīng)過(guò)一番查證分析,他發(fā)現(xiàn)之前他所看到的并非全貌,其實(shí)游戲合約創(chuàng)建者實(shí)際的行動(dòng)順序是

(1)合約創(chuàng)建者先創(chuàng)建了一份中間合約,合約地址為:

0x4B2838d9326bD5126F0573D9b5c71C0626Ab28f2

(2)合約創(chuàng)建者創(chuàng)建當(dāng)前的游戲合約,合約地址為:

0xcEA86636608BaCB632DfD1606A0dC1728b625387

(3)合約創(chuàng)建者向中間合約發(fā)起一筆交易。這筆交易使得中間合約向游戲合約發(fā)起兩次調(diào)用,這兩次調(diào)用在 Etherscan 的交易歷史中都不會(huì)顯示,但可以在交易的Trace中查看到,兩次調(diào)用及其參數(shù)皆可通過(guò)合約的 ABI 解碼得出,從解碼結(jié)果來(lái)看:

第一次是調(diào)用了 啟動(dòng)游戲接口,傳入了問(wèn)題和答案兩個(gè)參數(shù),其中問(wèn)題為“Imagine you are swimming in the sea and a bunch of hungry sharks surround you. How do you get out alive? ”答案為“sZs”(明文顯示的)。

第二次是調(diào)用了更新問(wèn)題接口,更新了問(wèn)題和答案,傳入的問(wèn)題與上一次調(diào)用時(shí)是一致的,而答案則是一串哈希值。

第一次調(diào)用詳情

第二次調(diào)用詳情

也就是說(shuō),在啟動(dòng)游戲并設(shè)置好問(wèn)題和答案之后,合約創(chuàng)建者又迅速更改了一次問(wèn)題和答案,而第二次調(diào)用時(shí)設(shè)置的答案才是問(wèn)題的真正答案,但這筆交易記錄被隱藏了

(4)合約創(chuàng)建者又向游戲合約發(fā)起了一筆交易,調(diào)用啟動(dòng)游戲接口,傳入問(wèn)題“Imagine you are swimming in the sea and a bunch of hungry sharks surround you. How do you get out alive?”和答案“Stop Imagining”,而由于啟動(dòng)游戲只有第一次調(diào)用有效,本次調(diào)用實(shí)際上不會(huì)改變合約的任何狀態(tài),答案自然也不是正確答案。但設(shè)計(jì)者故意讓玩家看到這筆交易記錄

因此Martin Derka將“Stop Imagining” 作為正確答案輸入,結(jié)果必定錯(cuò)誤。

“調(diào)查之后,我才發(fā)現(xiàn)這是一段精心編寫(xiě)的代碼,他們只是在假裝天真。”Martin Derka在事后的回憶文章中這樣評(píng)價(jià)QUESTION合約,并表示“十分欽佩這份合約的設(shè)計(jì)”。

我們?cè)俸?jiǎn)要回顧一下這個(gè)高明的騙局。

合約設(shè)計(jì)者拋出游戲規(guī)則并在合約中打入一定的ETH,吸引玩家繳費(fèi)進(jìn)場(chǎng)答題賺ETH;同時(shí)設(shè)局讓玩家自認(rèn)為能通過(guò)交易歷史破解答案,然后不聲不響地賺取ETH。而實(shí)際上是螳螂捕蟬、黃雀在后,合約創(chuàng)建者讓你邊竊喜邊發(fā)現(xiàn)的答案并非真實(shí)答案,技術(shù)帝們憑借“機(jī)智”最終不僅賺不到合約中的ETH,還會(huì)賠光預(yù)先繳納的手續(xù)費(fèi)。

安全專家:已“繳獲”48個(gè)同類蜜罐合約

上述玩法是典型的蜜罐合約,陷阱設(shè)計(jì)精巧嫻熟,往往讓人防不勝防,這不連QSP團(tuán)隊(duì)的安全大神Martin Derka也沒(méi)能幸免。

設(shè)計(jì)該類蜜罐合約需要一定的技術(shù)積累和對(duì)玩家心理的把握,而受騙者大部分都是具備一定專業(yè)知識(shí)的技術(shù)人員,且這些人員往往也更容易參與到DAPP游戲中”安比實(shí)驗(yàn)創(chuàng)始人郭宇向小蔥表示。

“這類蜜罐合約就是這樣,讓玩家以為發(fā)現(xiàn)了游戲的漏洞,而實(shí)際上只是游戲設(shè)計(jì)者的圈套,我們調(diào)查統(tǒng)計(jì)了當(dāng)前市場(chǎng)上的同類合約,發(fā)現(xiàn)這一詐騙手段屢試不爽”,他補(bǔ)充道。

據(jù)安比實(shí)驗(yàn)室智能合約風(fēng)險(xiǎn)監(jiān)控平臺(tái)顯示,同類合約的數(shù)量已高達(dá)48個(gè),最近的部署為3天前。其中,已有玩家受騙的合約逾21份,累計(jì)受騙金額超過(guò) 25 ETH。

以下是部分成功套取ETH的蜜罐合約地址:

小蔥APP特此提醒各位DApp 游戲愛(ài)好者提高警惕,切勿參與到上述合約地址的游戲中,也不要參與各種安全性不明的游戲合約。

該類蜜罐合約通常都在有玩家受騙后短時(shí)間內(nèi)迅速結(jié)束套利,受騙群體較小,金額較少,不會(huì)造成大范圍的影響,故而也比較容易被忽視”安比實(shí)驗(yàn)室安全專家p0n1告訴小蔥。

不過(guò),他提醒說(shuō)“3天前還有一份剛部署的合約,目前尚無(wú)玩家受騙,可見(jiàn)這種詐騙手段還在繼續(xù)。”合約地址是:0x3fAb284a3cD0A6d88d18D0fdA4bc1a76cdacd68A。

此外,p0n1指出,由于合約中終止游戲接口的實(shí)際功能是使問(wèn)題提出者取走合約中所有 ETH,并不是真正終止合約。簡(jiǎn)言之,即使問(wèn)題提出者成功套取利益,游戲也并未真正結(jié)束玩家還是有繼續(xù)掉入合約陷阱中的風(fēng)險(xiǎn)

小蔥小結(jié)

不得不感嘆騙子水平的提升,不僅積極鉆研代碼技術(shù),還懂得參悟人性心理。

不過(guò)除了驚訝于騙子的高明外,我們也應(yīng)該看到,區(qū)塊鏈瀏覽器作為一種工具,其產(chǎn)品特性存在著一定的針對(duì)性和局限性。本文QUESTION合約的設(shè)計(jì)者正是利用以太坊瀏覽器中部分交易記錄不顯示的特點(diǎn)成功欺騙玩家。

因此實(shí)際應(yīng)用中,廣大用戶或開(kāi)發(fā)者不能完全依賴于某一款區(qū)塊鏈瀏覽器所提供的數(shù)據(jù)。當(dāng)然,各類區(qū)塊鏈瀏覽器網(wǎng)站也應(yīng)在用戶界面上作出改進(jìn),盡可能降低被利用風(fēng)險(xiǎn)以及由此導(dǎo)致的用戶損失。

作為一個(gè)爆發(fā)式增長(zhǎng)的領(lǐng)域,智能合約技術(shù)和應(yīng)用的革新離不開(kāi)大量涌入的專業(yè)人員的貢獻(xiàn),但這其中也不免摻雜了諸多不和諧的因素,諸如本文所提到的合約以及不久前爆出的另一種蜜罐合約。不過(guò),也正因這些因素的存在,才促使行業(yè)不斷尋找新的解決方案,促進(jìn)技術(shù)和社區(qū)進(jìn)步,整個(gè)過(guò)程需要包括安全團(tuán)隊(duì)在內(nèi)的更多專業(yè)人士共同努力。

文末,附上安比實(shí)驗(yàn)室提供的QUESTION合約源碼分析詳情,對(duì)該合約的詳細(xì)功能實(shí)現(xiàn)做了完美梳理,保證看完你也會(huì)寫(xiě)了。

游戲合約的設(shè)計(jì):埋坑的基礎(chǔ)實(shí)踐

QUESTION合約的源碼中包含5個(gè)接口:?jiǎn)?dòng)游戲,玩家猜答案,終止游戲,更新問(wèn)題以及空的回落函數(shù)。

啟動(dòng)游戲

由問(wèn)題提出者啟動(dòng)游戲(StartGame()),設(shè)置問(wèn)題和答案,傳入的答案以哈希的形式保存在合約中。而游戲啟動(dòng)僅第一次操作有效。

玩家猜答案

任何人都可調(diào)用Play() 接口,參與游戲猜答案,游戲玩家需支付 1 ETH 以上的費(fèi)用(否則即使猜中也無(wú)獎(jiǎng)勵(lì))。

若猜測(cè)錯(cuò)誤,無(wú)法任何獎(jiǎng)勵(lì),且事先支付的ETH會(huì)轉(zhuǎn)入該合約。若猜測(cè)正確,將得到合約中所有的ETH作為獎(jiǎng)勵(lì)。

另外,問(wèn)題發(fā)布者還具有兩個(gè)權(quán)限:終止游戲和更新問(wèn)題。

終止游戲

問(wèn)題提出者有權(quán)終止游戲(StopGame()),但終止游戲并非將游戲徹底終結(jié),而是由問(wèn)題提出者轉(zhuǎn)出合約中的所有 ETH ,但后續(xù)玩家依舊能繼續(xù)參與游戲。也就是說(shuō),問(wèn)題創(chuàng)建者能隨時(shí)取走合約中所有的ETH。

更新問(wèn)題

問(wèn)題提出者可將問(wèn)題和答案換掉(NewQuestion()),玩家后續(xù)針對(duì)新問(wèn)題進(jìn)行作答。

這是ERC 20 Token 中的經(jīng)典問(wèn)題——reApproval,依賴交易順序的漏洞進(jìn)行作惡。

一個(gè)玩家猜中答案,并發(fā)起一筆交易來(lái)提交正確答案時(shí),該筆交易會(huì)等待被打包;

而同時(shí),問(wèn)題提出者也提交一筆交易來(lái)更改問(wèn)題,若更改問(wèn)題的交易先被礦工打包,則玩家即使先猜中了答案也拿不到獎(jiǎng)勵(lì)。

這里,雖然都是傳入問(wèn)題和答案,但StartGame() 和 NewQuestion() 接口傳入的參數(shù)卻有所區(qū)別。StartGame() 函數(shù)傳入的第二個(gè)參數(shù)是問(wèn)題答案的明文。然而,以太坊上接口調(diào)用的參數(shù)是可以查詢到的。簡(jiǎn)單說(shuō),只要找到啟動(dòng)游戲的那筆交易,就能找到問(wèn)題的答案。

當(dāng)然,合約中那些特殊權(quán)限的隱患只是障眼法,其實(shí)套路才剛剛開(kāi)始。接下來(lái)我們看看游戲陷阱是如何設(shè)置的。

蜜罐陷阱的實(shí)現(xiàn):巧借 Etherscan 缺陷

由于 Etherscan 上僅涉及ETH轉(zhuǎn)賬或 Token 轉(zhuǎn)賬的交易,部分交易不會(huì)顯示,合約創(chuàng)建者利用這一特性來(lái)隱藏設(shè)置答案的交易,將假的答案暴露在Etherscan 上。讓聰明且有心者誤以為發(fā)現(xiàn)了問(wèn)題答案。

首先,合約創(chuàng)建者創(chuàng)建一份中間合約

其次,合約創(chuàng)建者創(chuàng)建當(dāng)前的游戲合約;

然后,合約創(chuàng)建者向中間合約發(fā)起一筆交易。這筆交易使得中間合約向游戲合約發(fā)起兩次調(diào)用。但這兩次調(diào)用在 Etherscan 的交易歷史中都不會(huì)顯示出來(lái)。我們可以在交易的Trace中查看到,兩次調(diào)用及其參數(shù)又可以通過(guò)合約的 ABI解碼得出。

從解碼后結(jié)果來(lái)看,第一次是調(diào)用了StartGame() 接口,傳入了問(wèn)題“Imagine you are swimming in the sea and a bunch of hungry sharks surround you. How do you get out alive? ”和答案“sZs”。第二次調(diào)用了 NewQuestion() 接口,傳入的問(wèn)題與上一次調(diào)用一致,答案則是一串哈希。至此,游戲的真實(shí)問(wèn)題和答案偷偷設(shè)置完成,第二次調(diào)用的參數(shù)中的答案才是問(wèn)題真正答案。

最后,合約創(chuàng)建者又向游戲合約發(fā)起了一筆交易。調(diào)用StartGame() 接口,傳入的問(wèn)題與之前一致,答案正是Martin Derka看到的“Stop Imagining”。而由于啟動(dòng)游戲只有第一次調(diào)用有效,本次調(diào)用根本不會(huì)改變合約的任何狀態(tài),自然也不是問(wèn)題的正確答案。

安比實(shí)驗(yàn)室在另一個(gè)區(qū)塊鏈瀏覽器上進(jìn)行查詢,也證實(shí)了這一問(wèn)題。

在Martin Derka轉(zhuǎn)入1.05 個(gè) ETH 到 QUESTION 合約不久后,合約創(chuàng)建者立刻就終止了合約,并取走合約中所有的ETH,至此游戲提出者成功得騙取ETH,一輪流程結(jié)束。

合約 游戲 答案 ETH 問(wèn)題
分享到:

1.TMT觀察網(wǎng)遵循行業(yè)規(guī)范,任何轉(zhuǎn)載的稿件都會(huì)明確標(biāo)注作者和來(lái)源;
2.TMT觀察網(wǎng)的原創(chuàng)文章,請(qǐng)轉(zhuǎn)載時(shí)務(wù)必注明文章作者和"來(lái)源:TMT觀察網(wǎng)",不尊重原創(chuàng)的行為TMT觀察網(wǎng)或?qū)⒆肪控?zé)任;
3.作者投稿可能會(huì)經(jīng)TMT觀察網(wǎng)編輯修改或補(bǔ)充。


專題報(bào)道