被空手套白狼,损失近2100万美元——跨链收益率

未知 2021-10-13 15:52:41

原标题: 《空手套白狼 ——Popsicle 被黑分析》

2021年08月04日,据徐雾区报道,链间收益率平台Popsicle Finance的Sorbetto Fragola产品被黑客入侵,徐雾安全团队率先介入分析,结果分享如下。

攻击的背景

在这次攻击中,攻击者通过制定三个攻击合同完成了对Sorbetto Fragola的攻击。 以下是与此次攻击相关的具体地址。

攻击者:

H1:0x3a 9d 90 ED 069021057 D 11e 78 f 142 F2 C 4267934 a

H2:0xf9e 3d 08196 f 76f 5078882 d 98941 b 71 c 0884 BEA 52

攻击合同:

C1:0 xdfb6Fab7F4 BC 9512 d 5620 e 679 e 90 D1 C 91 C4 Eade 6

C2:0x 576 CF5F8 BA 98 E 1643 A2C 93103881 D 8356 C 3550 CF

C3:0xd 282 f 740 BB 0F5 D9 E0 A 861 DF 024 FCBD 3C0BD0DC 8

至标志洛杉矶:

0x C4 FF 55 a 4329 f 84f9BF 0f 5619998 AB 570481 EBB 48

攻击对象

通过官方介绍,我们可以看到,被攻击的Sorbetto Fragola产品主要用于帮助管理Uniswap V3头寸,使得在Uniswap V3做市的用户不会超出选择的价格范围。 用户可以存入为Sorbetto Fragola提供流动性的两种令牌,Sorbetto Fragola给予用户Popsicle LP (PLP )的证书,用户使用该证书获取奖金,以取回抵押的流动性资金。 此外,该证书还可以自由转让给其他用户。

攻击的核心

此次攻击的核心是,在Sorbetto Fragola中,根据用户持有的PLP证书的数量,参与用户可以获得的激励机制的计算,PLP证书可以自由转移给其他用户,但在该证书的转移过程中会进行激励结算的转移等操作, 结果,拥有PLP证书就可以马上获得报酬。 最终,同一PLP证书在同一时间节点上造福于多个所有者。 接下来详细分析攻击的详细情况。

攻击详细信息

攻击首先用H1地址制作攻击合同C1、C2、C3,然后攻击者用H2地址调用攻击合同C1发起具体攻击,交易如下

0 xcd 7直连143 a 4c 0223349 c 16237 CE4CD 7696 b 1638 d 116 a 72755231 Ede 872 ab 70光纤通道。

分析一下这笔交易,首先从AAVE开始,用闪存贷30,000,000个USDT,13,000个WETH,1,400个WBTC,30,000,000个USDC,3,000,000个DT

之后,攻击者调用Sorbetto Fragola合同的deposit函数,存入提供流动性的两种令牌,首先用checkDeviation和updateVault修饰符检查价格和更新报酬。 价格核查主要针对价格是否波动较大而未被操作等,在此不展开。 由于激励机制的更新与此次攻击密切相关,我们将进入分析:

可以看到为了具体的更新操作调用了_updateFeesReward函数。 跟踪这个函数。

从上图可以很容易地看出,首先使用positionLiquidity函数获取tickLower和tickUpper范围内的合同所具有的流动性数量。 之后,通过_earnFees函数从Uniswap V3 Pool获得提供流动性的激励。 然后,用_tokenPerShare函数计算每个PLP证书划分的流动性奖金。 最后,使用_ Fe E0以太网和_ fee 1以太网函数计算和使用用户持有的PLP证书的数量可以获得多少报酬

记录user.token0Rewards和user.token1Rewards变量,如下图所示。

但是,此时攻击者刚刚进行了充值操作,还没有取得PLP证书,因此其user.token0Rewards和user.token1Rewards变量最终被记录下来自然是0。

