借贷协议的脆弱点

  • mixbytes
  • 发布于 2024-02-25 16:55
  • 阅读 20

本文深入分析了借贷协议常见的核心安全漏洞,并探讨了这些漏洞的分类和影响。通过细致的市场概述以及对各类型攻击的阐述,作者为审计人员提供了重要的安全审计建议,强调了价格源和列出代币的重要性。整体结构清晰,内容详实,为审计防范提供了有效指导。

作者:Daniil Ogurtsov - MixBytes 的安全研究员

简介

在本文中,我们将尝试讨论与借贷协议常见的核心安全漏洞相关的内容。

借贷协议经历了许多被分类的黑客攻击。了解这些漏洞是审计员的一个完美工具——借贷协议有相同的脆弱点和典型的攻击向量。在审计时,牢记这些向量作为对借贷协议应用的工具非常重要。它适用于分叉借贷协议和具有独特逻辑的协议。

审计师需要理解的市场概念

借贷协议的概念非常简单。

1) 用户可以借款

你将 1 ETH 作为抵押(价值 1000 美元),并且可以借取 700 USDC。是的,要求你借款少于你抵押的资产。这听起来可能没什么意义,但用例如下:无论代币价格如何变动,你只需归还 700 USDC,就能取回 1 ETH。从这个意义上说,借贷协议让你能够固定 USDC/ETH 的价格。

2) 用户可以出借

之前借出的 700 USDC 不是凭空产生的。出借者是先投入资本的人。这些代币存储在智能合约中,其中一部分代币没有被借出。 [借出的代币] / [出借的代币] 被称为“利用率”。“60% 使用率”意味着出借者在智能合约上投入了 10 ETH,但借款者仅借出了 6 ETH。

3) 当资金被借出时,出借者赚取利息

之前我们提到,你需要归还 700 USDC 才能收回抵押的 1 ETH。好吧,这并不完全正确——准备好归还 702 USDC。借入的资金会随着时间产生利息,例如每年 6%。这 2 USDC 是出借者的收益,这是他们提供流动性的动机。

4) 利率是动态的,通常(但并不总是)依赖于利用率

协议会尝试其具体的公式。但在大多数情况下,随着利用率的上升,利率也会上升。

5) 随着价格变动,协议保护自身,以确保你借入的资金不超过抵押的资金

你资产的市场价格会随时间变化。因此,协议会跟踪你的借入价值是否超过抵押品的价值,甚至更糟的是,不超过你抵押品的 ~80%。这个 80% 是最大贷款价值比(Max LTV)。

6) 你可能会失去偿还借入资金以获取抵押品的权利

当你位置的 LTV 超过最大 LTV 时,会发生清算。你的抵押品被出售,你失去了原本将 700 USDC 换回 1 ETH 的机会,你的头寸被平仓。

7) 你可以进行杠杆交易

DeFi 用户使用“折叠”策略是非常普遍的。

想象一下你有 1000 ETH。

你在 Lido 存入 1000 ETH,获得 1000 stETH。这是你在流动质押中的投资,你会逐渐获得回报。

然后你将 1000 stETH 作为抵押在 Aave 上。接着你借取 700 ETH。然后你再次存入 Lido,获得 700 stETH。然后将 700 stETH 作为抵押在 Aave 并重复这个过程多次。

结果显示你在 Lido 上存入了:1000 ETH + 700 ETH + 490 ETH,等等。

因此,你在 Lido 的回报上获得了“杠杆”。

当你预期 stETH 和 ETH 的汇率不会波动时,这很简单。但当你拥有非相关资产时,事情就会变得复杂——一点价格波动会摧毁所有的折叠,因为头寸将被清算。

项目类型

借贷协议的审计流程取决于其类型。主要有两类:

1) Aave/Compound 的分叉

这些项目复制了 Aave 或 Compound 的代码库。

审计员可以关注项目不同于 Aave 或 Compound 的地方。根据经验,这些差异往往成为黑客的目标,因为它们产生了在 Aave 和 Compound 上不可能的新事务流。

绝大多数项目都是分叉,通常它们在被允许的代币和这些代币的预言机上有所区别。它们在安全分析中是直接的,因为:

  • Aave 和 Compound 的代码在行业中经过了大量研究,进行了多次审计(针对 Aave 和 Compound 本身及其分叉)。而且,审计员可能已有审计至少一个 Aave/Compound 分叉的经验。
  • 大多数借贷协议的黑客攻击涉及这些分叉(通常是因为它们引入了新的逻辑、代币或预言机逻辑)。因此,审计员了解吸引漏洞的因素。

2) 有特定逻辑的项目

