ERC-4626 Vaults及类Vault合约之间的共享漏洞:深度探讨第3部分

  • cr0___
  • 发布于 2023-10-18 20:49
  • 阅读 6

本文深入探讨了ERC-4626 Vault合约以及类似Vault合约中存在的两种常见漏洞:份额膨胀和不正确的舍入,并详细讨论了针对这些漏洞的有效和无效的缓解措施。文章还为希望实施自定义类Vault合约的开发者提供了一些建议,并强调了使用ERC-4626标准的优势。

由 Alexis Williams 于 2023 年 7 月 31 日撰写。

缓解漏洞

既然我们已经介绍了 ERC-4626 兼容的 vault 合约、非 ERC-4626 vault 合约和类 vault 合约之间共享的两个最突出的漏洞,我们将讨论每个漏洞的缓解措施。除了提出有效的缓解措施外,我们还将回顾仍然出现在智能合约中的无效缓解措施,以便可以识别它们并用适当的缓解措施替换。为简单起见,当我们在本文中提到智能合约时,我们指的是 vault 合约的所有三个类别。

份额膨胀的无效缓解措施

份额膨胀的无效缓解措施的标志是,它们可能会阻止或阻止利用路径的某些部分,但它们并不能完全阻止利用的发生。这些缓解措施甚至可能创建新的利用路径,从而无法成功防止原始的份额膨胀漏洞。

要求最低初始存款

直观地看,这似乎解决了份额膨胀的漏洞,但实际上可能并不足够。尝试性的缓解措施阻止了第一个存款人提供少量资产,例如 1 wei。通过设置比 1 wei 大几个数量级的最低存款额,攻击者需要直接转移更大数量的资产来移动分母,即合约中的资产总额。例如:

  1. 部署了一个新的 ERC-4626、非 ERC-4626 或类 vault 合约,并提出了缓解措施,要求第一个存款人将 1 WETH 存入合约。
  2. 攻击者 Alice 是该合约的第一个存款人,因此必须至少存入 1 WETH。Alice 存入 1 WETH 并收到 1 * 1e18 份额。

如果 Alice 试图倾斜分母以执行份额膨胀,她将需要至少 1e18 * 1e18(或 1e36)WETH,这比她需要为原始利用提供的 WETH 多 18 个数量级!因此,乍一看,这似乎是针对份额膨胀漏洞的有效缓解措施。但是,可以修改利用路径以再次使合约容易受到攻击:

  1. 将 1 WETH 存入合约后,Alice 立即从合约中提取 1 WETH - 1 wei。现在,份额与资产的比率为 1 wei 份额:1 wei 资产,因此合约再次容易受到攻击!

通过对原始利用的简单修改,Alice 能够规避尝试性的缓解措施。因此,允许任何不受信任的用户成为第一个存款人会使这种缓解措施无效,因为他们一旦提供了最低初始存款额,就可以立即从合约中提取资金。我们将在后面的“份额膨胀的有效缓解措施”部分中讨论如何补救这一点。

要求返回非零数量的份额

通过添加要求任何存款必须至少返回 1 wei 份额,这可以防止攻击者窃取另一个用户的所有存款。但是,这种缓解措施并不能阻止攻击者以其他方式操纵另一个用户的存款。例如:

  1. 部署了一个新的 ERC-4626、非 ERC-4626 或类 vault 合约,并提出了缓解措施,要求所有存款都返回非零数量的份额。
  2. 攻击者 Alice 使用 1 wei 份额:1 wei 资产的易受攻击的比率来设置合约。
  3. 受害者 Bob 尝试将 2 WETH 存入合约。如果现在进行存款,Bob 将收到(1 wei 份额 * 2 WETH)/ 1 wei 资产 = 2e18 份额。
  4. Alice 抢先 Bob 的存款并将 1 WETH 直接转移到合约。
  5. Bob 存款的计算现在为(1 wei 份额 * 2 WETH)/(1 WETH + 1 wei)。由于小数截断,计算将返回 1 wei 份额。此计算通过了非零份额检查。
  6. Alice 赎回她的 1 wei 份额,由于合约中有 3 WETH + 1 wei,并且合约仅铸造了 2 wei 份额,因此现在价值约为 1.5 WETH。

在上述攻击场景中,Alice 能够找回她捐赠的 1 WETH 并窃取 Bob 存款的 0.5 WETH。虽然由于非零份额检查,Alice 无法窃取 Bob 的所有存款,但 Solidity 的除法截断(我们之前讨论过)使她能够窃取部分存款。因此,这个提议的缓解措施并不能有效地保护用户的所有存款免受攻击者的侵害。

份额膨胀的有效缓解措施

既然我们已经介绍了无效的缓解措施,我们就可以讨论有效防止份额膨胀攻击的缓解措施。

要求受信任方提供最低初始存款

