ERC-4626金库汇率操纵风险
本文解释了将ERC-4626代币集成到各种协议中的风险,并展示了其内置功能——虽然本身不是漏洞——如果管理不当仍可能导致关键的漏洞利用。

一键发币: Aptos | X Layer | SUI | SOL | BNB | ETH | BASE | ARB | OP | Polygon | Avalanche | 用AI学区块链开发
随着ERC-4626标准的出现,自2022年中旬以来其采用率的增加对DeFi协议中代币化金库的使用产生了积极影响。然而,其独特的特性和汇率功能为那些没有充分准备处理具有有机通胀能力的代币的协议带来了固有的风险。
本文解释了将ERC-4626代币集成到各种协议中的风险,并展示了其内置功能——虽然本身不是漏洞——如果管理不当仍可能导致关键的漏洞利用。
1、什么是收益承载金库?
在深入探讨ERC-4626之前,了解收益承载金库的工作原理是至关重要的。
收益承载金库是设计用于优化和最大化存入代币收益的智能合约。这些金库有一个底层资产,例如USDT,用户可以存入以开始赚取收益。
产生的收益来自在各种DeFi协议中执行的多种策略,包括借贷、借款、流动性提供、质押和套利。
每个金库的利润策略取决于其特定的智能合约实现。通常,收益承载金库会根据其盈利能力对不同的协议进行排名,将部分池化资产分配给最有利可图的协议,同时保持储备以供提款。
存入资产到金库的用户会收到份额——代表其对金库的按比例所有权的代币。这些份额以后可以赎回以获得初始存款加上任何已获得的回报。

一个简化的收益承载金库表示如下:
- 用户存入资产 → 收到按比例的份额
- 金库将资产分配给产生收益的策略
- 收益累积,增加金库的总资产
- 用户赎回份额 → 收到初始存款 + 按比例的收益
2、ERC-4626标准
ERC-4626是ERC-20标准的扩展,旨在标准化创建代币化金库,例如上面所述的收益承载金库。然而,它的用途不仅限于收益承载金库,还支持其他代币结构,如流动性质押代币(LST)或重新调整代币,以便与其他DeFi协议集成。该标准建立了通用接口,促进一致的存款和取款方法,以及累加的利息或收益。
然而,必须强调的是,ERC-4626金库本身并不执行收益策略。它们的功能仅专注于管理存款和赎回,允许用户以相同的份额数量提取更多代币,因为金库的底层资产余额增加。
3.1 ERC-4626如何工作
创建ERC-4626金库时,开发人员必须定义一个底层资产代币地址(例如USDT)。然后,用户将此资产存入ERC-4626金库合约,以换取份额。收到的份额数量代表用户在金库中的按比例权益。
随着金库积累更多的资产——无论是通过收益耕作、投资还是捐赠——份额会相应增值。用户赎回他们的份额以获得原始代币加上金库累积的任何额外收益。

