Memestake通缩模型闪电贷攻击分析
创宇区块链安全实验室
2021-07-23 03:31
本文约1189字,阅读全文需要约5分钟
Memestake 项目遭受闪电贷攻击,损失高达 10 余万美金。

事件背景

北京时间 7 月 20 日,有消息称 Sanshu 项目方旗下的 Memestake 项目遭受闪电贷攻击,损失高达 10 余万美金。知道创宇区块链安全实验室 对此事件展开复盘分析。

事件跟踪

攻击时间:
2021-07-20 19:23:20
攻击者地址:
0x0333E323E61aa8aFA38A1623604A165dCB9F4fEC
攻击交易哈希:
a):https://etherscan.io/tx/0x628174eccf05e94a3385f882805124b5d8718a0c9906c6cd0c573e5d6f56c9d2

b):https://etherscan.io/tx/0x00edd68087ee372a1b6e05249cc6c992bb7b8478cc0ddc70c2a1453428285808

c):https://etherscan.io/tx/0xa945b1857630e730bd3fac6459c82dee44da45e35cfbbd6dfb7b42146e8dde41

事件分析

如上图所示,攻击者按照攻击交易 a->b->c 流程发起攻击并获得收益离场,攻击复盘如下:

1. 如 a 交易所示,攻击者先从 uniswap 中用 weth 兑换 2091514065454 个 KEANU 代币并抵押到 Memestake 合约 (0x35C674C288577Df3e9b5dafEF945795b741c7810) 中。
2. 如 b 交易所示,攻击者再利用闪电贷借取 KEANU 代币,并不断调用 Memestake 合约的 deposit 和 withdraw 函数用以消耗 Memestake 合约的 KEANU 代币,而这里就是漏洞的利用点:KEANU 代币为通缩模型代币,即每笔交易会扣除 2% 的代币用于给其他持币用户分红。

但是 Memestake 中 deposit 和 withdraw 函数记录的都是转账发起者所支付的值,即用户抵押 100 个 KEANU 代币,实际到账合约的只有 98 个 KEANU 代币,但是提取的时候还是归还给用户 100 个 KEANU 代币,所以随着攻击者不停的抵押提取,合约的 KEANU 代币余额就越来越小。

当合约的 KEANU 代币余额变少时,影响了单位 KEANU 代币可兑换的 MFUND 代币数量 (accMfundPerShare 变量),即攻击者可以获得第一步抵押 KEANU 代币抵押所产生的巨额奖励 MFUND 代币。

3. 如 c 交易所示,攻击者调用 withdraw 函数取出第一步抵押产生的 MFUND 代币,并归还第二步闪电贷借用的 KEANU 代币,并将巨额的 MFUND 代币再 swap 成 WETH 和 SANSHU 代币套利离场。

事件总结

本次闪电贷的攻击主要利用的还是通缩模型代币与传统挖矿合约逻辑不匹配导致的结果,项目方没有充分考虑到通缩模型带来的代币分红损失,导致了挖矿合约的代币余额越来越少,最终酿成了超额铸造了奖励代币 MFUND 的错误。


创宇区块链安全实验室
作者文库