本文详细解析了 ERC4626 代币库的工作原理及其安全隐患,特别是通货膨胀攻击的机制及其对初始存款用户的影响,并讨论了若干缓解策略,如使用 ERC4626 路由器、内部资产跟踪以及创建“死牌”的方法,以提升安全性。文章最后提供了关于实施安全性和保护用户资产的建议。
ERC4626是ERC20的扩展,提供了一种统一的接口用于代币资产库,使开发者能够构建安全且可组合的解决方案。了解潜在的安全漏洞至关重要,例如可能影响ERC4626代币资产库的通货膨胀攻击。
ERC4626代币资产库通过发行股份以换取存入的资产而运作。股份与资产之间的汇率决定了每个股份的价值。在通货膨胀攻击中,攻击者操纵汇率以使自己受益,而以其他用户为代价。通过利用存款时股份的四舍五入,攻击者可以稀释其他用户存款的价值。
新的资产库面临着最大的通货膨胀攻击风险。让我们用一个例子来说明:假设一个用户作为第一个存款者打算存入100个代币。如果攻击者用1 wei进行抢跑交易,这个微不足道的存款仍然可以使攻击者获得100%池子的股份。
接下来,攻击者向资产库捐赠一个数量大于或等于100个代币。这个行动增加了池子的总余额,同时维持了流通中股份的数量。
在初始用户的100个代币存入池子时,由于捐赠代币余额的计算,用户的股份计算结果最终为零(在这个例子中,100/101四舍五入为0)。
最后,攻击者从池子中撤回他们的股份。由于他们是唯一拥有股份的人,这次撤回等于资产库的余额。这意味着攻击者也提取了初始用户存入的100个代币,有效地窃取了他们的存款。
OpenZeppelin的目标是提供一种实现ERC4626的方法,能够在不经修改的情况下抵御此类威胁。
考虑了几种缓解策略,每种策略都有其潜在的优点和缺点。
这是一种相对简单的方法,但它可能只是绕过问题,而不是直接解决它。
优点:
缺点:
第二种策略旨在通过在内部跟踪资产的持有量来消除直接转移的影响。这意味着捐赠的代币不被计算在内,从而有效地消除了通货膨胀攻击的风险。
优点:
缺点:
这个策略受到Uniswap V2的启发,当首次存入流动性时,创建了死LP股份。在ERC4626资产库中,可以通过在首次存款/铸造时铸造死股份来实现类似的方法。
优点:
缺点:
为了构建有效缓解ERC-4626通货膨胀攻击风险的解决方案,我们检查了整个生态系统中现有的策略。
Morpho DAO通过在初始化时向资产库存入资产来缓解通货膨胀攻击。相应的股份铸造给资产库本身,该地址作为非操作地址。这个策略类似于死股份的创建,但损失由项目承受。最初存入的资产越多,进行通货膨胀攻击就越困难。然而,初始存款必须有足够的资金,因为这些资金实际上是丧失了的。
尽管这种方式的实施过程相对简单,但资产库的地址需要提前计算,并且必须在部署前获得批准。
YieldBox通过向资产库添加“虚拟”数量的股份和资产来计算汇率。这种方法模仿了死股份的创建行为,但不需要销毁任何代币来铸造它们。虽然它修正了早期存款者的缺点,但资产库从直接转移或重新基准中收到的任何代币的一部分将会损失。
通过将资产偏移设置为1和供应偏移设置为1e8,建立了股份的内部固定点表示。这使得股份能够表示为小至0.00000001 wei的数量,如果有损耗,实际上不会对真实用户造成影响,因为虚拟资产的数量非常小。
在OpenZeppelin合约中实施时,我们设计了一种解决方案,利用了虚拟偏移和小数偏移。这可以防止创建死股份的缺点,即不得不放弃一些基础资产。
小数偏移允许直接调整攻击的盈利能力,方法是增加表示股票的小数位数,超过基础代币的数量。
虚拟偏移限制了攻击者有效操控汇率的能力,通过在汇率计算中同时包括虚拟股份和虚拟资产。当资产库为空时,虚拟资产强制了转换率。
由于虚拟资产引起的余额偏移,结合小数偏移的精度提高,在计算股份数量时减少了四舍五入误差。攻击失去了盈利能力,因为虚拟资产和股份捕获了部分捐赠。
即使没有小数偏移,虚拟股份和资产的存在使得该攻击失去了利润。偏移越大,攻击者在攻击中损失的越多,因此来自通货膨胀攻击的安全性越高。
我们实施了ERC-4626,以优先考虑安全性,帮助开发者专注于构建。通过利用OpenZeppelin合约的功能,并实施推荐的防御机制,开发者可以强化他们的应用程序,保护用户资产。
如果你希望与OpenZeppelin进行安全审计或需要进一步指导来保护你的ERC4626资产库,请与我们联系。
参考资料:
- 原文链接: blog.openzeppelin.com/a-...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!