DEUS Finance 漏洞分析 (第一次被黑2022-03-15)

  • Archime
  • 更新于 2022-11-06 11:22
  • 阅读 3684

DEUS Finance 漏洞分析 (第一次被黑2022-03-15)

1. 相关地址

• 攻击者钱包地址 https://ftmscan.com/address/0x1ed5112b32486840071b7cdd2584ded2c66198dd • 攻击合约地址 https://ftmscan.com/address/0xb8f5c9e18abbb21dfa4329586ee74f1e2b685009 • 攻击交易 https://ftmscan.com/tx/0xe374495036fac18aa5b1a497a17e70f256c4d3d416dd1408c026f3f5c70a3a9c • Oracle合约 https://ftmscan.com/address/0x5CEB2b0308a7f21CcC0915DB29fa5095bEAdb48D#code • DeiLenderSolidex 合约地址 https://ftmscan.com/address/0xec1fc57249cea005fc16b2980470504806fca20d

2. 代币关系

  1. DEI、USDC组成交易池StableV1 AMM - USDC/DEI;
  2. 当流动性提供者存入USDC/DEI代币时将获得流动性提供凭证sAMM-USDC/DEI代币 ,用户可凭此取出USDC/DEI;
  3. 因为sAMM-USDC/DEI代币是有价值的,因此可以存入Solidex Finance: LP Depositor(0x26E1A0d851CF28E697870e1b7F053B605C8b060F)获得存款凭证Solidex sAMM-USDC/DEI Deposit代币;
  4. 用户还可以使用Solidex sAMM-USDC/DEI Deposit代币存入DeiLenderSolidex贷款DEI代币;

3. 攻击过程&漏洞原因

从交易记录分析攻击过程,因为各交易分析工具均不支持解析Fantom交易,只能从代币转移过程以及交易日志记录分析其利用过程。

  1. 从以下两张图可以分析出调用了代币DEI合约的函数(大概率是transfer),将代币从合约Spirit LPs 0x8efd36转移至攻击合约,应该是通过swap函数获得闪电贷,共9,739,342个DEI代币。此处贷款DEI代币是为了之后清算借贷时偿还DEI代币以及减少池子中DEI数量而引发清算。

1.png

2.png

  1. 攻击合约再从0x582157 StableV1 AMM - USDC/DEI合约处通过闪电贷获取24,772,798 个代币。之所以认为是闪电贷,因为攻击合约并未转移其它代币给StableV1 AMM - USDC/DEI合约,而最终是攻击者获利后偿还贷款。

4.png

  1. 从代币转移过程可以看到大量用户的账号被清算,流动性代币sex-sAMM-USDC/DEI 被转移至攻击者合约。攻击者获得流动性代币后可作为凭证兑换出相应的代币(此处指USI、DEI)。

5.png 之所以可确认是进行清算步骤,是因为日志信息中显示合约0xec1fc5的RemoveCollateral 、Repay 两个函数同时被调用,在其函数liquidate中正好有这两个日志记录。

6.png

7.png 在liquidate函数中是通过isSolvent函数判断借贷人的资产是否需要被清算,而在isSolvent函数中是通过预言机获取资产价值是否大于贷款价值。

8.png

预言机的地址为0x5CEB2b0308a7f21CcC0915DB29fa5095bEAdb48D,查看其公式为: ((dei.balanceOf(address(pair)) + (usdc.balanceOf(address(pair)) 1e12)) 1e18) / pair.totalSupply(); 其中pair地址为0x5821573d8f04947952e76d94f3abc6d7b43bf8d0 ,正好是之前闪电贷获取DEI的地址。池子是参考uniswap协议实现的,其中totalsupply指的是提供的总流动性凭证,只要用户不提取或注入资金,totalsupply的大小应保持不变。以上公式的意义是指存款人的pair凭证提取资金时可以兑换的DEI、USDC的数量。

9.png 通常情况下用户往池中存入代币后,预言机给出的价格是保持不变的。但是池子是可以提供闪电贷的,只要大量借出DEI或USDC,而totalsupply没有变化(因为此时并未有人存款或取款),最终导致通过预言机获取的价格变小,错误认为借款人资不抵债而被清算。

  1. 攻击合约通过偿还DEI而获取Solidex sAMM-USDC/DEI Deposit代币以及相应奖励后,偿还闪电贷24,797,595 个DEI

10.png

  1. 攻击合约将5.23个Solidex sAMM-USDC/DEI Deposit代币兑换成5.23个StableV1 AMM - USDC/DEI代币。

11.png

  1. 攻击合约再将5.23个StableV1 AMM - USDC/DEI代币(即存款凭证)转给流动池提取出USDC、DEI代币

12.png

13.png

  1. 攻击者再通过池子兑换出5,170,594个DEI,归还闪电贷,离场

14.png

15.png

点赞 0
收藏 1
分享

0 条评论

请先 登录 后评论
Archime
Archime
0x96C4...508C
江湖只有他的大名,没有他的介绍。