{"content":{"title":"零时科技 || DualPools 攻击分析","body":"![顶部banner2.jpg](https://img.learnblockchain.cn/attachments/2024/02/atEkP3Ft65d6fd97772bb.jpg)\r\n\r\n# 背景\r\n监测到针对DualPools的链上攻击事件：\r\n\r\nhttps://bscscan.com/tx/0x90f374ca33fbd5aaa0d01f5fcf5dee4c7af49a98dc56b47459d8b7ad52ef1e93\r\n\r\nDualPools (https://dualpools.com) 是基于VenusProtocol (https://venus.io/) 修改，是一个DeFi项目，提供了Swap, Lend, Borrow等服务。\r\n\r\n其运行模式如下图:\r\n\r\n![venus.png](https://img.learnblockchain.cn/attachments/2024/02/pIeygyYi65d6fdf835e65.png)\r\n\r\nDualPools是一个去中心化借贷平台，用户通过deposti存入underlyingAssets（标的资产），获得对应的dToken；反之，通过Redeem取出underlyingAssets时，销毁对应的dToken。\r\n\r\n其中，underlyingAssets标的资产和dToken的兑换比例是通过exchangeRate（流动性指数）来控制的，简单来讲exchangeRate就是dToken的价值。\r\n\r\nexchangeRate = (totalCash + totalBorrows - totalReserves) / totalSupply\r\n\r\n# 攻击分析\r\n\r\n简单来讲，攻击分为两部分：\r\n\r\n1. 黑客通过DualPools新交易池流动性不足(流动性为0)，大幅抬高dLINK的价格，通过borrow掏空其他交易池的标的资产(WBNB, BTCB,ETH, ADA, BUSD)。\r\n\r\n2. 利用精度截断的问题，取回前期投入的所有LINK。\r\n\r\n\r\n\r\n## 步骤1详细分析\r\n\r\n攻击者通过DODO Private Pool和PancakeSwapV3进行借贷，获取BNB和BUSD作为初始攻击资金，如下图：\r\n\r\n![1.png](https://img.learnblockchain.cn/attachments/2024/02/OB3gJWTH65d6fe54eb839.png)\r\n\r\n随后，通过VenusProtocol抵押BNB和BUSD，并借出11500 LINK来进行针对DualPools的攻击。\r\n\r\n\r\n![2.png](https://img.learnblockchain.cn/attachments/2024/02/NFagsKUc65d6fe6763c27.png)\r\n\r\n首先，攻击者通过再交易池dLINK-LINK mint获得2个最小单位的dLINK，随后，向交易池中转账11499999999999999999998个单位的LINK。\r\n\r\n\r\n![3.png](https://img.learnblockchain.cn/attachments/2024/02/5GgpgwtW65d6fe7cbc969.png)\r\n\r\n由于该交易池并未初始化，所以没有任何流动性。且exchangeRate的计算方式如下：\r\n\r\nexchangeRate = (totalCash + totalBorrows - totalReserves) / totalSupply\r\n\r\n此时totalCash为交易池中LINK的余额，为11499999999999999999998+2=11500000000000000000000，totalBorrows和totalReserves均为0，totalSupply为2（因为，黑客通过mint获得了2个最小单位的dLINK）。所以，此时的exchangeRate为5750000000000000000000（将dLINK的价值拉高了575倍）。\r\n由于攻击者拥有的2个dLINK，且价值足够高，所以，黑客从其他池子中通过borrow借走了50 BNB, 0.17 BTCB, 3.99 ETH, 6378 ADA, 911 BUSD。\r\n\r\n\r\n![4.png](https://img.learnblockchain.cn/attachments/2024/02/PnxAFTr265d6fe8d8123c.png)\r\n\r\n## 步骤2详细分析\r\n\r\n攻击者通过redeemUnderlying将之前mint的2个最小单位dLINK兑换为11499999999999999999898个单位的LINK。因为，exchangeRate被攻击者操纵为5750000000000000000000。所以，兑换11499999999999999999898个最小单位的LINK需要的dLINK为 11499999999999999999898 / 5750000000000000000000 = 1.999999999999999 \r\n即1.999999个最小单位的dLINK，但是由于数据精度截断，导致只需要1个最小单位的dLINK。\r\n\r\n\r\n![5.png](https://img.learnblockchain.cn/attachments/2024/02/FPPrJtwE65d6febb19e03.png)\r\n\r\n至此，攻击者取出了之前投入的 11499999999999999999898 个单位的LINK。随后，将从VenusProtocol, PancakeSwapV3, DODO Private Pool的借款归还，完成攻击。\r\n\r\n\r\n![6.png](https://img.learnblockchain.cn/attachments/2024/02/i5RYX54K65d6fed1cf849.png)\r\n\r\n# 总结\r\n\r\n攻击者利用DualPools新交易池流动性差的原因，操纵标的资产的exchangeRate，导致标的资产对应的dToken价格失真，从而可以以极小的dToken作为抵押借出大量的其他标的资产。随后，利用智能合约除法的截断问题，取回之前攻击时投入的资产。至此，完成对DeFi项目DualPools的攻击。"},"author":{"user":"https://learnblockchain.cn/people/52","address":null},"history":null,"timestamp":1708589002,"version":1}