针对操纵价格的漏洞,可以采用链下的价格预言机,这样可以避免价格被操纵。

作者:SharkTeam

2024 年 6 月 10 日,UwU Lend 遭受攻击,项目方损失约 1930 万美元。

SharkTeam 对此事件第一时间进行了技术分析,并总结了安全防范手段,希望后续项目可以引以为戒,共筑区块链行业的安全防线。

一、攻击交易分析

攻击者:0x841dDf093f5188989fA1524e7B893de64B421f47

攻击者共发起了 3 笔攻击交易:

攻击交易 1:

0x242a0fb4fde9de0dc2fd42e8db743cbc197ffa2bf6a036ba0bba303df296408b

攻击交易 2:

0xb3f067618ce54bc26a960b660cfc28f9ea0315e2e9a1a855ede1508eb4017376

攻击交易 3:

0xca1bbf3b320662c89232006f1ec6624b56242850f07e0f1dadbe4f69ba0d6ac3

以攻击交易 1 为例,进行分析:

攻击合约:0x21c58d8f816578b1193aef4683e8c64405a4312e

目标合约:UwU Lend 金库合约,包括:

uSUSDE:0xf1293141fc6ab23b2a0143acc196e3429e0b67a6

uDAI:0xb95bd0793bcc5524af358ffaae3e38c3903c7626

uUSDT:0x24959f75d7bda1884f1ec9861f644821ce233c7d

攻击过程如下:

1.  从不同平台闪电贷多种代币,包括 WETH, WBTC, sUSDe, USDe, DAI, FRAX, USDC, GHO

代币接收地址为 0x4fea76b66db8b548842349dc01c85278da3925da

闪电贷的代币和数量如下:

从 AaveV3 中闪电贷 159,053.16 WETH 和 14,800 WBTC

从 AaveV2 中闪电贷 40,000 WETH

从 Spark 中闪电贷 91,075.70 WETH 和 4,979.79 WBTC

从 Morpho 中闪电贷 301,738,880.01 sUSDe,236,934,023.17 USDe 和 100,786,052.15 DAI

从 Uniswap V3: FRAX-USDC 中闪电贷 60,000,000 FRAX 和 15,000,000 USDC

从 Balancer 中闪电贷 4,627,557.47 GHO 和 38,413.34 WETH

从 Maker 中闪电贷 500,000,000 DAI

共计约 328,542.2 WETH,19779.79 WBTC,600786052.15 DAI,301,738,880.01 sUSDe,236,934,023.17 USDe,4,627,557.47 GHO,60,000,000 FRAX,15,000,000 USDC

2. 将闪电贷的 Token 转移到合约 0xf19d66e82ffe8e203b30df9e81359f8a201517ad(简记为 0xf19d)中,为发起攻击做准备。

3. 通过兑换 (exchange) 代币,控制 sUSDe 的价格(降低价格)

(1)USDecrvUSD.exchange

将 8,676,504.84 USDe 兑换成 8,730,453.49 crvUSD,USDecrvUSD 中 USDe 数量增加,价格降低,crvUSD 数量减少,价格提高

(2)USDeDAI.exchange

将 46,452,158.05 USDe 兑换成 14,389,460.59 DAI,USDeDAI 中 USDe 数量增加,价格降低,DAI 数量减少,价格提高

(3)FRAXUSDe.exchange

将 14,477,791.69 USDe 兑换成 46,309,490.86 FRAX,USDeDAI 中 USDe 数量增加,价格降低,FRAX 数量减少,价格提高

(4)GHOUSDe.exchange

将 4,925,427.20 USDe 兑换成 4,825,479.07 GHO,USDeDAI 中 USDe 数量增加,价格降低,GHO 数量减少,价格提高

(5)USDeUSDC.exchange

将 14,886,912.83 USDe 兑换成 14,711,447.94 USDC,USDeDAI 中 USDe 数量增加,价格降低,USDC 数量减少,价格提高

以上 exchange 后,5 个资金池中的 USDe 价格降低。最终导致 sUSDe 价格大跌。

4. 不断创建借贷头寸,即向 LendingPool 合约中存入其他资产 (WETH,WBTC 和 DAI),然后借贷 sUSDe。因为 sUSDe 价格大跌,因此,借出的 sUSDe 数量比价格大跌前要多很多。

5. 与第 3 步类似,反向操作将 sUSDe 的价格拉高。

由于 sUSDe 被拉高,第 4 步借贷的头寸价值超过抵押价值,达到了清算的标准。

6. 批量地对借贷头寸进行清算,获得清算奖励 uWETH

7. 偿还贷款,提取标的资产 WETH, WBTC,DAI 和 sUSDe。

8. 将 sUSDe 再次存入到 LendingPool 中,此时 sUSDe 价格被拉高,因此可以借贷出较多其他资产,包括 DAI 和 USDT。

9. 兑换代币,偿还闪电贷。最终获利 1,946.89 ETH

二、漏洞分析

通过以上分析,发现整个攻击过程存在大量的闪电贷以及多次操纵 sUSDe 的价格,当抵押 sUSDe 时,会影响借出资产的数量;当借出 sUSDe 时,会影响借贷率,进而影响清算系数(健康因子)。

攻击者利用这一点,通过闪电贷砸低 sUSDe 的价格,抵押其他资产,借出大量的 sUSDe,然后再抬高 sUSDe 的价格,清算抵押资产而获利,并将剩余的 sUSDe 抵押借出其他资产,最后偿还闪电贷,攻击完成。

从上面第 3 步发现,攻击者通过控制 Curve Finance 的 USDe/rvUSD, USDe/AI, FRAX/SDe, GHO/SDe 和 USDe/SDC 这 5 个交易池中的 USDe 的价格来操纵 sUSDe 的价格的。价格读取函数如下:

其中,sUSDe 价格由 11 个价格计算得到的,其中前 10 个由 CurveFinance 中读取,最后一个又 UniswapV3 提供。

从 CurveFinance 中读取的价格则是由 USDe/rvUSD, USDe/AI, FRAX/SDe, GHO/SDe 和 USD/SDC 这 5 个交易池提供,也是攻击者在攻击交易中操纵的 5 个交易池。

返回的价格由 uwuOracle 读取的 price,CurveFinance 交易池合约中的 price_oracle(0) 和 get_p(0) 计算得到的。

(1)price 是有 Chainlink 提供的价格,是不可以操纵的;

(2)交易池参数

攻击者通过操纵交易池的代币数量来操纵 get_p(0) 的返回值,进而实现操纵价格。

三、安全建议

针对本次攻击事件,开发过程中应遵循以下注意事项:

(1)针对操纵价格的漏洞,可以采用链下的价格预言机,这样可以避免价格被操纵。

(2)项目上线前,需要由第三方专业的审计公司进行智能合约审计。

免责声明:作为区块链信息平台,本站所发布文章仅代表作者及嘉宾个人观点,与 Web3Caff 立场无关。文章内的信息仅供参考,均不构成任何投资建议及要约,并请您遵守所在国家或地区的相关法律法规。