Resupply 协议攻击事件的深度分析和思考

碳链价值15 小时前

2025 年 6 月 26 日,稳定币协议 Resupply在以太坊主网部署的合约遭受攻击,损失了约 $10M 的资产。由于相关合约的价格预言机(price oracle)的实现方式存在问题,导致对于新创建的低流动性Market,攻击者可以通过 donation attack 操纵借出资产(Resupply 发行的稳定币 reUSD)的相对价格(即借出资产和抵押资产的兑换比例,exchange rate)使其为 0,从而绕过资产健康度检查,借出大量 reUSD 获利。

BlockSec 在全网最先公开预警后提供了初步分析[2, 3],Resupply 在之后也发布了官方公告[4],但对很多技术细节并未作详细阐述,本文将提供更为详尽的分析;另一方面,攻击发生后项目方及其相关方之间也发生了激烈的社区争议[5],本文将深入分析并探讨该协议背后复杂的生态关联,供读者参考。

背景 

1.1 关于 Resupply 协议

Resupply 是一个去中心化的稳定币协议[1],属于Curve生态。Resupply 所发行的稳定币叫做 reUSD,这是一种由抵押债务头寸 (CDP) 支持的去中心化稳定币,由在外部平台的借贷市场赚取利息的其它稳定币---包括crvUSD和frxUSD---支持,用户可通过提供 crvUSD 和 frxUSD 借出 reUSD,实现稳定币资产再融资。

Resupply 协议攻击事件的深度分析和思考

具体而言,用户可以在某个部署在链上的 Resupply Market 实现借贷的相关操作。Market 的创建和行为通过 DAO 来管理,每一个 Market 指定一个 ERC-4626 Vault 作为抵押物资产(collateral),并以该Vault 对应的 asset 作为标的资产(underlying)。用户通过在 Market 中存入抵押物(Vault 或者 Vault 的 asset),借出 reUSD。

以攻击涉及的 Market 0x6e90 以及 Vault 0x0114 为例,其涉及的相关资产(token)如下:

  • Market 0x6e90:

    • underlying: crvUSD

    • collateral: cvcrvUSD (即 Vault 0x0114)

    • borrowed: reUSD

  • Vault 0x0114:

    • asset: crvUSD(实际保存在 Curve LlamaLend Controller,也是一个 Market,对于理解攻击不重要)

    • collateral: wstUSR (即 Curve LlamaLend Controller 的抵押资产)

    • borrowed: crvUSD (即 Curve LlamaLend Controller 的借出资产)

    • share: cvcrvUSD(即 Vault 自身,ERC-4626 token),是 asset 对应的 share

也就是说,用户可以在该 Market 抵押一定数量的 cvcrvUSD(或 crvUSD,但实际也会通过 Vault 转化为 cvcrvUSD)借出 reUSD,如图所示:

Resupply 协议攻击事件的深度分析和思考

1.2 如何判断用户是否有资格借出某种资产?

和一般的借贷协议类似,Resupply Market 也会对用户的头寸做资产健康度检查(通过 modifier isSolvent)。

Resupply 协议攻击事件的深度分析和思考

isSolvent 最终会调用 _isSolvent 函数,并在这里检查 LTV(Loan-to-Value,贷款价值比或借贷率),要求用户借出资产和抵押资产之间的比率 LTV 不能超过系统设定的最大值(_ltv <= maxLTV)。

可以看出,上述 LTV 的计算依赖于 exchange rate (代码中的_exchangeRate),即借出资产相较于抵押资产的价格(兑换比例)。

攻击分析 

2.1 Root Cause 分析

从合约代码的角度而言,导致攻击的关键为 Resupply Market 的 price oracle 实现存在问题。对于新创建的低流动性 Market,攻击者可以通过 donation attack 操纵 exchange rate,从而绕过健康度检查,进而借出大量 reUSD 获利。

Resupply Market 如何计算 exchange rate?

Resupply 协议攻击事件的深度分析和思考

根据以上代码,可以得到 exchange rate 的计算公式如下:

Resupply 协议攻击事件的深度分析和思考

显然,如果 getPrices 返回的 price大于 1e36,整数除法的向下舍入会导致 _exchangeRate = 0。

如何操纵 price?

Resupply 协议攻击事件的深度分析和思考

Resupply 协议攻击事件的深度分析和思考

根据以上代码,可以得到 price 的计算方式如下:

Resupply 协议攻击事件的深度分析和思考

其中:

Resupply 协议攻击事件的深度分析和思考

由于代码中设置了 precision = 1,DEAD_SHARES = 1000,shares = 1e18,因此:

Resupply 协议攻击事件的深度分析和思考

最终,代入变量后得到 price 的计算公式如下:

Resupply 协议攻击事件的深度分析和思考

可见,想要放大 price 的值,关键在于如何扩大 total_assets 和 totalSupply 之间的差距,使得 total_assets 极大而 totalSupply 极小。在 Resupply 实际的协议实现中,公式中的 total_assets 取决于 underlying(crvUSD),totalSupply 取决于该 Market 里总体流动性所对应的share(cvcrvUSD),这正是经典的 donation attack 场景。

2.2 攻击交易分析

根据攻击交易[4],可以分析出攻击者做了如下几步核心操作:

1. 通过闪电贷借了4,000 USDC 并兑换为 3,999 crvUSD。

2. 向 Controller 0x8970 donate 了 2,000 crvUSD。

  • 在 donate 之前,Controller 0x8970 持有 crvUSD 数量为0。

  • Donate 之后,记录的 crvUSD 数量变为 2000000000000000000000(decimal 为 18)。

3. 存入~2 crvUSD 进入 Vault 0x0114 并获得了 1 share(cvcrvUSD)。

  • 此时记录的 crvUSD 数量为 2002000000000000000001(decimal为18)。

4. 为 Market 0x6e90 添加 1 单位 (即 Vault 0x0114 的 1 share) 抵押物。

5. 从 Market 0x6e90 借出 10,000,000 reUSD。

  • 可以看到此时 _exchangeRate 的值为 0,导致 _ltv 为 0,所以能够通过 _isSolvent 检查。

  •  

Resupply 协议攻击事件的深度分析和思考

为什么此时的 _exchangeRate 为 0 呢?因为攻击者通过之前的步骤,操纵合约达到了如下状态:

Resupply 协议攻击事件的深度分析和思考

回顾一下 exchange rate 的计算方式:

Resupply 协议攻击事件的深度分析和思考

由于此时 price > 1e36,导致_exchangeRate = 0。

6. 将借出的 reUSD 兑换获利。

经验教训

Resupply 此次被攻击的 Market 中 price oracle 实现类似 Curve 提供的模版合约[11]:

Resupply 协议攻击事件的深度分析和思考

但 Curve 给出了该实现的适用范围:

Resupply 协议攻击事件的深度分析和思考

遗憾的是,Resupply 协议在实现时似乎并未考虑这一适用性警告。

关联关系和社区争议

4.1 Curve 生态五大项目的复杂关系网

要理解 Resupply 事件的深层影响,我们首先来看看Curve生态系统中五个核心协议之间的复杂关系:

Resupply 协议攻击事件的深度分析和思考

Curve Finance 是整个生态的核心,提供流动性池、crvUSD 和 LlamaLend 协议,支撑 Resupply、Prisma、Convex 和 Yearn 的运行。Convex 通过质押和治理优化 Curve 的收益,并为 Prisma 和 Resupply 提供额外的奖励机制。Prisma 依赖 Curve 的 LP 代币和 Convex 的收益增强功能,而 Resupply 则直接基于 Curve 的 LlamaLend 发行 reUSD,并由 Convex 和 Yearn 联合开发。Yearn 不仅优化 Curve 池的收益,还通过与 Convex 的合作推动 Resupply 的开发。

  • Curve Finance:作为核心平台,Curve 的流动性池(如 crvUSD 池)和 LlamaLend 协议被 Resupply 直接用于发行 reUSD,Prisma 用于质押 LP 代币,Yearn 用于收益优化,Convex 用于投票治理。

  • Convex Finance:Convex 是 Curve 的收益增强协议,用户通过质押 Curve LP 代币可获得更高的 CRV 奖励及 Convex 的 CVX 代币。Convex 控制 Curve 近 50% 的治理权重,并为 Prisma 和 Resupply 提供收益提升机制。

  • Prisma Finance:Prisma 利用 Curve 的 LP 代币进行质押,用户通过 Convex 获得增强的奖励(cvxPRISMA)。Prisma 依赖 Curve 的流动性和 Convex 的收益机制。

  • Yearn Finance:Yearn 是一个收益聚合器,通过优化 Curve 池的 LP 代币收益(如通过 Convex 增强)为用户提供高回报。Yearn 与 Convex 合作开发 Resupply,并在其收益策略中广泛使用 Curve 池。

  • Resupply:由 Convex 和 Yearn 联合开发,允许用户通过借出 crvUSD 等稳定币来获得 reUSD,并自动将代币质押在 Convex 上赚取 CRV 和 CVX 奖励,形成收益优化闭环。

