DeFi 中的 ERC-4626 代币:汇率操纵风险

本文深入探讨了在DeFi协议中集成ERC-4626代币时存在的风险,特别是通过捐赠方式操纵汇率导致的通货膨胀攻击。文章分析了包括Venus协议事件在内的真实案例,阐述了这些风险。并通过介绍相关资产价格预言机(CAPO)和快速响应终止开关等防御措施,为协议提供安全集成策略,以降低操纵风险并提高DeFi生态系统的安全性和稳定性。

目录

介绍

随着 ERC-4626 标准的出现,自 2022 年年中以来,其日益增长的应用对 DeFi 协议中代币化 vault 的使用产生了积极影响。然而,其独特的特性和汇率功能为那些没有充分准备好处理能够有机增长的代币的协议带来了内在风险。

本文解释了将 ERC-4626 代币集成到各种协议中涉及的风险,并展示了它们内置的功能(本身不是漏洞)如果管理不当,仍然会导致关键漏洞。

什么是生息 Vault?

在深入研究 ERC-4626 之前,必须了解生息 vault 的工作原理。

生息 vault 是智能合约,旨在优化和最大化已存入代币的回报。这些 vault 具有基础资产,例如 USDT,用户可以存入这些资产以开始赚取收益。

产生的收益来自跨各种 DeFi 协议执行的多种策略,包括借贷、流动性提供、质押和套利。

每个 vault 的盈利策略取决于其特定的智能合约实现。通常,生息 vault 会根据盈利能力对不同的协议进行排名,将部分池化资产分配给最赚钱的协议,同时保留提款准备金。

将资产存入 vault 的用户会收到份额(share)——代表他们按比例拥有 vault 的代币。这些份额稍后可以兑换为初始存款 + 任何已赚取的回报。

image3-3

生息 vault 的简化表示如下所示:

  1. 用户存入资产 → 收到相应的份额
  2. Vault 将资产分配给产生收益的策略
  3. 收益累积,增加 vault 的总资产
  4. 用户赎回份额 → 收到初始存款 + 相应的收益

ERC-4626 标准

ERC-4626 是 ERC-20 标准的扩展,引入该标准是为了标准化代币化 vault 的创建,例如,可以使用它来创建上面解释的生息 vault。但是,它的效用不仅限于生息 vault,它还支持其他代币结构,例如流动性质押代币 (LST) 或 rebasing 代币,以便于与其他 DeFi 协议集成。该标准建立了一个通用接口,促进了存款和取款的一致方法,并附带累积的利息或收益。

但是,必须强调的是,ERC-4626 vault 本身不执行收益策略。它们的功能仅侧重于管理存款和赎回,允许用户以相同数量的份额检索更多的代币,因为 vault 的基础资产余额会增加。

ERC-4626 的工作原理

创建 ERC-4626 vault 时,开发人员必须定义一个基础资产代币地址(例如,USDT)。然后,用户将此资产存入 ERC-4626 vault 合约,并收到份额作为回报。收到的份额数量代表用户在 vault 中的比例权益。

随着 vault 积累更多资产(无论是来自 yield farming、投资还是捐赠),份额也会按比例升值。用户赎回他们的份额以接收他们的原始代币以及他们在 vault 积累的任何额外收益中所占的份额。

image12

理解份额背后的数学原理

在 ERC-4626 中,用于存入资产 (deposit/mint) 和赎回资产 (withdraw/redeem) 的函数使用内部转换函数 (convertToShares 和 convertToAssets)。这些函数处理基础资产和份额之间的转换,确保准确的比例分配。

尽管乍一看可能很复杂,但资产和份额之间的兑换计算相对简单,类似于基本三的规则

image7

  • 当用户存入资产时,vault 的 totalAssets 和 totalSupply(流通股)都会按比例增加。
  • 只有当 vault 的 totalAssets 独立于 totalSupply 增加时,用户才能获利。如果 vault 通过 yield farming、投资或直接资产捐赠产生额外资产,就会发生这种情况。

换句话说,用户从份额中获得的盈利能力与 vault 总资产的有机增长严格相关,而不是来自其他用户的后续存款。

注意:在转换计算中,_decimalsOffset() 函数用于确定虚拟份额费率,作为一种安全措施,以减轻 vault 通胀攻击的影响和盈利能力。有关此特定攻击类型的更多详细信息,请参阅我们的博客文章:针对 ERC-4626 通胀攻击的新型防御

汇率操纵

由于 ERC-4626 vault 的固有功能,集成这些代币的协议通常使用 vault 的内部汇率(每股资产)作为代币定价的参考。

