织梦CMS - 轻松建站从此开始!

我的网站

当前位置: 主页 > 竞争币 > 以太坊

解析跨链收益率提升平台 Popsicle Finance 遭攻击原因及过程

时间:2021-08-23 13:51来源:未知 作者:admin 点击:
北京时间 2021 年 8 月 4 日早上 6 点(区块 12955063),Popsicle Finance 项目下的多个机枪池被攻击,损失金额超过两千万美元,是迄今为止 DeFi 领域发生的损失数额最大的单笔攻击之一。通

北京时间 2021 年 8 月 4 日早上 6 点(区块 12955063),Popsicle Finance 项目下的多个机枪池被攻击,损失金额超过两千万美元,是迄今为止 DeFi 领域发生的损失数额最大的单笔攻击之一。通过分析 攻击交易 及项目代码我们发现,此次攻击是一个利用项目的记账漏洞进行多次提取的攻击(Double-Claiming Rewards)。下面我们通过代码和攻击流程分析此次攻击。

代码分析

Popsicle Finance 是一个涉及多个链的机枪池(Yield Optimization Platform)。

用户首先调用 deposit 函数向机枪池存入一定的流动性,并获得 Popsicle LP Token (以下简称 PLP Token)作为存款的份额证明。Popsicle Finance 会将用户提供的流动性存入 Uniswap 等底层池子并获得收益。

[虚拟印钞机] Popsicle Finance 双花攻击分析

用户还可以调用 withdraw 函数,根据用户持有的 PLP Token 所代表的流动性份额,从机枪池取回流动性。Popsicle Finance 会将 PLP Token 对应的流动性从 Uniswap 等底层池子中取回给用户。

[虚拟印钞机] Popsicle Finance 双花攻击分析

最后,用户在机枪池中存的流动性会随着时间产生一定的收益(Yield),会累计在合约的用户状态中。用户可以调用 collectFees 函数取回部分存款奖励。

[虚拟印钞机] Popsicle Finance 双花攻击分析

本次攻击的核心函数正是 collectFees 函数。下面我们逐步分析其代码。首先获得存储在 userInfo 中的用户状态。其中用户状态中的 token0Rewards 和 token1Rewards 是由于用户存款而累积的奖励。

接下来计算该合约中,对应机枪池的 Token 对的 Balance。如果在合约中有足够的 Balance,就按金额将 Reward 支付给用户;否则会调用 pool.burnExactLiquidity 从底层 pool 取回流动性返回给用户。

最后,会将记录在 userInfo 中的 Rewards 状态进行更新。看到这里,机枪池的代码实现还是比较符合逻辑的。但是在函数开头我们发现了 updateVault modifier,这个函数会在 collectFees 的函数体之前运行,漏洞也许在 updateVault 相关的函数中。

[虚拟印钞机] Popsicle Finance 双花攻击分析

以上是 updateVault 相关函数的实现。过程如下:

  1. 首先调用_earnFees 向底层 pool 获取积累的 Fee;
  2. 随后调用_tokenPerShare 更新 token0PerShareStored 和 token1PerShareStored 参数,这两个参数代表了池子中每个 share 代表的 token0 和 token1 的数量,即机枪池的每个份额计代表的 Token 对数量;
  3. 最后调用_fee0Earned 和_fee1Earned 更新对应到这个用户的存款 Rewards (即 user.token0Rewards 和 user.token1Rewards)。 (责任编辑:admin)
织梦二维码生成器
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
推荐内容