类别:区块链 / 日期:2021-10-28 / 浏览:1182

原文题目:《DeFi 平台 Cream Finance 再遭攻击,1.3 亿美金被盗》

2021 年 10 月 27 日,Cream Finance 再次遭受攻击,丧失约 1.3 亿美金,慢雾平安团队第一时间介入阐发,并将简要阐发分享如下。

攻击核心

本次攻击的核心在于操纵 Cream 借贷池对抵押物价格获取的缺陷,歹意操控拉高了其抵押物的价格,使得攻击者能够从 Cream 借贷池借出更多的代币

攻击细节

起首攻击者从 DssFlash 中闪电贷借出 5 亿个 DAI,随后将借出的 5 亿个 DAI 抵押至 yearn 的 yDAI 池中,以获得约 4.5 亿个 yDAI 凭证。 

Cream 被盗 1.3 亿美金始末:操纵借贷池缺陷,歹意操控价格  借贷 代币 攻击 价格 第1张

随后攻击者将获得的 yDAI 代币在 Curve 的 yDAI/yUSDC/yUSDT/yTUSD 池子中停止单币活动性添加,以获得响应的活动性凭证。紧接着攻击者就将获得的凭证抵押到 yvWBTC 池子中以获得 yUSD 凭证,为后续在 Cream crYUSD 借贷池中抵押做筹办。 

Cream 被盗 1.3 亿美金始末:操纵借贷池缺陷,歹意操控价格  借贷 代币 攻击 价格 第2张

之后攻击者起头向 Cream 的 crYUSD 借贷池中抵押其获得 yUSD 凭证,为了扩大其抵押规模,攻击者从 AAVE 闪电贷借出约 52.4 万个 WETH,并将其抵押到 Cream 的 crETH 池子中。 

Cream 被盗 1.3 亿美金始末:操纵借贷池缺陷,歹意操控价格  借贷 代币 攻击 价格 第3张

攻击者通过在 crETH 池子中抵押大量 ETH,来使得其有足够的借贷才能将 crYUSD 池子中的 yUSD 全数借出并反复抵押到 crYUSD 池子中,随后通过在 crYUSD 池子中停止轮回贷以杠杆的形式扩大了自己在 crYUSD 池子中 yUSD 的抵押规模,为后续操控价格获利做筹办。

Cream 被盗 1.3 亿美金始末:操纵借贷池缺陷,歹意操控价格  借贷 代币 攻击 价格 第4张

随后为了获得 yDAI/yUSDC/yUSDT/yTUSD 4Pool 凭证以操控价格,攻击者用约 1,873 个 ETH 从 Uniswap V3 中兑换出约 745 万个 USDC,并通过 Curve 3Pool 将其兑换成 DUSD 代币约 338 万 个。

Cream 被盗 1.3 亿美金始末:操纵借贷池缺陷,歹意操控价格  借贷 代币 攻击 价格 第5张

接下来攻击者通过获得的 DUSD 代币从 YVaultPeak 中赎回

yDAI/yUSDC/yUSDT/yTUSD 4Pool 凭证,并操纵此凭证从 yUSD(yvWBTC) 池子中取回 yDAI/yUSDC/yUSDT/yTUSD 代币。 

Cream 被盗 1.3 亿美金始末:操纵借贷池缺陷,歹意操控价格  借贷 代币 攻击 价格 第6张

随后攻击者起头停止此次攻击的关键操做,其将约 843 万个 yDAI/yUSDC/yUSDT/yTUSD 代币间接转回 yUSD 池子中,因为其不是通过一般抵押操做停止抵押的,所以那 843 万个 yDAI/yUSDC/yUSDT/yTUSD 代币并没有被零丁记账,而是间接分离给了 yDAI/yUSDC/yUSDT/yTUSD 凭证的持有者,那相当于间接拉高了其 share 的价格。 

Cream 被盗 1.3 亿美金始末:操纵借贷池缺陷,歹意操控价格  借贷 代币 攻击 价格 第7张

在 crToken 中因为其抵押物价格被歹意拉高了,因而攻击者抵押的大量 yUSD 能够使其借出更多的资金,最初攻击者将 Cream 的其他 15 个池子全数借空。接下来我们跟进 Cream 的 crToken 借贷池中详细借贷逻辑。 

