1. 背景介绍
Memestake 合约:
Memestake合约是由Sanshu Inu发行的用作meme币的耕种池。用户需要在Memestake合约中存入相关代币,即可获得代币Mfund的奖励。
KEANU代币:
KEANU代币是由KeanuInu 合约发行的一种通缩型代币,也就意味着用户在每次交易转账时将会被扣除一定比例的代币用于销毁或再分配等其它用途,这就会导致接收方收到的token数量小于支付方实际支付的数量。
在本次应用场景中,用户可以将KEANU代币存入Memestake合约即可获得相应的代币Mfund奖励。
2. 相关地址
代币Mfund地址:
0xddaddd4f73abc3a6552de43aba325f506232fa8a
Memestake合约地址:
0x35c674c288577df3e9b5dafef945795b741c7810
代币KEANU地址:
0x106552c11272420aad5d7e94f8acab9095a6c952
攻击合约1:
0x67a54b340392e661af8f757ba03674ede40d9dc3
攻击合约2:
0xe30dc9b3c29534e9b4e9a166c2f44411163ad59f
第1步正常交易:
0x628174eccf05e94a3385f882805124b5d8718a0c9906c6cd0c573e5d6f56c9d2
第2步攻击交易0x00ed:
0x00edd68087ee372a1b6e05249cc6c992bb7b8478cc0ddc70c2a1453428285808
第3步攻击交易0xa945:
0xa945b1857630e730bd3fac6459c82dee44da45e35cfbbd6dfb7b42146e8dde41
3. 攻击概况
交易1:
https://phalcon.blocksec.com/tx/eth/0x628174eccf05e94a3385f882805124b5d8718a0c9906c6cd0c573e5d6f56c9d2
交易2:https://phalcon.blocksec.com/tx/eth/0x00edd68087ee372a1b6e05249cc6c992bb7b8478cc0ddc70c2a1453428285808
交易3:
https://phalcon.blocksec.com/tx/eth/0xa945b1857630e730bd3fac6459c82dee44da45e35cfbbd6dfb7b42146e8dde41
4. 获利分析
5. 攻击思路
- 若想获得代币Mfund奖励,那得先了解其计算公式(第1325行)
user.rewardDebt = user.amount.mul(pool.accMfundPerShare).div(1e18);
若想使得rewardDebt 变大,可以增加存入的代币数量amount,或者尝试增加pool.accMfundPerShare 的值。要想实现不当获利,需要利用合约漏洞增大后者的值。
- 再分析pool.accMfundPerShare 的值是如何生成的。在合约的updatePool中,合约根据以下公式生成存入的代币单位奖励:
pool.accMfundPerShare += mFundReward / token.balanceOf(MemeStake)
- 分析以上奖励公式不难看出,要想获得高额奖励,可以想办法减少合约所拥有的token数量。如果是传统的ERC20代币,那合约增加的代币数量就是用户存入的代币数量。但KeanuInu 是一种通缩型代币,每次转账都会有2%的损耗,且是接收方承担损失。查找合约中可以实现代币转账的函数,有withdraw、deposit,可以通过不断存款、取款实现代币的通缩。
- 注意,当用户存入amount数量的KEANU token时,MemeStake合约直接将用户的数量增加amount大小(user.amount = user.amount.add(_amount);),但实际上在KEANU合约中MemeStake的代币数量只是98% * amount 大小,这意味着用户转账给MemeStake合约时,MemeStake合约承担了2%的通缩损失。但同时用户提款时,虽然MemeStake合约转给用户为amount数量的KEANU token,但用户也需要承担2%的损失。
- 另外,MemeStake合约pool.accMfundPerShare的值是在updatePool函数中更新的,并且在一个区块中仅更新一次。
- 综上所述,攻击者需要尽可能在一个区块内将MemeStake合约中的KEANU token减少到极小值,才可使得获得的Mfund代币奖励极大,且Mfund代币奖励需要覆盖通缩的KEANU token代币。
6. 攻击过程&漏洞原因
根据以上攻击思路,从交易记录分析攻击过程:
- 攻击者先正常交易兑换出大量的KEANU 代币,以便在完成攻击后获取大量奖励
- 攻击者先从UNI-V2 获得闪电贷资金 2042280个KEANU代币,然后调用攻击者的回调函数uniswapV2Call,其中实现了攻击逻辑。需要注意,从3、4可以看出代币转移过程中MemeStake合约、攻击者都承担了通缩损失。
- 攻击者不断调用deposit、withdraw函数,最终将Memestake的KEANU数量减少到100单位,此时攻击者还剩下 1533893个KEANU代币
- 攻击者归还闪电贷,到下一个区块更新奖励代币Mfund
- 攻击者调用Memestake的updatePool函数,因为在第一笔交易中提前存入大量KEANU代币,所以现在可获得大量Mfund代币奖励
- 在各交易所兑换Mfund获利,离场
-
原创
- 学分: 5
- 分类: 安全
- 标签:
区块链安全