内外纷歧:Sanshu Inu的Memestake合约遭袭事宜剖析

2022皇冠世界杯

www.hgw88888888.com)实时更新发布最新最快的2022皇冠世界杯各国赛程一览、2022世界杯会员线路、2022世界杯备用登录网址、2022世界杯手机管理端、2022世界杯手机版登录网址、2022世界杯皇冠登录网址。

,

前言

北京时间2021年07月21日03:40,我们的攻击检测系统检测到某个生意异常。通过对该生意举行扩展剖析,我们发现这是一起行使通缩代币(deflation token)KEANU的机制对Sanshu Inu部署的Memestake合约的奖励盘算机制的破绽举行攻击的事宜,攻击者最后赚钱ETH约56个。下面详细剖析如下:

0x0. 靠山先容

今年以来爆火的狗狗币(DOGE)、柴犬币(SHIB)引发了普遍的关注,同时带火了其他相关的meme币,更引发了大量的项目方开发自己的meme币及围绕meme币提供服务,其中Sanshu Inu就是其中一员。Sanshu Inu不仅刊行meme币SANSHU,还确立了合约Memestake作为meme币的耕作池。用户只要往Memestake中质押meme币,就可以获得代币Mfund作为奖励。

另一方面,大量的meme币都是通缩代币,即该种代币的刊行量会逐渐削减。其中部门meme币的通缩实现形式是在用户每次举行生意转账(transfer)的时刻扣取一定比例的币用于销毁和再分配,这将导致吸收方现实收到的token数目小于支出方现实支付的数目。本次涉及的通缩代币KEANU就是接纳这种实现。

该攻击的大致原理就是通过控制Memestake举行KEANU的多次转入转出削减其持有的KEANU数目,从而行使其奖励盘算函数的破绽致使Memestake给攻击者发送大量Mfund。

0x1. 代码剖析

KeanuInu 合约

正如前面所说,KeanuInu在实现代币KEANU的转账时,会扣取一定比例的币用于销毁和再分配,其中用于销毁的比例设置为定值——2%。如图,在挪用KeanuInu的transfer()及transferFrom()函数的时刻,函数挪用中显示的转账数目跟emit的事宜log中纪录的数目并纷歧致。

其由于其现实代码实现较为庞大,此处不再展示,感兴趣的同伙可以凭证后面附录给出的合约地址在etherscan.io自行查看合约实现。另外,上面两张截图泉源于我们自行开发的生意剖析工具,现在开放公测中。迎接列位点击https://tx.blocksecteam.com:8080/试用。我们的工具将函数挪用与历程中发生事宜log连系展示的方式,对于剖析通缩代币等问题更有辅助。

Memestake 合约

下图是MemeStake的deposit函数。函数首先挪用updatePool更新资金池状态,然后将用户的token转账给自己。当传入的_amount大于0时会在代码的1295行举行转账。

然而,由于KEANU token的通缩特征,虽然挪用safeTransferFrom函数时传入的金额是amount,然则现实上转入资金池的金额小于amount。而且在代码剖析中我们注重到,transfer的目的地是自己,也就是说对于MemeStake来说,所有用户的某个币种(如KEANU token)的存款都属于MemeStake。

在转账后的1296行,MemeStake会对用户的存款举行挂号,但这里挂号接纳的仍然是amount(而真实的转账量小于amount),因此用户真正的存款量比挂号的user.amount更小

最后在1299行,可以看出user.rewardDebt参数也是凭证(比真实值要大的)user.amount来盘算的。

下图是MemeStake的withdraw函数。该函数首先会检查user.amount是否另有足够的余额,但由于user.amount自己比真实值大,因此这里的检查是禁绝确的。接下来,同样会挪用updatePool函数更新资金池状态。

在1321行,withdraw函数会先扣除在user.amount中挂号的余额,然后挪用transfer函数把token转回用户。和deposit函数一样,这里的逻辑同样存在问题,由于每次转账都市造成通缩,因此转给用户的数目会小于现实的转账量。

最厥后看MemeStake的updatePool函数。首先从1255行可以看出,每次挪用会纪录上一次更新的blockNumber,若是此次挪用的区块和上次更新时相同,则会直接返回,也就是说updatePool对每个区块只会更新一次资金池状态

接下来在1259行,会获取MemeStake自身在token合约中的余额(上文提到,每次用户deposit都市将token转给MemeStake)。最后在1275行,会行使这个余额作为分母,盘算该资金池每一次deposit和withdraw的奖励(也就是pool.accMfundPerShare参数)。盘算方式如下:

pool.accMfundPerShare += mFundReward / token.balanceOf(MemeStake)

回到withdraw,我们来看存取款奖励代币Mfund是怎样转账的。首先在上图withdraw函数的第1325行,盘算用户是否有pending的Mfund token没有发放,盘算公式为:

rewardMfund = user.amont * pool.accMfundPerShare / 1e18 - user.rewardDebt。

而rewardDebt是这样盘算的(图中第1325行):