3.2 理解份额背后的数学
在ERC-4626中,存款资产(deposit/mint
)和赎回资产(withdraw/redeem
)的函数使用内部转换函数(convertToShares
和convertToAssets
)。这些函数处理底层资产和份额之间的转换,确保准确的比例分配。
尽管这看起来可能一开始很复杂,但资产和份额之间的交换计算相对简单,类似于基本的三数法则:
/**
* @dev 内部转换函数(从资产到份额)并支持四舍五入方向。
*/
function _convertToShares(uint256 assets, Math.Rounding rounding) internal view virtual returns (uint256) {
return assets.mulDiv(totalSupply() + 10 ** _decimalsOffset(), totalAssets() + 1, rounding);
}
/**
* @dev 内部转换函数(从份额到资产)并支持四舍五入方向。
*/
function _convertToAssets(uint256 shares, Math.Rounding rounding) internal view virtual returns (uint256) {
return shares.mulDiv(totalAssets() + 1, totalSupply() + 10 ** _decimalsOffset(), rounding);
}
复制
- 当用户存入资产时,金库的
totalAssets
和totalSupply
(流通份额)成比例增加。 - 用户只有在金库的
totalAssets
独立于totalSupply
增加时才能获利。这发生在金库通过收益耕作、投资或直接资产捐赠产生额外资产时。
换句话说,用户从份额中获得的利润严格依赖于金库总资产的有机增长,而不是其他用户的后续存款。
注意: 在转换计算中,_decimalsOffset()
函数用于确定虚拟份额率,作为缓解金库通胀攻击影响和盈利能力的安全措施。有关这种特定攻击类型的更多细节,请参阅我们的博客文章:一种新的针对ERC-4626通胀攻击的防御方法。
4、汇率操纵
由于ERC-4626金库的固有功能,集成这些代币的协议通常使用金库内部的汇率(每份额的资产)作为定价参考。
例如,考虑一个集成了像wUSDM(一个ERC-4626代币)这样的代币化金库的协议。为了以美元定价wUSDM,该协议:
- 调用金库合约上的
convertToAssets
函数,以确定一个份额(wUSDM)目前代表多少底层资产(USDM) - 利用可靠的USDM/USD价格馈送,将这个金额转换为最终的美元价格
然而,依赖内部汇率会使协议面临一种特定的价格操纵形式,称为“直接捐赠攻击”。在这种情况下,恶意行为者通过直接捐赠资产来膨胀金库的totalAssets
。这与典型的存款根本不同,因为在这种直接捐赠过程中不会创建新的份额。
因此,虽然常规存款会成比例地增加totalAssets
和totalSupply
(份额数量),从而保持份额的价值,但直接捐赠只会增加totalAssets
。这导致现有每个份额所代表的价值立即增加,对未做好准备的协议来说,这种快速且不可预测的价格波动存在重大风险。
4.1 对贷款协议的风险
在贷款协议的背景下,当交换率直接从金库合约确定并且ERC-4626代币作为基础资产(可用于借款的资产)时,通过捐赠攻击的通胀呈现两个主要风险:
- 意外清算: 代币估值的显著增加可能会突然提高用户的贷款价值比率(LTV),可能导致借款人意想不到的清算。
- 坏账积累: 如果资产捐赠带来的价格上涨足够大,使用户的LTV比率超过100%,协议将积累坏账。
4.2 实际利用场景
考虑一个使用wUSDM作为基础资产的贷款协议,并观察以下场景:
- 一名攻击者存入正好400万美元的抵押品。
- 然后,攻击者借入正好320万美元的wUSDM,建立80%的LTV比率。

接下来,利用金库的流动性较低:
- 攻击者直接向wUSDM金库捐赠正好32万美元的USDM。
由于流动性较低,这笔小额捐赠显著增加了每份额的资产价值,使wUSDM的价格上涨了50%。

结果:
- 攻击者最初借入的金额(320万美元)减去捐赠(32万美元)在通胀前价值为288万美元。
- 捐赠后的通胀使这一金额增加1.5倍,达到432万美元。
- 这种操纵使攻击者立即获利32万美元,使其有效LTV从80%升至120%,给协议造成坏账。
这清楚地说明了如果贷款协议未能妥善处理ERC-4626代币的通胀风险,可能会遭受坏账。
5、依赖AMM TWAP的协议的风险
之前描述的关于ERC-4626代币估值操纵的问题在使用自动做市商(AMM)的时间加权平均价格(TWAP)预言机的协议中尤为突出。通常,TWAP预言机通过在较长时间内平均代币价格来防止突然的价格操纵。
然而,ERC-4626代币本质上是不同的。当攻击者膨胀ERC-4626金库的总资产时,这种膨胀是永久性的。这种永久性意味着,通常会通过纠正标准ERC-20资产的价格来恢复平衡的套利者无法纠正ERC-4626代币的价格通胀。相反,攻击者自己捕获了套利,将AMM价格锁定在与膨胀的金库价格一致的状态。
这导致TWAP在其平均期间(通常是30分钟)不可避免地逐渐增加。一个预见到这种价格上升的攻击者可以利用依赖AMM TWAP预言机的协议,在初始记录较低的代币估值时进行攻击。
由于这种价格通胀是有机且不可逆的,通常的市场修正行动,如其他用户的额外铸造或赎回,没有效果。因此,阻止攻击需要不切实际的措施,如:
- 用户完全撤回他们的资产(在实践中几乎不可能)
- 协议管理员迅速暂停市场(如果需要治理投票则难以实现)
- 手动重置价格,这在去中心化环境中通常不切实际
因此,集成ERC-4626代币并与AMM TWAP预言机结合的协议必须认识到这种任意操纵的独特风险。
6、最近的Venus漏洞利用
历史上,有多次涉及ERC-4626代币价格操纵的重大漏洞利用事件,最著名的是2021年对CREAM Finance的攻击。最近,在2025年2月,Venus协议在ZKsync网络上遭遇了类似的攻击,导致攻击者获利约86 WETH,而协议则积累了大量坏账。攻击者的交易可以在这里找到这里。
几个因素促成了这次攻击:
- 在ZKsync上,wUSDM的流动性较低。
- 使用wUSDM(一个ERC-4626代币)作为可借的基础资产。
- 缺乏对抗激进价格操纵的保护措施。
为了清楚地说明这次攻击是如何展开的,我们将它分解为四个关键阶段。
阶段1:杠杆
最初,攻击者通过AAVE的闪电贷借入2100 WETH,随后将这些代币存入Venus协议以增强借贷能力。