4.2 争议和影响

然而,当 Resupply 遭受攻击后,这种复杂的关联关系立即成为了争议的焦点。Curve 创始人 Michael Egorov 迅速与 Resupply 划清界限,他强调:"There is no single person from Curve working on that project... don't generalize to Curve please."(没有任何 Curve 的人员参与该项目...请不要将问题泛化到 Curve)这种撇清关系的表态,讽刺地反映了 DeFi 生态中错综复杂的协作关系在面临危机时的脆弱性。

Resupply 协议攻击事件的深度分析和思考

上述相互关联的项目共同构成了一个高度耦合的生态系统---在这样的系统中,任何环节出现问题都可能引发连锁反应。因此,Resupply 攻击事件引发社区对协议关联性与安全性的广泛讨论[5],也就不足为奇了。

更多思考

5.1 时间线

2025 年 5月 17 日,Resupply 官方地址 0x1f84 通过 Curve 的 OneWay Lending Factory 部署了一个新的 LlamaLend Market[6],其中:

  • 该 Market 将 crvUSD 作为借贷资产,并以 wstUSR 作为抵押代币。

  • ERC-4626 Vault 合约为 0x0114,对应的 Controller 为 0x8970。

2025 年 5 月 31 日,一个新的提案 wstUSR-long LlamaLend Market[7] 在 Resupply 的治理页面上线,该提案旨在允许用户通过该 LlamaLend Market 铸造 reUSD。

2025 年 6 月 11 日,该提案在链上发布[8]。

2025 年 6 月 26 日 00:18:47 (UTC),该提案获得通过,Resupply 官方地址 0x0417 在链上部署了[9] 一个新的 ResupplyPair(即 Resupply crvUSD/wstUSR Market) 0x6e90,该 Market:

  • 绑定了 Vault 0x0114 和 Controller 0x8970。

  • 以 Vault 的抵押债务头寸(即 cvcrvUSD,其标的资产为 crvUSD)作为抵押品。

2025 年 6 月 26 日 01:53:59 (UTC),即在 Market 0x6e90 部署上链约 1.5 小时之后,攻击者成功实施攻击[4];与此同时 BlockSec 检测到攻击并尝试联系项目方。

2025 年 6 月 26 日 02:26 (UTC),项目方未果并确认无法造成更多损失后,BlockSec 发布公开预警[2]。

2025 年 6 月 26 日 02:53:23 (UTC),项目方暂停协议[4]。

Resupply 协议攻击事件的深度分析和思考

5.2 如果有了 Phalcon,悲剧本可避免

ResupplyFi 的灾难电影在深夜上演,而全网首个警钟由 BlockSec Phalcon 敲响[2]:

Resupply 协议攻击事件的深度分析和思考

这不是事后的马后炮,而是攻击发生的那一刻就响起的警钟。

通过在内存池阶段监控交易,Phalcon 能够在攻击交易进入内存池的瞬间就识别异常模式。系统基于AI驱动的智能分析引擎,整合了 200 多个典型攻击特征,在过去半年中保持了小于 0.0001% 的超低误报率,实现了真正意义上的精准威胁检测。

当威胁被识别后,Phalcon 的自动化攻击阻断机制会立即启动。系统利用独家开发的 Gas 竞价策略,确保防护交易能够抢跑攻击交易,同时自动触发协议的紧急暂停功能。整个响应过程支持 EOA、多签钱包等多种权限控制模式,为不同类型的协议提供灵活的安全解决方案。

如果 Resupply 在 Market 部署时就集成了 Phalcon 系统,攻击本可完全避免:

在 Market 0x6e90 部署完成后的 1.5 小时内,Phalcon 系统会自动检测到新 Market 的部署,智能分析其配置参数,识别出潜在的 donation attack 风险。系统会立即向项目方发送风险预警,建议增加初始流动性保护或调整相关参数。更关键的是,当攻击交易在 01:53:59 UTC 进入内存池时,Phalcon 的 AI 算法会立即识别出典型的 donation attack 模式,自动触发紧急暂停交易,通过 Gas 竞价确保防护交易优先执行,从而完全避免 1000 万美元的损失。

Resupply 千万美元在内等无数攻击事件告诉我们,在 DeFi 的世界里,安全不是可选项,而是生存的必需品。不要等到下一次攻击才后悔。

免责声明:

1.资讯内容不构成投资建议,投资者应独立决策并自行承担风险

2.本文版权归属原作所有,仅代表作者本人观点,不代币币情的观点或立场