一種利用 etherscan.io 缺陷的智慧合約蜜罐正悄然流行
安比(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)publicpayable{ if(responseHash==0x0) { responseHash = keccak256(_response); question = _question; questionSender = msg.sender; } }
玩家猜答案
任何人都可以呼叫 Play()
介面,參與到遊戲當中猜問題的答案,遊戲玩家需要支付 1 ETH 以上的費用,否則即使猜中了也不會得到獎勵;若玩家猜測失敗,則無法獲取任何獎勵,並且支付的 ETH 也會轉入合約中。最終猜中結果的玩家將得到合約中所有的 ETH 作為獎勵。
function Play(string _response)externalpayable{ require(msg.sender == tx.origin); if(responseHash == keccak256(_response) && msg.value>1 ether) { msg.sender.transfer(this.balance); } }
另外,問題釋出者還具有另外兩個許可權,終止遊戲和更新問題。
終止遊戲 問題提出者有權終止遊戲( StopGame()
),但令小安比不解的是,終止遊戲並非將遊戲徹底終結,而是由問題提出者轉出合約中的所有 ETH ,但是後續玩家依舊可以繼續參與到遊戲中。也就是說 問題建立者可以隨時取走合約中的所有 ETH !!!
function StopGame()publicpayable{ require(msg.sender==questionSender); msg.sender.transfer(this.balance); }
更新問題
問題提出者可以將問題和答案換掉( NewQuestion()
),玩家後續針對新的問題進行作答。小安比隱隱覺得哪裡不對勁,忍不住拿起小本本,翻出了 ERC 20 Token 中的經典問題——reApproval[3],果然如出一轍。 這是一個依賴交易順序的漏洞,當一個玩家猜中了答案,併發起一筆交易來提交了正確的答案,該筆交易等待被打包。當問題提出者也同時提交一筆交易來更改問題,若更改問題的交易先被礦工打包,則玩家即使先猜中了答案也拿不到獎勵。
function NewQuestion(string _question, bytes32 _responseHash)publicpayable{ 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
往期回顧
ofollow,noindex" target="_blank">以太坊標準接納中國團隊安全建議 – EIP827安全事件跟蹤
安⽐(SECBIT)實驗室攜⼿路印(Loopring)共同釋出智慧合約風險列表
本文由安比(SECBIT)實驗室提供,轉載請註明出處。
安比(SECBIT)實驗室
安比(SECBIT)實驗室專注於區塊鏈與智慧合約安全問題,全方位監控智慧合約安全漏洞、提供專業合約安全審計服務,在智慧合約安全技術上開展全方位深入研究,致力於參與共建共識、可信、有序的區塊鏈經濟體。
安比(SECBIT)實驗室創始人郭宇,中國科學技術大學博士、耶魯大學訪問學者、曾任中科大副教授。專注於形式化證明與系統軟體研究領域十餘年,具有豐富的金融安全產品研發經驗,是國內早期關注並研究比特幣與區塊鏈技術的科研人員之一。研究專長:區塊鏈技術、形式化驗證、程式語言理論、作業系統核心、計算機病毒。
安比(SECBIT)實驗室
參與共建共識、可信、有序的區塊鏈經濟體