例如,考虑一个集成代币化 vault(例如 wUSDM(ERC-4626 代币))的协议。为了以美元定价 wUSDM,该协议:

  1. 调用 vault 合约上的 convertToAssets 函数,以确定一股(wUSDM)当前代表多少基础资产(USDM)
  2. 利用可靠的 USDM/USD 价格 feed 将此金额转换为最终的 USD 价格

但是,依赖内部汇率会使协议面临一种特定形式的价格操纵,称为“直接捐赠攻击”。在这种情况下,恶意行为者通过直接捐赠资产来增加 vaulttotalAssets。这与典型的存款从根本上不同,因为在此直接捐赠过程中不会创建新的份额。

因此,虽然常规存款会按比例增加 totalAssetstotalSupply(份额数量),从而保持份额的价值,但直接捐赠仅增加 totalAssets。这导致每个现有份额所代表的价值立即增加,从而给未为这种快速且不可预测的价格波动做好准备的协议带来重大风险。

借贷协议的风险

在借贷协议的上下文中,当汇率直接从 vault 合约确定,并且 ERC-4626 代币用作基础资产(可用于借贷的资产)时,通过捐赠攻击进行的通胀会带来两个主要风险:

  • 意外清算:代币估值的大幅增加可能会突然提高用户的贷款价值比 (LTV),从而可能导致借款人未预料到的清算。
  • 不良债务的累积:如果资产捐赠导致的价格上涨足以将用户的 LTV 比率推高至 100% 以上,则该协议将产生不良债务。

实际利用场景

考虑一个使用 wUSDM 作为其基础资产的借贷协议,并观察以下场景:

  • 攻击者存入正好 4,000,000 美元的抵押品。
  • 然后,攻击者借入正好 3,200,000 美元价值的 wUSDM,建立 80% 的 LTV 比率。

image4-1

接下来,利用 vault 相对较低的流动性:

  • 攻击者将正好 320,000 美元的 USDM 直接捐赠到 wUSDM vault 中。

由于流动性低,这种适度的捐赠会显着提高每股资产价值,从而将 wUSDM 的价格提高正好 50%。

image11

结果是:

  • 在通胀之前,攻击者最初借入的金额(3,200,000 美元)减去捐赠额(320,000 美元)的有效价值变为 2,880,000 美元。
  • 捐赠后的通胀将此金额提高 1.5 倍,达到正好 4,320,000 美元。
  • 这种操纵使攻击者立即获利 320,000 美元,将其有效 LTV 从 80% 提高到 108%,从而导致该协议产生不良债务。

这清楚地说明了如果借贷协议未能充分处理 ERC-4626 代币通胀风险,它们会如何遭受不良债务的困扰。

依赖 AMM TWAP 协议的风险

先前描述的与操纵 ERC-4626 代币估值相关的问题在使用来自自动化做市商 (AMM) 的时间加权平均价格 (TWAP) 预言机的协议中尤为突出。通常,TWAP 预言机通过在较长时间内平均代币价格来帮助防止突然的价格操纵。

但是,ERC-4626 代币从根本上是不同的。当攻击者增加 ERC-4626 vault 的总资产数量时,这种增加是永久性的。这种永久性意味着通常会通过纠正标准 ERC-20 资产的代币价格来恢复平衡的套利者无法纠正 ERC-4626 代币价格通胀。相反,攻击者自己会立即捕获套利,从而将 AMM 价格锁定为与 vault 的通胀价格对齐。

这导致 TWAP 在其平均周期(通常为 30 分钟)内不可避免地逐渐增加。预计这种可预测的价格上涨的攻击者可以利用最初记录较低代币估值的依赖 AMM TWAP 预言机的协议。

由于这种价格通胀是有机且不可逆转地发生的,因此用户采取的额外铸造或赎回等常见的市场纠正措施不起作用。因此,停止攻击需要不切实际的措施,例如:

  • 用户完全提取他们的资产(在实践中极不可能)
  • 协议管理员迅速暂停市场(如果需要 governance 投票则具有挑战性)
  • 手动重置价格,这种干预在去中心化环境中通常是不切实际的

因此,将 ERC-4626 代币与 AMM TWAP 预言机集成的协议必须认识到这种任意操纵的独特风险。

最近的 Venus 漏洞利用

从历史上看,已经发生过多次涉及 ERC-4626 代币价格操纵的关键漏洞利用,最著名的是 2021 年针对 CREAM Finance 的攻击。最近,在 2025 年 2 月,Venus 协议在 zkSync 网络上遭受了类似的攻击,导致攻击者获利约 86 WETH,同时给协议留下了大量不良债务。可以在此处找到攻击者的交易。

以下几个因素促成了此次漏洞利用:

  • zkSync 上 wUSDM 的 vault 流动性较低。
  • 使用 wUSDM(ERC-4626 代币)作为可借贷的基础资产。
  • 缺乏针对激进价格操纵的保护措施。