user.rewardDebt = user.amount * pool.accMfundPerShare / 1e18

因此,从代码中我们不难组织出一种可能的攻击:

0x2. 攻击剖析

前面先容了破绽成因及破绽的行使方式,我们接下来先容攻击者现实是若何举行攻击的。

如图所示,攻击可以分为4步,其中要害攻击步骤为第2步,行使通缩代币的特征操作Memestake的奖励盘算。

免费足球推荐

免费足球贴士网(www.zq68.vip)是国内最权威的足球赛事报道、预测平台。免费提供赛事直播,免费足球贴士,免费足球推介,免费专家贴士,免费足球推荐,最专业的足球心水网。

  1. 第2步(操作),攻击者先从uniswapV2中flash loan大量的KEANU代币,然后通过合约二往Memestake中多次deposit 和withdraw大量KEANU,导致Memestake被迫大量生意KEANU。由于KEANU是一种通缩代币,每次生意会烧掉2%的生意额,导致用户真正存入Memestake的量比挂号的user.amount更小,取出时又是根据user.amount转给用户(详见代码剖析),导致Memestake池子中KEANU的代币持有量不停削减,最终为1e-07。如下图所示,涉及生意为0x00ed,生意截图未完全,请自行凭证生意查看。

  2. 第3步(赚钱),攻击者首先通过合约二挪用了Memestake.updatePool()函数,修改了KEANU所在池子的accMfundPerShare,由于该值依赖于池子所持有的KEANU的代币量,而这在第二步中 *** 作了(详细公式见下方代码剖析)。这使得合约二在接下来withdraw的时刻可以获得远超正常值的Mfund(约61M)这种token作为奖励。第3步发生于生意0xa945中,同时攻击者最先将部门获得的MFund换成WETH等代币。

  3. 第4步(收尾),攻击者将获得的MFund、KEANU等代币换成ETH,并通过Tornado.Cash转移走,至此攻击竣事,攻击者从中赚钱ETH 55.9484578158357个(攻击者的EOA地址及部署的攻击合约还残留有部门SANSHU和KEANU代币未计入),约10万美元。

下面附上攻击地址0x0333的生意截图,生意截图未完全,请凭证地址自行查看详情(详细地址及生意详见文章末尾)。

Others:

有趣的是,攻击的第2、3步都与flashbots生意有关。

其中第2步涉及的生意0x00ed由于接纳了UniswapV2 flashloan,且生意前后相当于用约38ETH去购置了KEANU,由此发生了很大的套利空间。因此该笔生意受到另一名攻击者的三明治攻击(sandwich attack),即本事宜的攻击者也是另一个三明治事宜的受害者。该三明治攻击者赚钱3.2769697165652474ETH,然则给了矿工2.405295771958891249ETH,净赚钱0.8716739446063562ETH。

而第3步攻击涉及的生意0xa945则由于在uniswap池子中大量售出MFund,缔造了套利空间,以是被back-running而成为flashbots生意。该searcher赚钱0.13858054192600666ETH,其中交给矿工0.099085087477094764ETH,净赚钱0.03949545444891189ETH。

由于UniswapV2中将flash loan的实现与通俗的Swap连系在一起,详细的实现原理及为什么由此导致第2步存在套利空间可以参阅我们的paper Towards A First Step to Understand Flash Loan and Its Applications in DeFi Ecosystem (SBC 2021). 链接https://www.blocksecteam.com/papers/ *** c21_flashloan.pdf

0x3. 总结及平安建议

Akropolis攻击事宜,2020-11-17的Origin Dollar事宜及2020-06-28的Balancer事宜等。稀奇是与通缩代币的交互,如在该事宜发生不久后,PeckShield也讲述了一起发生在polygon链上同样行使通缩代币及奖励盘算破绽的平安事宜——PolyYeld事宜。

2. 项目上线前,需要找有资质的平安公司举行平安审计。我们可以看到,由于defi的money lego属性,许多defi项目之间可以随意组合,从而发生了相互影响,而这正是defi领域平安事宜频发的缘故原由。因此,项目方所需关注的平安问题不仅仅局限于自己项目,也同样需要思量在与其他项目交互历程中存在的平安破绽。

0x4. 引用

攻击者EOA地址:

0x0333e323e61aa8afa38a1623604a165dcb9f4fec

攻击合约一:

0x67a54b340392e661af8f757ba03674ede40d9dc3

攻击合约二:

0xe30dc9b3c29534e9b4e9a166c2f44411163ad59f

攻击第2步生意0x00ed: 

0x00edd68087ee372a1b6e05249cc6c992bb7b8478cc0ddc70c2a1453428285808

攻击第3步生意0xa945:

0xa945b1857630e730bd3fac6459c82dee44da45e35cfbbd6dfb7b42146e8dde41

受害者Memestake地址:

0x35c674c288577df3e9b5dafef945795b741c7810

代币KEANU地址:

0x106552c11272420aad5d7e94f8acab9095a6c952

代币Mfund地址:

添加回复:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。