它们不是分叉项目,而是引入了新的机制。

审计员将这类项目看作普通 DeFi 项目,整个审计工具和实践的集合在这里都是有帮助的。顺便说一下,针对 Aave/Compound 分叉的常见攻击在这里仍然是一个问题,因为我们有相同的攻击向量。因此,尝试证明项目在这些攻击下是安全的,是一个很好的实践。

以下是此类项目的一些示例:

  • 允许建立独立市场的工厂项目。想象一下,项目能够创建一些小型的 mini-Aaves 和 mini-Compound。它们有不同的代币列表,流动性是独立的。在独立市场中,一个市场中资产的风险不会影响其他市场和整个系统。

(Rari Capital 的 Fuse)

  • 与独立交易对合作的项目。它们类似于独立市场,但仅限制于两个代币:一个代币可用于借贷,第二个代币作为抵押品;

(Fraxlend, Sushi 的 Kashi)

  • 引入固定利率的项目;

(示例:Notional Finance)

等等。

常见的攻击向量

所有攻击的总体思路是借取超过存入的资金。每种攻击类型都是实现这一目标的技术。

预言机攻击

在这种类型的攻击中,目标是相同的——借取超过存入的资金。但在这一分类中,攻击者试图让协议认为存入的价值较高,或借入的价值较低。这是一个成功的例子:如果攻击者存入 1000 美元,但通过预言机操控让协议认为存入了 5000 美元。这将允许借取 3000 美元,而 LTV 检查将通过。

最明显的问题发生在协议通过 getReserves() 或 balanceOf() 从 Uniswap 交易对获取价格时。在大多数情况下,这是一个警告信号。即使是初学者黑客也知道很容易借助闪电贷设定任何价格:无论是非常高还是极低。只有非常老旧的项目犯这样的错误,或者流动性低的骗局项目。

但是,在分析最大的借贷黑客案例时,你可能会发现错定价的资产是 LP 代币或在金库中的份额。比如以 Warp Finance 作为例子。https://rekt.news/warp-finance-rekt/

Warp Finance 允许将 LP 代币作为抵押品。LP 代币通常流动性较低,因此协议引入了一些逻辑来定价这些代币。

在 Warp 中,团队计算 LP 代币价格为 [Pair TVL] / [LP tokens minted]。这听起来相当合理,但对 Uniswap 交易对来说却是个坏主意。Uniswap 交易对保持 k 的常量,但 TVL 未必会保持不变。

TVL 的公式是:TVL = (reserve0 * price0) + (reserve1 * price1)。团队采用了安全的价格来源(TWAP)。此外,k 始终是常量,但整个 TVL 收益可能会在发生大额交换时剧烈波动。

来源:https://cmichel.io/pricing-lp-tokens/

所以,事情是这样的——黑客借了闪电贷,操控了交易对的 TVL 计算,影响了 LP 代币的价值。

这个问题在这里被完美地阐明:

https://cmichel.io/pricing-lp-tokens/

在 Yearn 接受金库份额的借贷项目中,你可以找到同样的思路,但步骤更复杂。我们以 CREAM 为例。CREAM 经历了许多次攻击,其中之一与 yUSD 有关——一个金库份额,是 Curve 上简单稳定币策略的 LP 代币。

https://mudit.blog/cream-hack-analysis/

CREAM 使用 yUSD.pricePerShare() 来获取 yUSD 的价值。函数逻辑是 [TotalUnderlyingInPool] / [TotalSupplyShares]。操控此公式的唯一方法是增加 TotalUnderlyingInPool。乍一看,这似乎是单向操作——任何人都可以将代币转入金库,但似乎没有人能从金库提取代币,因此这一操作没有太大意义。但事实并非如此。有人可以借取数百万以将资金存入 Yearn,成为最大的 Yearn 金库投资者,从而随时提取按比例的代币份额。所以,这些前提条件允许任何人操控 pricePerShare() 的返回值。

检查一些其他基于错误代币评估的黑客攻击:

  • Inverse Finance

https://halborn.com/explained-the-inverse-finance-hack-june-2022/

  • Cheese Bank

https://learnblockchain.cn/article/12431

审计时的建议:

  1. 严格检查所有代币的价格来源——你应该确保公式中的任何元素都无法被操控。
  2. 使用 Chainlink 预言机。
  3. 当 Chainlink 价格不可用时使用 TWAP(但在某些情况下,这是糟糕的建议,请参见下章)。

关于使用 TWAP 作为价格来源

TWAP 的价格在一个交易和块中难以被操控。然而,成为原子性质并不是攻击者的要求。TWAP 仅仅是一个使用链上来源的公式,攻击 TWAP 的时间和成本都是问题。

