作者:安比实验室
公众号:安比实验室SECBIT
安比(SECBIT)实验室近期发出预警,一种新型蜜罐(诈骗)合约正在泛滥,利用区块链浏览器的相关局限,设置陷阱欺骗游戏参与者,且诈骗目标多为具备一定区块链专业素养的人员。据安比(SECBIT)实验室统计数据显示,同类合约的数量高达48个,其中一个合约部署于 3 天前,已有玩家受骗的合约超过21份,累计骗取金额超过 25 ETH。
前几天,小安比从 p0n1 大神那里听说了一种新型的蜜罐(诈骗)合约,同类蜜罐合约竟有 48 个,而其中近一半的合约已经成功骗取玩家的 ETH,据说连 QSP 团队的安全大神 Martin Derka 也未能幸免。这不禁激发起了小安比浓浓的好奇心。
Martin Derka 所参与的这个名为 QUESTION 的合约,是一款猜答案游戏合约。
合约地址:0xcEA86636608BaCB632DfD1606A0dC1728b625387
合约游戏的规则很简单:
合约的巧妙设计会为高阶玩家埋下一些陷阱,让玩家自认为通过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 上仅涉及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