使用两个单独的账户(账户A和账户B),攻击者进行了多次借贷和重新存款wUSDM的操作:
- 账户A从Venus池中借入466,000 wUSDM,并将这些代币转移到账户B。
- 账户B重新存款(供应)借入的wUSDM到Venus,人为地增加了账户B的记录供应余额。

通过反复进行这些借贷和重新存款循环,账户A达到了其最大借贷限额(抵押因子),而账户B积累了相当大的供应记录。
阶段2:通胀
在最后的杠杆循环中,账户B铸造了303,000 wUSDM,将107,000 wUSDM转回账户A,保留55,000 wUSDM。
账户A然后借入额外的303,000 wUSDM,总计411,000 wUSDM,并兑换为439,000 USDM。
这些USDM代币被直接捐赠到金库,由于金库流动性较低,wUSDM的价格大约上涨了1.7倍。

阶段3:清算
在通胀之后,账户A的贷款变得严重不足抵押,允许账户B发起清算:
- 账户B多次使用其55,000 wUSDM余额清算账户A,将wUSDM兑换为WETH。
- 账户B不断从协议上记录的膨胀存款中补充其wUSDM余额,重复这一过程,直到账户A的债务被完全清算。
阶段4:最终借贷
在清算结束时,账户B获得了约1498 WETH,并且由于膨胀的存款价值,仍然拥有额外的借贷能力。这使得账户B能够从协议中再借162 WETH。所有WETH随后被转移回账户A。
结果
最终,攻击者净获利约2186 WETH(1498 WETH来自清算,526 WETH未使用的初始抵押品,以及清算后借入的162 WETH),利润约为86 WETH,并给Venus协议造成了大量坏账。
7、安全集成策略
为了有效缓解上述风险,集成ERC-4626代币的协议必须实施强大的安全措施。这些措施可能包括采用相关资产价格预言机(CAPO)以防止快速和过度的价格膨胀,以及快速响应的杀掉开关机制,以迅速应对严重的波动和操纵企图。
相关资产价格预言机(CAPO)
CAPO通过限制资产交换率在指定时间段内可以增加的速度,帮助防止突然和激进的资产价格膨胀。CAPO设定了预定义的约束,包括:
- 快照时间戳: 标记交换率参考点的初始时间戳。
- 快照比率: 资产的初始记录交换率。
- 最大年度比率增长百分比: 资产交换率的最大允许年度增长百分比。
CAPO逻辑很简单:
- 获取资产价格: 获取当前的资产交换率。
- 与最大比率比较: 动态计算基于快照比率和允许的增长的最大允许比率。
- 返回调整后的价格:
- 如果当前交换率超过最大比率,则返回上限比率。
- 否则,返回实际当前交换率。
这种策略确保了通过捐赠或其他激进通胀手段进行的价格操纵可以得到有效控制。
快速响应的杀掉开关
类似AAVE使用的机制,杀掉开关提供了一种快速响应的保障措施,以应对极端市场波动或操纵。与手动或治理为基础的紧急措施相比,这些措施可能缓慢且低效,而杀掉开关可以在检测到严重异常时立即暂停市场活动,显著降低灾难性后果的风险。
这种快速响应机制可以通过以下方式实现:
- 自动化的智能合约逻辑,当价格偏离预期市场价格时暂停借贷或贷款活动。
- 管理员控制,使协议维护者能够迅速响应操纵尝试或异常市场事件,从而增强协议的弹性。
8、结束语
本文探讨了将ERC-4626代币集成到DeFi协议中的固有风险,突出了通过捐赠驱动的通胀攻击进行的汇率操纵的关键漏洞。通过分析最近的Venus协议事件等现实案例,清晰地说明了这些风险。还讨论了战略防御措施,如实施相关资产价格预言机(CAPO)和快速响应的杀掉开关。通过主动实施强大的保护措施,协议可以显著减少其对操纵风险的暴露,并为所有参与者贡献一个更安全和稳定的DeFi生态系统。
原文链接:ERC-4626 Tokens in DeFi: Exchange Rate Manipulation Risks
DefiPlot翻译整理,转载请标明出处
免责声明:本站资源仅用于学习目的,也不应被视为投资建议,读者在采取任何行动之前应自行研究并对自己的决定承担全部责任。