【小心】首个区块链token的自动化薅羊毛攻击剖析
宣布时间 2018-07-19近期,尊龙凯官网入口ADLab团结电子科技大学的陈厅副教授【1】追踪到了以太坊token中的首个自动化薅羊毛攻击事务。被攻击的合约地址为0x86c8bf8532aa2601151c9dbbf4e4c4804e042571【2】,token名称为Simoleon (SIM),阻止现在有靠近57万账户持有该合约的token:
经由深入剖析,我们发明攻击者对以太坊的明确很是深刻,其通过安排攻击合约获得了凌驾700万的token,从57万账户中脱颖而出,一举成为该合约token的第四大持有者:
二、被攻击的合约Simoleon
在token刊行历程中,为增添人气刊行方可能会选择空投,即在一准时间窗口和投放总量的条件下免费给到园地址发送一定命目的token。Simoleon合约也加入了空投能力,在总量发放完之前,任何未接受过该token空投的账户都可以挪用本合约的transfer函数给指定账户地址免费转账token:
三、攻击历程剖析
我们剖析攻击账户的token泉源,通过etherscan审查该账户的token生意纪录,一共分为两项:709万和1万,划分来自差别的账户地址:
继续跟踪709万token的生意纪录,其泉源有三项:550万,155万和3万,都来自统一个账户地址0x73fa30b609249166fa425f34b7142591c92b5548:
剖析发明地址0x73fa30b609249166fa425f34b7142591c92b5548是一个闭源智能合约,由账户0x0075fd99426911b2e9650114bedc1195ad027f21建设,该合约总共有23笔生意:
Simoleon合约对已经发放token的地址都举行了纪录,因此每个地址只能免费获得1万的token。要获得更多的数目,就需要建设许多新账户,然后使用这些新账户挪用Simoleon合约的transfer函数给指定账户来获得大宗token。若是通过建设EOA账户来举行薅羊毛,则每个账户都需要一些以太币,不然EOA账户就没有gas去挪用Simoleon合约的transfer函数,也就无法薅羊毛。显然,给大宗EOA账户发送以太币会增添特另外生意手续费。
攻击者在这里接纳了一种精妙的攻击手法:首先安排一个恶意的攻击合约,地址为0x73fa30b609249166fa425f34b7142591c92b5548;然后挪用攻击合约中署名为0x2b6cab44的函数来动态天生暂时合约;最后暂时合约在结构函数中直接挪用Simoleon合约的transfer函数给攻击合约发送token。由于动态天生的暂时合约都是未领取过token的账户,以是都能自动获得空投份额。攻击者只需要给攻击账户发送以太币就有足够的gas挪用攻击合约,同时攻击者还能控制暂时合约的天生数目。
通太过析攻击合约的23个生意数据,获得攻击者对0x2b6cab44函数的挪用历程如下:
其中第一笔的生意(0x7f87268e06b76644ad4b8e162fb76d1c6e2e0480029b14db0e013f7d7d195e2f)细节如下,攻击者通过0x2b6cab44函数的参数来控制只天生2个暂时合约,2个暂时合约划分获取1万的token,然后发送给攻击合约。暂时合约最后还举行了自动销毁,使自己的代码从区块链上消逝。
攻击者前面4笔的生意中,每次天生的暂时合约数目越来越大。其中第4次天生了80个暂时合约,可是执行失败了,审查缘故原由是gas缺乏。
攻击者在后续的生意中,每次都选择只天生50个暂时合约。理论上攻击者可以增大允许的gas消耗量,从而一次性建设80个暂时合约来加速薅羊毛,但攻击者却选择一次50个的搬砖模式。通过深入剖析,我们发明攻击者对以太坊的底层机制相当熟悉,好比这里的gas消耗问题。
在以太坊中,每一笔生意都会消耗一定量的gas,现实消耗量由生意的重漂后决议,但不会凌驾发送者指定该生意能允许的最大消耗量。逆向剖析0x2b6cab44函数后发明它是在循环建设暂时合约,显然循环次数越多,这个函数挪用的生意重漂后就越高,现实的gas消耗量就越大,允许的gas消耗量也就必需设置为越大。暂时合约数目设置为50的时间,gas现实消耗量为3096224;暂时合约数目设置为80时,gas现实消耗量为6174290。
然而,每个区块又有最大gas消耗量的阈值,并且每个区块至少要容纳1笔生意,因此以太坊链上任何一笔生意的gas消耗量都不允许凌驾区块的阈值。这进一步导致,在矿工最优化收益计划中,若是一个生意允许的gas消耗量过大,就会倾向性把这个生意扫除在区块外,从而导致该生意失败。攻击者通过探测实验找到最佳暂时合约数目为50(由于80个暂时合约的gas消耗已经凌驾允许的gas消耗导致生意失败),从而实现一次挪用可以薅更多token,同时又不会触发gas问题。
行家一脱手,就知有没有!不愧是有知识的攻击者。
四、潜在玄机的etherscan
在追踪剖析历程中,我们发明了另外一起问题,即etherscan对token的转变纪录是禁绝确的,甚至可能完全是过失的。如下是攻击合约的第一笔token收入,2个暂时合约总共获得2万token,然后发送给了攻击合约:
紧接着攻击合约爆发了第一笔token支出,发送了3万token给攻击者:
凭证etherscan中的生意纪录,攻击合约的收入只有2万,效果支持了3万。多支出的1万出自那里,是否凭空爆发?为何这1万的转变,etherscan没有任何纪录?
经太过析,找到缘故原由就在Simoleon合约的transfer函数,合约在空投的时间也会对目的地址举行免费发送token,可是这个发放却没有挪用Transfer事务:
于是,攻击合约的token转变历程如下:
(1)攻击合约被建设,token为零。
(2)攻击合约0x2b6cab44函数第一次被挪用,建设2个暂时合约:
a)第1个暂时合约初始化时挪用Simoleon的transfer函数,该函数首先给暂时合约空投initialize(msg.sender),此时暂时合约的token为1万;然后给攻击合约空投initialize(_to),此时攻击合约的token为1万;最后把暂时合约的1万token发送给攻击合约,同时挪用事务Transfer纪录暂时合约给攻击合约的发送量为1万。至此,攻击合约的token总计为2万,由空投的1万加上暂时合约发送的1万组成。
b)第2个暂时合约初始化时挪用Simoleon的transfer函数,该函数首先给暂时合约空投initialize(msg.sender),此时暂时合约拥有的token为1万;然后把暂时合约的1万token发送给攻击合约,同时挪用事务Transfer纪录暂时合约给攻击合约的发送量为1万。至此,攻击合约的token总计为3万,由先前2万加暂时合约发送的1万组成。
(3)攻击者从攻击合约提取所有token,提取总量token为3万。
因此,从攻击合约账户自身的收支平衡来看,并没有凭空爆发token,只是etherscan未能监控到攻击合约由于空投获得的1万token。这说明晰etherscan对token转变的监控是基于Transfer事务,而不是基于每个账户的现实token转变。这会带来一些潜在的威胁,由于Transfer事务在实质上只是一个品德约束,EVM自己对其没有任何限制能力,攻击者可以不挪用事务,也可以恣意修改该事务的参数,实现诸如:现实转移的token量比事务通知的数目不匹配。关于频仍生意token的节点来说,这是一个新的挑战,由于该节点将难以通过链上数据追踪每笔token的泉源,由于Transfer事务不再是准确的。
五、总结
Simoleon合约能被自动化的薅羊毛,最基础的缘故原由在于其合约代码的空投奖励函数没有任何权限控制,恣意未领过空投的账户都可以直接挪用Simoleon合约来获取。因此,攻击者可以使用攻击合约来建设大宗账户来领取。一种缓解步伐是给空投奖励函数设置权限控制,好比只有合约建设者才华给目的地址发放token。
区块链的特征决议了合约代码一经安排就无法修改,无论是合约的开发者,照旧投资者,照旧友易平台,都应当对合约举行多重清静审计,只管在上链前消除清静危害。
参考链接:
【1】Ting Chen, University of Electronic Science and Technology of China.
http://faculty. uestc.edu.cn/chenting/zh_CN/ index.htm
【2】Simoleon (SIM).
https://etherscan.io/address/0x86c8bf8532aa2601151c9dbbf4e4c4804 e042571


京公网安备11010802024551号