这里有一篇研究 TWAP 攻击成本的文章。

https://eprint.iacr.org/2022/445.pdf

总的来说,低流动性代币的 TWAP 攻击可能是有利可图的。

让我们看看 Inverse Finance 攻击的例子:

https://twitter.com/FrankResearcher/status/1510239094777032713?s=20&t=RBNXo-6wEDCiBE5a9nO0-Q

在这次攻击中,没有使用闪电贷,攻击者必须使用自己持有的 901 ETH。这种攻击并不像所有人都能访问,但对某些 DeFi 用户来说仍然是一个选项。以 500 ETH 的成本改变抵押品的价值,借取 1500 萬美元,而仅存入 65 万美元的 INV 代币。

相同的黑客攻击也发生在 Moola 上。

https://www.coindesk.com/markets/2022/10/19/celo-protocol-moola-market-loses-over-10m-in-market-manipulation-attack/

看看价格图表——这是 TWAP 操控随时间发生的良好表示。

所以,请注意,使用 TWAP 并不总是有帮助的。但在没有更好的价格来源可用时,有时是必要的。在这种情况下,攻击的成本必须要考虑。当攻击成本高于潜在收益时,任何 TWAP 攻击将变得没有利润。

此外,TWAP 在不同的上下文中可能会以不同的方式工作。例如,上述 Warp Finance 正确使用了 TWAP,用于流动性较大的交易对(ETH/DAI)。但是 Warp Finance 用 TWAP 来计算 LP 代币的价值。储备仍然受到操控,整体 TVL 计算(基于储备 * 价格)也一样。

重入与可Hook代币

这是最常见的黑客类型之一。

当协议中的某一个代币是可Hook时,它就会发生。

想象一个协议,它接受 USD 作为抵押,并允许以 hookUSD(带钩)借款。

可Hook代币在大多数情况下遵循 ERC-777 标准:

https://eips.ethereum.org/EIPS/eip-777

它的转账函数包括三个步骤:

  • 在余额变化之前调用代币发送者
  • 应用余额变化
  • 在余额变化之后调用代币接收者

这些调用(Hook)都是可选的,调用接收者必须允许这些调用。在我们的情况下——攻击者肯定会允许这些调用给代币发送者。

没有攻击的流程将如下工作:

在Hook之后,攻击者可以再次调用任何协议函数。目标是绕过 LTV 检查。因此,攻击者在Hook期间再次调用借款。第一次借款调用仍未完成,代币转账的余额也没有改变。因此,LTV 检查将通过,因为协议尚未转移任何代币,由此攻击者仍然没有借入任何资金(如果观察账户余额)。

通过这种方式,任何与借款调用的Hook都可以绕过多个 LTV 检查。在所有Hook之后,余额的级联变化发生,黑客将看到 700 * (Hook数量)的余额。

这是使用可Hook代币进行黑客攻击的最简单示例。

在实践中,它们可能具有不同的形式。检查一些选择的示例列表以及详细的黑客描述:

  • CREAM 黑客事件

https://blog.merklescience.com/hacktrack/hack-track-analysis-of-cream-finance-hack

  • Fei Rari(发送 ETH 的Hook)

https://www.certik.com/resources/blog/6LiXVtPQ8q5AQfqOUPnTOS-revisiting-fei-protocol-incident

  • Ola Finance

https://twitter.com/peckshield/status/1509431646818234369

  • Aagave

https://rekt.news/agave-hundred-rekt/

  • Hundred Finance

https://rekt.news/agave-hundred-rekt/

https://learnblockchain.cn/article/12430

审计时的建议:

  1. 观察代码时要假设所有转移的代币都有可能是可Hook的(这将有助于识别脆弱点)。
  2. 建议客户完全避免使用可Hook代币。
  3. 请记住,在某些情况下,ETH 转账可能会成为Hook。
  4. 坚持遵循检查-效应-交互模式(但并不总能帮助所有情况)。
  5. 重入保护可能是一个好选择。

总结

在本文中,我们对借贷协议近年来遇到的主要安全事件进行了分类。深度分析的两个关键点是 1) 预言机和 2) 列出的代币。特别关注这些向量在审计过程中是努力的完美投资。

  • 谁是 MixBytes?

MixBytes 是一个由专家区块链审计员和安全研究员组成的团队,专注于为 EVM 兼容和 Substrate 基础的项目提供全面的智能合约审计和技术咨询服务。请加入我们,在 X 上保持对最新行业动态和见解的了解。

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

0 条评论

请先 登录 后评论
mixbytes
mixbytes
Empowering Web3 businesses to build hack-resistant projects.