到这里你可能注意到了一个问题,user.token0Rewards和user.token1Rewards变量记录的报酬是根据用户持有的PLP证书计算的,PLP证书是可以传输的,所以在持有PLP证书之后就可以使用这个变量答案当然是肯定的。 让我们看看deposit函数:

激励更新后,用liquidityForAmounts函数计算出用户在目标价位内提供的资金所占的流动性,调用Uniswap V3 Pool mint函数注入流动性。 然后,Sorbetto Fragola计算_calcShare需要为用户铸造的PLP证书的数量。

攻击者得到PLP证书后,也像我们想象的那样将PLP证书转移到其他地址,调用Sorbetto Fragola合同collectFees函数进行报酬记录。

由上图的PLP证书链上的传输记录可以看出,通过攻击合同C1获取PLP证书后,传输到攻击合同C2,调用了collectFees函数。 随后,攻击合同C2将PLP证书转移到攻击合同C3上,再次调用了collectFees。 最后攻击合同C3将PLP证书放回攻击合同C1。 切入到collectFees函数进行分析吧:

从上图可以很容易地看出,该函数也有updateVault修饰符。 的分析表明,updateVault修饰符将用于报酬更新。 因此,如果攻击合同C2有PLP证书,调用collectFees函数启动updateVault修饰符,则根据持有的PLP证书数量计算应分配的报酬,并记入用户的token0中,需要注意的是, 此时,此类PLP证书所有者缓存的tokenPerSharePaid变量为0,这意味着用户可以直接获得持有PLP证书的奖金。

从链条上的状态变化也可以看出:

之后,攻击合同C2也可以像法炮制一样得到奖励记录。

最后PLP证书返回攻击合同C1,调用Sorbetto Fragola合同的withdraw函数烧掉PLP证书以恢复之前保存的WETH和USDT的流动性。 然后,攻击合同C2、C3分别调用collectFees函数传递接受的激励数,接受激励。 这样,攻击者不仅可以恢复在同一区块存款的流动性,还可以获得多种流动性并提供报酬。

之后,攻击者开始利用其他标记,对法炮制的薅进行奖励,如下图所示。

攻击流程

1、攻击者制定多个攻击合同,利用电击贷款从AAVE出借大量令牌

2、攻击者使用借来的令牌存入Sorbetto Fragola合同取得PLP证书;

3、攻击者利用Sorbetto Fragola合同奖励结算的缺陷问题获得的PLP证书在所创建的攻击合同之间传输,分别调用Sorbetto Fragola合同的collectFees函数在各攻击合同中记录了奖励;

4、攻击者焚烧PLP证书以取回存入Sorbetto Fragola合同的流动性资金,通过各攻击合同调用Sorbetto Fragola合同的collectFees函数获得创纪录的奖金;

5、不断循环上述操作攻击各流动性资金池获取奖励

6、还完电击贷后获利走人。

最小跟踪分析过程

根据慢雾AML团队的分析统计,这次攻击损失了约4.98米USDT、2.56千瓦特、96 WBTC、5.39米USDC、159.93K DAI、10.49K UNI,达到近2100万美元。

资金流动的分析

根据对史密斯AML旗下MistTrack反洗钱跟踪系统的分析,攻击者H1地址首先从Tornado.Cash获取初始资金,然后引入三个攻击合同。

在攻击中获利后,将在Uniswap V3中获得的令牌换成ETH后再次转入Tornado.Cash :

目前,攻击者的账户余额仅为0.08 ETH,剩余资金通过Tornado.Cash转移。

总结

此次漏洞的核心是由于激励更新记录的缺陷,同一PLP证书在同一时间节点上造福于多个所有者。 针对这些漏洞,建议慢粒安全小组在进行凭证转移前处理奖励结算问题,并记录转移前后用户的奖励缓存,以防止此类问题再次发生。

参考攻击交易:

359以太网. io/tx/0 XCD 7直连143 a 4c 0223349 c 16237 CE4CD 7696 b 1638 d 116 a 72755231 EDE 872 ab 70 FC

标签