AutoShark Finance被套利分析
事件总结与影响
- 此次事件“攻击者”通过闪电贷借出大量BNB再利用SHARK合约逻辑漏洞操纵BNB-SHARK池来获得大量SHARK,最后把获得的SHARK兑换成BNB获利
- 用户质押的SHARK数量没有损失
- 因为生成了大量的SHARK然后将其抛售导致SHARK价格下跌,官方给的数据是从1.2跌倒0.01,目前的价格如下图:
事件信息
AutoShark官方提供:AutoShark如何被经济利用
当前项目正在审计中,由WatchPug公司
事件分析
这里直接复用慢雾安全团队的分析步骤,我会结合token的流转和源码和具体的合约地址等再进一步解释。
为了方便分析,我给涉及到的地址打上了对应的功能标签:
address对应的tag | 解释 |
---|---|
AS-Exploiter | AutoShark-Exploiter的地址 |
Pancake-WBNB-BUSD-LP | Pancake的WBNB-BUSD流动池,是本次事件的入口,在这个LP闪电贷的BNB |
AS-Exploiter-Contract | AutoShark-Exploiter创建的合约地址 |
Panther-SHARK-BNB-LP | Panther的SHARK-BNB流动池 |
攻击步骤如下:
1. 攻击者从 Pancake 的 WBNB/BUSD 交易对中借出大量 WBNB;
对应的交易中的token转移如下:
此处是通过调用Pancake-WBNB-BUSD-LP合约的swap
方法来实现的,具体代码如下:
1 |
|
本地事件的第一步就是调用swap,入参如下:
1 | Function: swap(uint256 amount0Out, uint256 amount1Out, address to, bytes data) *** |
前面的三个参数是在描述“兑换100000个BNB和0个BUSD给AS-Exploiter-Contract”,然后因为data
参数不为空,所以会调用AS-Exploiter-Contract合于的pancakeCall
方法。
2. 将第 1 步借出的全部 WBNB 中的一半通过 Panther 的 SHARK/WBNB 交易对兑换出大量的 SHARK,同时池中 WBNB 的数量增多;
对应的交易中的token转移如下:
此处是一个兑换动作,调用合约的话其实有多种方式实现,下面是一种实现方式,调用PantherPair.sol
的swapExactTokensForTokens
方法。
1 | function swapExactTokensForTokens( |
3. 将第 1 步和第 2 步的 WBNB 和 SHARK 打入到 SharkMinter 中,为后续攻击做准备;
4. 调用 AutoShark 项目中的 WBNB/SHARK 策略池中的 getReward 函数,该函数会根据用户获利的资金从中抽出一部分手续费,作为贡献值给用户奖励 SHARK 代币,这部分操作在 SharkMinter 合约中进行操作;
5. SharkMinter 合约在收到用户收益的 LP 手续费之后,会将 LP 重新拆成对应的 WBNB 和 SHARK,重新加入到 Panther 的 WBNB/SHARK 交易池中;
6. 由于第 3 步攻击者已经事先将对应的代币打入到 SharkMinter 合约中,SharkMinter 合约在移除流动性后再添加流动性的时候,使用的是 SharkMinter 合约本身的 WBNB 和 SHARK 余额进行添加,这部分余额包含攻击者在第 3 步打入 SharkMinter 的余额,导致最后合约获取的添加流动性的余额是错误的,也就是说 SharkMinter 合约误以为攻击者打入了巨量的手续费到合约中;
7. SharkMinter 合约在获取到手续费的数量后,会通过 tvlInWBNB 函数计算这部分手续费的价值,然后根据手续费的价值铸币 SHARK 代币给用户。但是在计算 LP 价值的时候,使用的是 Panther WBNB/SHARK 池的 WBNB 实时数量除以 LP 总量来计算 LP 能兑换多少 WBNB。但是由于在第 2 步中,Panther 池中 WBNB 的数量已经非常多,导致计算出来的 LP 的价值非常高;
对应的SharkMinter
方法:
1 |
|
合约StrategyHelperV1
的tvlInBNB
方法:
1 |
|
8. 在 LP 价值错误和手续费获取数量错误的情况下,SharkMinter 合约最后在计算攻击者的贡献的时候计算出了一个非常大的值,导致 SharkMinter 合约给攻击者铸出了大量的 SHARK 代币;
对应的交易中的token转移如下:图中从0地址到SharkMinter就是在铸造大量的SHARK。
9. 攻击者后续通过卖出 SHARK 代币来换出 WBNB,偿还闪电贷。然后获利离开。
对应的交易中的token转移如下:
此步骤的操作逻辑比较简单,主要是调用Panther-SHARK-BNB-LP合约的swapTokensForExactTokens
方法;然后再把WBNB转给Pancake 的 WBNB/BUSD 交易对(调用WBNB的transfer
方法)来偿还闪电贷。
事件处理结果
AutoShark官方给的补偿计划:
- 使用新的代币$JAW代替原来的$SHARK
- 以被攻击前一个区块作为快照将$JAW分配给此时的$SHARK持有人
- 在180天里将所有金库的盈利的30%给$JAW的持有者
- 之前每铸造100个$SHARK,然后再额外铸造15个$SHARK给研发人员;接下来的60天里每铸造100个$JAW将其中的15个$JAW给$JAW的持有者。
- 将在PantherSwap平台发起IPO所得的部分BNB分配给$JAW持有者(金额没说)
- 将自己平台持有的所有$SHARK全部销毁
- 集成ChainLink的资产报价