{"author":{"address":"0xbD0b3505cc45d97DdB3e7FAa75ED0Fc41c61A354","user":"https://learnblockchain.cn/people/52"},"content":{"body":"![登链封面(事件).jpg](https://img.learnblockchain.cn/attachments/2025/01/9XydTqT1678610e72a6ee.jpg)\r\n\r\n\u003c!--StartFragment--\u003e\r\n\r\n# **背景介绍**\r\n\r\n2025年1月12日，我们监测到一笔 Ethereum 链上的异常交易：\r\n\r\n**https\\://etherscan.io/tx/0x44037ffc0993327176975e08789b71c1058318f48ddeff25890a577d6555b6ba**\r\n\r\n经分析，我们发现是一次针对 **Unilend** 的攻击事件，事件共造成约 197k USD 的损失。\r\n\r\n\u003c!--EndFragment--\u003e\r\n\r\n\u003c!--StartFragment--\u003e\r\n\r\n# **攻击及事件分析**\r\n\r\n首先，攻击者通过 Morpho Blue 利用 flashloan 借了 60,000,000 USDC，\r\n\u003c!--EndFragment--\u003e\r\n\r\n![1.png](https://img.learnblockchain.cn/attachments/2025/01/HxQddzDA67861128440e5.png)\r\n\r\n\u003c!--StartFragment--\u003e\r\n\r\n随后，攻击者又通过 Morpho Blue 利用 flashloan 借了 5.75 wstETH 。\r\n\r\n\u003c!--EndFragment--\u003e\r\n\r\n![2.png](https://img.learnblockchain.cn/attachments/2025/01/TT8R8tgh678611321e12a.png)\r\n\u003c!--StartFragment--\u003e\r\n\r\n接着，又利用 unwrap 将贷来的 5.75 wstETH 兑换为了 6.85 stETH ， \r\n\r\n\u003c!--EndFragment--\u003e\r\n\r\n![3.png](https://img.learnblockchain.cn/attachments/2025/01/UbMmbBhE6786113acab57.png)\r\n\r\n\u003c!--StartFragment--\u003e\r\n\r\n然后，攻击者利用 lend 向 UniPool 中存入了 60,000,000 USDC 和 6.85 stETH 。\r\n\r\n\u003c!--EndFragment--\u003e\r\n\r\n![4.png](https://img.learnblockchain.cn/attachments/2025/01/2gIAv3P76786114993c96.png)\r\n\r\n\u003c!--StartFragment--\u003e\r\n\r\n由于，攻击者已经存入足量的抵押物，所以接下来，攻击者利用 borrow 从 UniPool 中成功借走了 60.67 stETH 。\r\n\r\n\u003c!--EndFragment--\u003e\r\n\r\n![5.png](https://img.learnblockchain.cn/attachments/2025/01/QmsOpMG76786115275c34.png)\r\n\u003c!--StartFragment--\u003e\r\n\r\n然后，攻击者又利用 redeemUnderlying 分别从 UniPool 中兑换了 60,000,000 USDC ， 5.75wstETH 。至此，攻击完成。 \r\n\r\n\u003c!--EndFragment--\u003e\r\n\r\n\r\n![6.png](https://img.learnblockchain.cn/attachments/2025/01/uPrxeeNn6786115e0cf99.png)\r\n\r\n\u003c!--StartFragment--\u003e\r\n\r\n漏洞就出现在 redeemUnderlying 中，理论上来讲，攻击者存入的抵押物已经在 borrow 时占用了一部分，所以在 redeemUnderlying 存入时的金额时应该失败，但是攻击者却成功执行了。那么，我们看一下 redeemUnderlying 的具体实现。 \r\n\r\n\u003c!--EndFragment--\u003e\r\n\r\n![7.png](https://img.learnblockchain.cn/attachments/2025/01/jIrey2jy678611665fd33.png)\r\n\r\n\u003c!--StartFragment--\u003e\r\n\r\n从代码逻辑中，我们可以看到当 amount\u003c0 时，兑换的是 token0 ，当 amount\u003e0 时，兑换的是 token1 。兑换逻辑为。先计算出可以兑换的数量 tok_amount ，销毁对应的 LP Position ，检查 health factor ，转给用户完成兑换。\r\n\r\n\r\n具体的漏洞出现在 checkHealthFactorLtv0 和 checkHealthFactorLtv1 中， check healthfactor 的算法为 抵押物数量 x 抵押物价格 / (借出价格 x 借出数量) \u003e 1 ，但由于计算用户collateral amount 和 borrow amount 时测低配，导致此时同样也可以通过 health factor 的检查（理论上不能通过）。我们可以看到计算 collateral amount 和 borrow amount 的代码如下：\r\n\r\n\u003c!--EndFragment--\u003e\r\n\r\n![8.png](https://img.learnblockchain.cn/attachments/2025/01/YA6CPs0l6786117539f8b.png)\r\n\r\n\u003c!--StartFragment--\u003e\r\n\r\n当用户有 collateral 时，合约会计算此次 redeem 后，抵押物的价值是否还是比已经借出的价值大。但是，在计算 redeem 后抵押物的价值时， tokenBalance0 并没有减去本次 redeem 需要减去的数量，又因为在 \\_burnLPposition 时 share 已经减去本次 redeem 后减少的 share 。所以导致\\_lendBalance0 也就是抵押物的数量要高于攻击者实际拥有的抵押物的数量。\r\n\r\n\r\n攻击者最后再还清从 Morpho Blue 通过 flashloan 获取的 60,000,000 USDC ， 5.75 wstETH 后，获利 60.67 stETH ，价值 197k USD 。\r\n\r\n\u003c!--EndFragment--\u003e\r\n\r\n\u003c!--StartFragment--\u003e\r\n\r\n# **总结**\r\n\r\n本次漏洞的成因是 Unilend 在进行 redeem 时，在计算抵押物的数量时没有减去 redeem 应该转出的数量，导致错误的计算后抵押物的数量要高于攻击者实际拥有的抵押物的数量，本不应该成功的兑换成功完成。最终导致攻击者掏空了项目方的 stETH 代币。建议项目方在设计经济模型和代码运行逻辑时要多方验证，合约上线前审计时尽量选择多个审计公司交叉审计。\r\n\r\n\u003c!--EndFragment--\u003e","title":"零时科技 || Unilend 攻击事件分析"},"history":null,"timestamp":1736839642,"version":1}