{"content":{"title":"crvUSD审计结果总结","body":"作者：Konstantin Nekrasov， MixBytes的安全研究员\r\n\r\n![](https://img.learnblockchain.cn/2025/03/09/48.jpg)\r\n\r\n## 免责声明\r\n\r\n本文中描述的所有发现是在审计过程中检测到的，并在项目部署前由Curve团队修复。你可以在这里检查审计结果：[https://github.com/mixbytes/audits\\_public/blob/master/Curve Finance/Curve Stablecoin (crvUSD)/README.md](https://github.com/mixbytes/audits_public/blob/master/Curve%20Finance/Curve%20Stablecoin%20(crvUSD)/README.md)。\r\n\r\n## 引言\r\n\r\n我们对crvUSD进行了审计，它是Curve的一种过度抵押的稳定币。我们的审计重点是AMM和Controller合约，在这里[我们发现了两个关键漏洞](https://github.com/mixbytes/audits_public/blob/master/Curve%20Finance/Curve%20Stablecoin%20(crvUSD)/README.md#21-critical)，这些漏洞在审计期间得到了修复。在本文中，我们将讨论这些漏洞、如何识别类似漏洞以及各自的解决方案。\r\n\r\n## 发现1：任意调用\r\n\r\nCrvUSD有一个Controller合约，允许用户存入抵押品并接收crvUSD。Controller具有普通用户无法访问的特权功能。\r\n\r\nController合约有一个名为liquidate\\_extended()的函数，它接受一个任意的回调：\r\n\r\n```ruby\r\ndef liquidate_extended(\r\n    user: address, min_x: uint256, frac: uint256, use_eth: bool,\r\n    callbacker: address,\r\n    callback_sig: bytes32,\r\n    callback_args: DynArray[uint256,5]\r\n)\r\n```\r\n\r\n这个回调是以Controller合约的名义执行的，攻击者可以指定调用的地址、签名和参数。\r\n\r\n问题在于，回调期望一个64字节的响应，因此无法使用标准的ERC20.approve()作为回调。此外，这64字节被读入到两个uint256中，并与特定值进行检查。不过，仍然可以将特权函数AMM.withdraw(address,uint256)作为回调调用，使攻击者可以在未授权的情况下从AMM中提取资金：\r\n\r\n```python\r\ndef withdraw(user: address, frac: uint256) -> uint256[2]:\r\n    @notice 提取用户的所有流动性。只有管理合约可以执行此操作\r\n```\r\n\r\n因此，攻击者可以从crvUSD AMM中抽取所有流动性。Curve团队通过[禁止使用任意回调](https://github.com/curvefi/curve-stablecoin/blob/c5169a7eb687a9878b989696a5c813dfc737e377/contracts/Controller.vy#L161-L163)来修复此漏洞。\r\n\r\n## 发现2：捐赠攻击\r\n\r\n在crvUSD中，可以在不同价格范围内传播债务，这些范围由ticks表示。用户存入特定tick时，会收到该tick的份额。\r\n\r\n看起来每个tick都容易受到捐赠攻击。这种攻击在[我们的博客](https://learnblockchain.cn/article/12419)中有详细介绍。实质上，攻击者可以在不同的价格范围内窃取用户的资金。\r\n\r\n我们如何能够在不铸造份额的情况下向特定tick捐款？首先，AMM.exchange()函数允许活动tick的移动和crvUSD与抵押品之间的交易。任何交易都会从交易者那里收取费用，并将其留在传递的ticks中。这个费用就成了捐赠。然而，这仅仅是交易金额的几分之一，无法进行大规模攻击。为了克服这一限制，攻击者必须[组合withdraw()、deposit()和repay()函数的调用](https://github.com/mixbytes/audits_public/blob/master/Curve%20Finance/Curve%20Stablecoin%20(crvUSD)/README.md#2-inflation-attack-on-empty-ticks)，以便对自己执行相同的通货膨胀攻击。这使得ticks中的捐赠增加了1.5倍。\r\n\r\n最终，攻击者可以发起一个在智能合约中运行120次循环的单个交易，将捐款膨胀至100\\_000e18的值。这使他们可以从其他用户那里窃取任意金额。\r\n\r\nCurve团队通过引入[虚拟股份](https://github.com/curvefi/curve-stablecoin/blob/c5169a7eb687a9878b989696a5c813dfc737e377/contracts/AMM.vy#L716)，正如OpenZeppelin所建议的那样，解决了这个问题。\r\n\r\n## 总体结论\r\n\r\n始终关注项目中的回调和股份。对于股份 - 检查捐赠攻击，对于回调 - 验证其任意性水平。\r\n\r\n问题是，有时候攻击者看似在利用时受到限制，这使人觉得没有漏洞。然而，有经验的审计员往往可以绕过明显的限制并证明可利用性。因此，进行外部审计并保持知识渊博的专家参与至关重要。\r\n\r\n- MixBytes是什么？\r\n\r\n[MixBytes](https://mixbytes.io/)是一支专业的区块链审计员和安全研究员团队，专注于为EVM兼容和Substrate基础的项目提供全面的智能合约审计和技术咨询服务。请在[X](https://twitter.com/MixBytes)上加入我们，以获取最新的行业趋势和见解。\r\n\r\n>- 原文链接： [mixbytes.io/blog/recap-o...](https://mixbytes.io/blog/recap-of-the-crvusd-audit-findings)\r\n>- 登链社区 AI 助手，为大家转译优秀英文文章，如有翻译不通的地方，还请包涵～"},"author":{"user":"https://learnblockchain.cn/people/24680","address":null},"history":null,"timestamp":1741514542,"version":1}