为了清楚地说明此漏洞利用是如何展开的,我们将把它分解为四个关键阶段。

第一阶段:杠杆

最初,攻击者通过 AAVE 的闪电贷借入了 2100 WETH,随后将这些代币存入 Venus 协议以增强借款能力。

image10

攻击者利用两个单独的帐户(帐户 A 和帐户 B)执行了多次借入和重新存入 wUSDM 的循环:

  • 帐户 A 从 Venus 池中借入 466,000 wUSDM,并将这些代币转账到帐户 B。
  • 帐户 B 将借入的 wUSDM 重新存入(供应)Venus,人为地夸大了帐户 B 的记录供应余额。

image16

通过重复进行这些借入和重新存入循环,帐户 A 达到了其最大借款限额(抵押系数),而帐户 B 则积累了相当大的供应记录。

第二阶段:通胀

在最终的杠杆循环中,帐户 B 铸造了 303,000 wUSDM,将 107,000 wUSDM 转回帐户 A,保留了 55,000 wUSDM。

然后,帐户 A 又借入了 303,000 wUSDM,总计 411,000 wUSDM,并将这些兑换为 439,000 USDM。

由于 vault 流动性低,这些 USDM 代币被直接捐赠给 vault,使 wUSDM 价格上涨了约 1.7 倍。

image14

第三阶段:清算

在通胀之后,帐户 A 的贷款严重低于抵押,允许帐户 B 发起清算:

  • 帐户 B 使用其 55,000 wUSDM 余额反复清算帐户 A,将 wUSDM 兑换为 WETH。
  • 帐户 B 从协议上记录的通胀存款中不断补充其 wUSDM 余额,重复此过程,直到帐户 A 的债务被完全清算。

第四阶段:最终借款

在清算结束时,帐户 B 取回了约 1498 WETH,并且由于存款价值膨胀,仍然保持着额外的借款能力。这允许帐户 B 从协议中再借入 162 WETH。所有 WETH 随后都被转移回帐户 A。

结果

最终,攻击者获得了约 2186 WETH(清算获得 1498 WETH,初始抵押品中未使用 526 WETH,清算后借出 162 WETH),导致 Venus 协议获利约 86 WETH,并造成大量不良债务。

安全集成策略

为了有效缓解上述风险,与 ERC-4626 代币集成的协议必须实施强大的安全措施。这些措施可能包括采用相关资产价格预言机 (CAPO) 来防止快速和过度的价格上涨,以及快速反应熔断机制,以迅速解决严重的波动和操纵尝试。

相关资产价格预言机 (CAPO)

CAPO 通过限制资产的汇率在指定的时间范围内可以增加的速度来帮助防止突然和激进的资产价格上涨。CAPO 设置了预定义的约束,包括:

  • 快照时间戳:标记汇率参考点的初始时间戳。
  • 快照比率:资产的初始记录汇率。
  • 最大年度比率增长百分比:资产汇率允许的最大年度增长百分比。

CAPO 逻辑很简单:

  1. 获取资产价格:检索当前资产汇率。
  2. 与最大比率比较:根据快照比率和允许的增长动态计算最大允许比率。
  3. 返回调整后的价格:
    • 如果当前汇率超过最大比率,则返回上限比率。
    • 否则,返回实际的当前汇率。

此策略可确保通过捐赠或其他激进的通胀策略进行的价格操纵得到有效控制。

快速反应熔断机制

熔断机制功能类似于 AAVE 采用的机制,提供了一种快速反应的安全措施,以应对极端的市场波动或操纵。与可能缓慢且效率低下的手动或基于 governance 的紧急措施不同,当检测到严重异常时,熔断机制可以立即暂停市场活动,从而显着降低灾难性结果的风险。

可以通过以下方式实施此快速反应机制:

  • 自动智能合约逻辑,当价格严重偏离预期的市场价格时,停止借贷活动。
  • 管理控制,使协议维护者能够迅速应对操纵尝试或异常的市场事件,从而提高协议的弹性。

结论

本文探讨了将 ERC-4626 代币集成到 DeFi 协议中相关的固有风险,强调了与通过基于捐赠的通胀进行汇率操纵相关的关键漏洞。分析了现实世界的案例,包括最近涉及 Venus 协议的事件,以清楚地说明这些风险。还讨论了战略防御措施,例如实施相关资产价格预言机 (CAPO) 和快速反应熔断机制。通过主动实施强大的保护措施,协议可以显着降低其面临的操纵风险,并为所有参与者创建一个更安全和更稳定的 DeFi 生态系统。

  • 原文链接: blog.openzeppelin.com/er...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
OpenZeppelin
OpenZeppelin
江湖只有他的大名,没有他的介绍。