从合约的角度来看,这种缓解措施可能与我们之前讨论的无效的最低初始存款缓解措施产生完全相同的代码逻辑。但是,额外的规定使这成为一种有效的缓解措施:受信任方必须进行初始存款。这确保了合约中份额与资产金额的比率已正确初始化,并且不易受到份额膨胀的影响。这种方法之所以有效,是因为进行初始存款的一方被信任不会提取该存款,从而使合约远离易受攻击的初始存款状态。通常,受信任方是协议的创建者或受信任的第三方流动性提供者。可以通过两种不同的方式来完成这种缓解:创建 ERC-4626、非 ERC-4626 或类 vault 合约的交易以及提供初始存款的交易捆绑在一起,使用像 Flashbots 这样的工具,或者开发人员可以将额外的逻辑编码到协议中,以确保只有受信任方才能进行初始存款。

在初始存款期间“销毁”份额

另一种有效缓解份额膨胀的策略是在初始存款时“销毁”份额。我们所说的“销毁”是指某些应归属于初始存款人的份额被转移(或以其他方式计入)到无人拥有的地址,例如零地址。这可以防止所有存款人能够赎回这些份额,从而销毁这些份额。这有效地抢先了合约的第一个存款人,这意味着第一个存款人将无法以使份额与基础资产的比率容易受到份额膨胀影响的方式来设置合约。

作为销毁份额的结果,某些数量的已存入资产也将无法赎回。但是,相对于基础存入资产的规模而言,通常只会销毁少量份额。这使得由于销毁初始数量的份额而损失的资产数量相对较小。

YieldBox 的方式:虚拟份额

我们将介绍的最后一种有效的份额膨胀缓解是虚拟份额。虚拟份额缓解是 YieldBox 首次实施的,但最近被提出并合并到 OpenZeppelin 的 ERC-4626 合约模板实现中。该缓解措施的工作原理是相对于提供的资产量,向合约铸造和销毁的份额数量添加一个“offset”。该offset由开发人员手动设置,其中offset相对于其价值按数量级增加份额膨胀攻击的成本。因此,ERC-4626 合约的份额与资产的初始比率最终为 1eX 份额:1 wei 资产,其中 X 是offset的值。这有效地防止了合约中份额与资产的初始比率出现偏差,因为它始终会以offset开始。

此外,通过以份额与资产的比率开始,使得份额数量大于资产数量,这些初始份额被有效地“销毁”。这意味着初始存款人损失了初始销毁份额的价值,其中损失的价值相对于offset的价值。这进一步削弱了攻击者的积极性,因为他们肯定会损失销毁份额所持有的价值。

关于份额膨胀的说明

既然我们已经介绍了所有有效的份额膨胀缓解措施,我们想补充一句警告。以上所有缓解措施并不能完全防止份额膨胀漏洞,它们只是使攻击更加困难。例如,如果一个token的总供应量很大,而攻击者拥有总供应量的很大一部分,则攻击者仍然有可能导致份额膨胀。小数位数值异常大的token也需要采取预防措施,以确保使用适当大的初始最低存款、销毁份额数量或offset值。

缓解不正确的舍入

缓解不正确舍入的方法很简单:使用 ERC-4626 的模板实现,例如 OpenZeppelin ERC-4626 合约模板。ERC-4626 合约模板将为你处理所有指定的舍入方向。但是,如果你决定实施类似 vault 的合约而不是完全兼容的 ERC-4626 合约,并且需要自己实施舍入方向,那么我们已经创建了一个 ERC-4626 舍入规范的可视化图表,以提高可读性:

创建类 vault 合约的技巧

在回顾了 ERC-4626 兼容的 vault 合约、非 ERC-4626 vault 合约和类 vault 合约的共享漏洞和缓解措施之后,现在让我们简要地讨论一下类 vault 合约。如果你是一个已经充分评估了实施自定义类 vault 合约而不是使用 ERC-4626 标准的风险的开发团队,并且你仍然希望继续进行自定义实施,那么这里有一些开发技巧供你参考:

  • 重新考虑使用 ERC-4626 和相关模板合约,而不是自定义实现: 实施你自己的类似 vault 的自定义合约实现应被视为规则的例外。开发团队应考虑攻击面和风险的增加是否值得,以及是否可以通过简单地扩展基本模板实现而不是从头开始构建来遵守 ERC-4626 标准。
  • 使用与 ERC-4626 标准类似的术语: 通过对相关函数和状态变量使用类似的术语,如“deposit/mint”、“withdraw/redeem”和“assets/shares”,这使审计员能够快速理解你的自定义类 vault 实现,并与 ERC-4626 标准进行比较。
  • 记录偏离 ERC-4626 标准的逻辑: 高亮显示你的实现不同之处可以减少审计员花费的时间,否则审计员将花费大量时间梳理整个 ERC-4626 标准,以手动识别符合和不符合的实现。

结论

在这篇文章中,我们介绍了份额膨胀和不正确舍入的各种无效和有效缓解措施。此外,我们还为想要实施自己的类 vault 合约的开发人员提供了建议。这结束了我们关于 ERC-4626 兼容的 vault 合约、非 ERC-4626 vault 合约和类 vault 合约之间共享漏洞的三部分系列文章。

关于 Arbitrary Execution

Arbitrary Execution (AE) 是一家以工程为中心的组织,专门从事保护去中心化技术。我们的安全研究团队利用其攻击性安全专业知识、策略、技术和黑客思维来帮助保护加密生态系统。我们在各种不同的安全主题和标准方面拥有丰富的经验,例如本三部分深入探讨中Featured的 ERC-4626 标准。

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

0 条评论

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