从 cToken 合约中我们能够看到,次要借贷查抄在 borrowAllowed 函数中:

Cream 被盗 1.3 亿美金始末:操纵借贷池缺陷,歹意操控价格  借贷 代币 攻击 价格 第8张

我们跟进 borrowAllowed 函数,能够看到在 427 行,其会按照 

getHypotheticalAccountLiquidityInternal 函数查抄实时形态下的该账户所对应的所有 cToken 的资产价值总和和借贷的资产价值总和,并通过比照 cToken 的资产价值和借贷的 Token 价值和,来判断用户能否还能够继续借贷。

Cream 被盗 1.3 亿美金始末:操纵借贷池缺陷,歹意操控价格  借贷 代币 攻击 价格 第9张

我们跟进 

getHypotheticalAccountLiquidityInternal 函数,能够发现关于抵押物的价值获取来自 886 行的 oracle.getUnderlyingPrice。

Cream 被盗 1.3 亿美金始末:操纵借贷池缺陷,歹意操控价格  借贷 代币 攻击 价格 第10张

我们跟进预言机的 getUnderlyingPrice 函数,能够容易的发现其将通过代币 150 行的 getYvTokenPrice 函数停止价格获取。

Cream 被盗 1.3 亿美金始末:操纵借贷池缺陷,歹意操控价格  借贷 代币 攻击 价格 第11张

继续跟进 getYvTokenPrice 函数,因为 yvTokenInfo.version 为 V2,因而将通过 yVault 的 pricePerShare 函数停止价格获取。

Cream 被盗 1.3 亿美金始末:操纵借贷池缺陷,歹意操控价格  借贷 代币 攻击 价格 第12张

Cream 被盗 1.3 亿美金始末:操纵借贷池缺陷,歹意操控价格  借贷 代币 攻击 价格 第13张

Cream 被盗 1.3 亿美金始末:操纵借贷池缺陷,歹意操控价格  借贷 代币 攻击 价格 第14张

跟进 pricePerShare 能够发现其间接返回了 _shareValue 做为价格,而 _shareValue 是通过 _totalAssets 除合约的总 share 数量(self.totalSupply) 来计算单个 share 的价格的。因而攻击者只需要操控 _totalAssets 将其拉高就能够进步单个 share 的价格从而使得攻击者的抵押物价值变高以借出更多的其他代币。

Cream 被盗 1.3 亿美金始末:操纵借贷池缺陷,歹意操控价格  借贷 代币 攻击 价格 第15张

Cream 被盗 1.3 亿美金始末:操纵借贷池缺陷,歹意操控价格  借贷 代币 攻击 价格 第16张

我们能够查看下 _totalAssets 是若何获取的,从 772 行我们能够很明晰的看到,_totalAssets 是间接取的当前合约的 yDAI/yUSDC/yUSDT/yTUSD 代币数量,以及抵押在战略池中的资产数额相加获得的。因而攻击者通过间接往 yUSD 合约直达入 yDAI/yUSDC/yUSDT/yTUSD 代币就能够拉高 share 价格从而完成获利。 

Cream 被盗 1.3 亿美金始末:操纵借贷池缺陷,歹意操控价格  借贷 代币 攻击 价格 第17张

通过 Ethtx.info 能够明晰的看到 pricePerShare 前后变革:

Cream 被盗 1.3 亿美金始末:操纵借贷池缺陷,歹意操控价格  借贷 代币 攻击 价格 第18张

最初攻击者在借空其他池子后偿还了闪电贷获利离场。

总结

本次攻击是典型的操纵闪电贷停止价格操控,因为 Cream 的借贷池在获取 yUSD 池子 share 价格时间接利用了其 pricePerShare 接口,而此接口是通过合约的抵押物余额与战略池抵押资产数额相加除总 share 数来计算单个 share 的价格的。因而用户间接往 yUSD 转入抵押物就能够很容易的拉高单个 share 价格,最末使得 Cream 借贷池中抵押物能够借出更多的资金。

 可能感兴趣的文章

最近发表