{"content":{"title":"Memestake 漏洞分析","body":"# 1. 背景介绍\r\nMemestake 合约：\r\nMemestake合约是由Sanshu Inu发行的用作meme币的耕种池。用户需要在Memestake合约中存入相关代币，即可获得代币Mfund的奖励。\r\n\r\nKEANU代币：\r\nKEANU代币是由KeanuInu 合约发行的一种通缩型代币，也就意味着用户在每次交易转账时将会被扣除一定比例的代币用于销毁或再分配等其它用途，这就会导致接收方收到的token数量小于支付方实际支付的数量。\r\n在本次应用场景中，用户可以将KEANU代币存入Memestake合约即可获得相应的代币Mfund奖励。\r\n\r\n# 2.\t相关地址\r\n代币Mfund地址：\r\n0xddaddd4f73abc3a6552de43aba325f506232fa8a\r\nMemestake合约地址：\r\n0x35c674c288577df3e9b5dafef945795b741c7810\r\n代币KEANU地址：\r\n0x106552c11272420aad5d7e94f8acab9095a6c952\r\n\r\n攻击合约1：\r\n0x67a54b340392e661af8f757ba03674ede40d9dc3\r\n攻击合约2：\r\n0xe30dc9b3c29534e9b4e9a166c2f44411163ad59f\r\n\r\n第1步正常交易：\r\n0x628174eccf05e94a3385f882805124b5d8718a0c9906c6cd0c573e5d6f56c9d2\r\n第2步攻击交易0x00ed: \r\n0x00edd68087ee372a1b6e05249cc6c992bb7b8478cc0ddc70c2a1453428285808\r\n第3步攻击交易0xa945:\r\n0xa945b1857630e730bd3fac6459c82dee44da45e35cfbbd6dfb7b42146e8dde41\r\n\r\n# 3.\t攻击概况\r\n交易1：\r\nhttps://phalcon.blocksec.com/tx/eth/0x628174eccf05e94a3385f882805124b5d8718a0c9906c6cd0c573e5d6f56c9d2\r\n\r\n![1.png](https://img.learnblockchain.cn/attachments/2022/11/RgNGmM076363d9fb25ee2.png)\r\n交易2：https://phalcon.blocksec.com/tx/eth/0x00edd68087ee372a1b6e05249cc6c992bb7b8478cc0ddc70c2a1453428285808\r\n\r\n![2.png](https://img.learnblockchain.cn/attachments/2022/11/R9Rx2JEC6363da0e82da2.png)\r\n交易3：\r\nhttps://phalcon.blocksec.com/tx/eth/0xa945b1857630e730bd3fac6459c82dee44da45e35cfbbd6dfb7b42146e8dde41\r\n\r\n![3.png](https://img.learnblockchain.cn/attachments/2022/11/zkEOXcuS6363da810a230.png)\r\n\r\n\r\n# 4.\t获利分析\r\n\r\n![4.png](https://img.learnblockchain.cn/attachments/2022/11/pKizlX0t6363daa4310ff.png)\r\n# 5.\t攻击思路\r\n1.\t若想获得代币Mfund奖励，那得先了解其计算公式（第1325行）\r\nuser.rewardDebt = user.amount.mul(pool.accMfundPerShare).div(1e18);\r\n\t若想使得rewardDebt 变大，可以增加存入的代币数量amount，或者尝试增加pool.accMfundPerShare 的值。要想实现不当获利，需要利用合约漏洞增大后者的值。\r\n2.\t再分析pool.accMfundPerShare 的值是如何生成的。在合约的updatePool中，合约根据以下公式生成存入的代币单位奖励：\r\npool.accMfundPerShare += mFundReward / token.balanceOf(MemeStake)\r\n\r\n![5.png](https://img.learnblockchain.cn/attachments/2022/11/POe6NiDf6363dbc92552e.png)\r\n3.\t分析以上奖励公式不难看出，要想获得高额奖励，可以想办法减少合约所拥有的token数量。如果是传统的ERC20代币，那合约增加的代币数量就是用户存入的代币数量。但KeanuInu 是一种通缩型代币，每次转账都会有2%的损耗，且是接收方承担损失。查找合约中可以实现代币转账的函数，有withdraw、deposit，可以通过不断存款、取款实现代币的通缩。\r\n\r\n![6.png](https://img.learnblockchain.cn/attachments/2022/11/SzjHCorV6363dbe856679.png)\r\n\r\n![7.png](https://img.learnblockchain.cn/attachments/2022/11/qis7G7DP6363dbf8169f0.png)\r\n4.\t注意，当用户存入amount数量的KEANU token时，MemeStake合约直接将用户的数量增加amount大小（user.amount = user.amount.add(_amount);），但实际上在KEANU合约中MemeStake的代币数量只是98% * amount 大小，这意味着用户转账给MemeStake合约时，MemeStake合约承担了2%的通缩损失。但同时用户提款时，虽然MemeStake合约转给用户为amount数量的KEANU token，但用户也需要承担2%的损失。\r\n5.\t另外，MemeStake合约pool.accMfundPerShare的值是在updatePool函数中更新的，并且在一个区块中仅更新一次。\r\n\r\n![8.png](https://img.learnblockchain.cn/attachments/2022/11/RebEX1J46363dc29afda6.png)\r\n6.\t综上所述，攻击者需要尽可能在一个区块内将MemeStake合约中的KEANU token减少到极小值，才可使得获得的Mfund代币奖励极大，且Mfund代币奖励需要覆盖通缩的KEANU token代币。\r\n\r\n\r\n# 6.\t攻击过程&漏洞原因\r\n根据以上攻击思路，从交易记录分析攻击过程：\r\n1.\t攻击者先正常交易兑换出大量的KEANU 代币，以便在完成攻击后获取大量奖励\r\n\r\n![9.png](https://img.learnblockchain.cn/attachments/2022/11/Y4jFDccT6363dc689c9ff.png)\r\n2.\t攻击者先从UNI-V2 获得闪电贷资金 2042280个KEANU代币，然后调用攻击者的回调函数uniswapV2Call，其中实现了攻击逻辑。需要注意，从3、4可以看出代币转移过程中MemeStake合约、攻击者都承担了通缩损失。\r\n\r\n![10.png](https://img.learnblockchain.cn/attachments/2022/11/ny5LVOrv6363dc8f56cad.png)\r\n3.\t攻击者不断调用deposit、withdraw函数，最终将Memestake的KEANU数量减少到100单位，此时攻击者还剩下 1533893个KEANU代币\r\n\r\n![11.png](https://img.learnblockchain.cn/attachments/2022/11/sFpqRKlN6363dccadf8c1.png)\r\n\r\n![12.png](https://img.learnblockchain.cn/attachments/2022/11/HMou2Dg76363dcd52ff0c.png)\r\n4.\t攻击者归还闪电贷，到下一个区块更新奖励代币Mfund\r\n\r\n![13.png](https://img.learnblockchain.cn/attachments/2022/11/OcYFnEQB6363dcfbe820e.png)\r\n5.\t攻击者调用Memestake的updatePool函数，因为在第一笔交易中提前存入大量KEANU代币，所以现在可获得大量Mfund代币奖励\r\n\r\n![14.png](https://img.learnblockchain.cn/attachments/2022/11/6MT24Q6p6363dd0f98a81.png)\r\n6.\t在各交易所兑换Mfund获利，离场\r\n\r\n![15.png](https://img.learnblockchain.cn/attachments/2022/11/Dm94uPV36363dd3507b34.png)"},"author":{"user":"https://learnblockchain.cn/people/10579","address":null},"history":null,"timestamp":1667489305,"version":1}