{"content":{"title":"借贷协议的脆弱点","body":"作者：Daniil Ogurtsov - MixBytes 的安全研究员\r\n\r\n![](https://img.learnblockchain.cn/2025/03/09/32.jpg)\r\n\r\n## 简介\r\n\r\n在本文中，我们将尝试讨论与借贷协议常见的核心安全漏洞相关的内容。\r\n\r\n借贷协议经历了许多被分类的黑客攻击。了解这些漏洞是审计员的一个完美工具——借贷协议有相同的脆弱点和典型的攻击向量。在审计时，牢记这些向量作为对借贷协议应用的工具非常重要。它适用于分叉借贷协议和具有独特逻辑的协议。\r\n\r\n## 审计师需要理解的市场概念\r\n\r\n借贷协议的概念非常简单。\r\n\r\n1) 用户可以借款\r\n\r\n你将 1 ETH 作为抵押（价值 1000 美元），并且可以借取 700 USDC。是的，要求你借款少于你抵押的资产。这听起来可能没什么意义，但用例如下：无论代币价格如何变动，你只需归还 700 USDC，就能取回 1 ETH。从这个意义上说，借贷协议让你能够固定 USDC/ETH 的价格。\r\n\r\n2) 用户可以出借\r\n\r\n之前借出的 700 USDC 不是凭空产生的。出借者是先投入资本的人。这些代币存储在智能合约中，其中一部分代币没有被借出。 \\[借出的代币\\] / \\[出借的代币\\] 被称为“利用率”。“60% 使用率”意味着出借者在智能合约上投入了 10 ETH，但借款者仅借出了 6 ETH。\r\n\r\n3) 当资金被借出时，出借者赚取利息\r\n\r\n之前我们提到，你需要归还 700 USDC 才能收回抵押的 1 ETH。好吧，这并不完全正确——准备好归还 702 USDC。借入的资金会随着时间产生利息，例如每年 6%。这 2 USDC 是出借者的收益，这是他们提供流动性的动机。\r\n\r\n4) 利率是动态的，通常（但并不总是）依赖于利用率\r\n\r\n协议会尝试其具体的公式。但在大多数情况下，随着利用率的上升，利率也会上升。\r\n\r\n5) 随着价格变动，协议保护自身，以确保你借入的资金不超过抵押的资金\r\n\r\n你资产的市场价格会随时间变化。因此，协议会跟踪你的借入价值是否超过抵押品的价值，甚至更糟的是，不超过你抵押品的 ~80%。这个 80% 是最大贷款价值比（Max LTV）。\r\n\r\n6) 你可能会失去偿还借入资金以获取抵押品的权利\r\n\r\n当你位置的 LTV 超过最大 LTV 时，会发生清算。你的抵押品被出售，你失去了原本将 700 USDC 换回 1 ETH 的机会，你的头寸被平仓。\r\n\r\n7) 你可以进行杠杆交易\r\n\r\nDeFi 用户使用“折叠”策略是非常普遍的。\r\n\r\n想象一下你有 1000 ETH。\r\n\r\n你在 Lido 存入 1000 ETH，获得 1000 stETH。这是你在流动质押中的投资，你会逐渐获得回报。\r\n\r\n然后你将 1000 stETH 作为抵押在 Aave 上。接着你借取 700 ETH。然后你再次存入 Lido，获得 700 stETH。然后将 700 stETH 作为抵押在 Aave 并重复这个过程多次。\r\n\r\n结果显示你在 Lido 上存入了：1000 ETH + 700 ETH + 490 ETH，等等。\r\n\r\n因此，你在 Lido 的回报上获得了“杠杆”。\r\n\r\n当你预期 stETH 和 ETH 的汇率不会波动时，这很简单。但当你拥有非相关资产时，事情就会变得复杂——一点价格波动会摧毁所有的折叠，因为头寸将被清算。\r\n\r\n## 项目类型\r\n\r\n借贷协议的审计流程取决于其类型。主要有两类：\r\n\r\n1) Aave/Compound 的分叉\r\n\r\n这些项目复制了 Aave 或 Compound 的代码库。\r\n\r\n审计员可以关注项目不同于 Aave 或 Compound 的地方。根据经验，这些差异往往成为黑客的目标，因为它们产生了在 Aave 和 Compound 上不可能的新事务流。\r\n\r\n绝大多数项目都是分叉，通常它们在被允许的代币和这些代币的预言机上有所区别。它们在安全分析中是直接的，因为：\r\n\r\n- Aave 和 Compound 的代码在行业中经过了大量研究，进行了多次审计（针对 Aave 和 Compound 本身及其分叉）。而且，审计员可能已有审计至少一个 Aave/Compound 分叉的经验。\r\n- 大多数借贷协议的黑客攻击涉及这些分叉（通常是因为它们引入了新的逻辑、代币或预言机逻辑）。因此，审计员了解吸引漏洞的因素。\r\n\r\n2) 有特定逻辑的项目\r\n\r\n它们不是分叉项目，而是引入了新的机制。\r\n\r\n审计员将这类项目看作普通 DeFi 项目，整个审计工具和实践的集合在这里都是有帮助的。顺便说一下，针对 Aave/Compound 分叉的常见攻击在这里仍然是一个问题，因为我们有相同的攻击向量。因此，尝试证明项目在这些攻击下是安全的，是一个很好的实践。\r\n\r\n以下是此类项目的一些示例：\r\n\r\n- 允许建立独立市场的工厂项目。想象一下，项目能够创建一些小型的 mini-Aaves 和 mini-Compound。它们有不同的代币列表，流动性是独立的。在独立市场中，一个市场中资产的风险不会影响其他市场和整个系统。\r\n\r\n（Rari Capital 的 Fuse）\r\n- 与独立交易对合作的项目。它们类似于独立市场，但仅限制于两个代币：一个代币可用于借贷，第二个代币作为抵押品；\r\n\r\n（Fraxlend, Sushi 的 Kashi）\r\n- 引入固定利率的项目；\r\n\r\n（示例：Notional Finance）\r\n\r\n等等。\r\n\r\n## 常见的攻击向量\r\n\r\n所有攻击的总体思路是借取超过存入的资金。每种攻击类型都是实现这一目标的技术。\r\n\r\n## 预言机攻击\r\n\r\n在这种类型的攻击中，目标是相同的——借取超过存入的资金。但在这一分类中，攻击者试图让协议认为存入的价值较高，或借入的价值较低。这是一个成功的例子：如果攻击者存入 1000 美元，但通过预言机操控让协议认为存入了 5000 美元。这将允许借取 3000 美元，而 LTV 检查将通过。\r\n\r\n最明显的问题发生在协议通过 getReserves() 或 balanceOf() 从 Uniswap 交易对获取价格时。在大多数情况下，这是一个警告信号。即使是初学者黑客也知道很容易借助闪电贷设定任何价格：无论是非常高还是极低。只有非常老旧的项目犯这样的错误，或者流动性低的骗局项目。\r\n\r\n但是，在分析最大的借贷黑客案例时，你可能会发现错定价的资产是 LP 代币或在金库中的份额。比如以 Warp Finance 作为例子。[https://rekt.news/warp-finance-rekt/](https://rekt.news/warp-finance-rekt/)\r\n\r\nWarp Finance 允许将 LP 代币作为抵押品。LP 代币通常流动性较低，因此协议引入了一些逻辑来定价这些代币。\r\n\r\n在 Warp 中，团队计算 LP 代币价格为 \\[Pair TVL\\] / \\[LP tokens minted\\]。这听起来相当合理，但对 Uniswap 交易对来说却是个坏主意。Uniswap 交易对保持 k 的常量，但 TVL 未必会保持不变。\r\n\r\nTVL 的公式是：TVL = (reserve0 \\* price0) + (reserve1 \\* price1)。团队采用了安全的价格来源（TWAP）。此外，k 始终是常量，但整个 TVL 收益可能会在发生大额交换时剧烈波动。\r\n\r\n![](https://img.learnblockchain.cn/2025/03/09/image.png)\r\n\r\n来源：[https://cmichel.io/pricing-lp-tokens/](https://cmichel.io/pricing-lp-tokens/)\r\n\r\n所以，事情是这样的——黑客借了闪电贷，操控了交易对的 TVL 计算，影响了 LP 代币的价值。\r\n\r\n这个问题在这里被完美地阐明：\r\n\r\n[https://cmichel.io/pricing-lp-tokens/](https://cmichel.io/pricing-lp-tokens/)\r\n\r\n在 Yearn 接受金库份额的借贷项目中，你可以找到同样的思路，但步骤更复杂。我们以 CREAM 为例。CREAM 经历了许多次攻击，其中之一与 yUSD 有关——一个金库份额，是 Curve 上简单稳定币策略的 LP 代币。\r\n\r\n[https://mudit.blog/cream-hack-analysis/](https://mudit.blog/cream-hack-analysis/)\r\n\r\nCREAM 使用 yUSD.pricePerShare() 来获取 yUSD 的价值。函数逻辑是 \\[TotalUnderlyingInPool\\] / \\[TotalSupplyShares\\]。操控此公式的唯一方法是增加 TotalUnderlyingInPool。乍一看，这似乎是单向操作——任何人都可以将代币转入金库，但似乎没有人能从金库提取代币，因此这一操作没有太大意义。但事实并非如此。有人可以借取数百万以将资金存入 Yearn，成为最大的 Yearn 金库投资者，从而随时提取按比例的代币份额。所以，这些前提条件允许任何人操控 pricePerShare() 的返回值。\r\n\r\n检查一些其他基于错误代币评估的黑客攻击：\r\n\r\n- Inverse Finance\r\n\r\n[https://halborn.com/explained-the-inverse-finance-hack-june-2022/](https://halborn.com/explained-the-inverse-finance-hack-june-2022/)\r\n- Cheese Bank\r\n\r\n[https://learnblockchain.cn/article/12431](https://learnblockchain.cn/article/12431)\r\n\r\n审计时的建议：\r\n\r\n1. 严格检查所有代币的价格来源——你应该确保公式中的任何元素都无法被操控。\r\n2. 使用 Chainlink 预言机。\r\n3. 当 Chainlink 价格不可用时使用 TWAP（但在某些情况下，这是糟糕的建议，请参见下章）。\r\n\r\n## 关于使用 TWAP 作为价格来源\r\n\r\nTWAP 的价格在一个交易和块中难以被操控。然而，成为原子性质并不是攻击者的要求。TWAP 仅仅是一个使用链上来源的公式，攻击 TWAP 的时间和成本都是问题。\r\n\r\n这里有一篇研究 TWAP 攻击成本的文章。\r\n\r\n[https://eprint.iacr.org/2022/445.pdf](https://eprint.iacr.org/2022/445.pdf)\r\n\r\n总的来说，低流动性代币的 TWAP 攻击可能是有利可图的。\r\n\r\n让我们看看 Inverse Finance 攻击的例子：\r\n\r\n[https://twitter.com/FrankResearcher/status/1510239094777032713?s=20&t=RBNXo-6wEDCiBE5a9nO0-Q](https://twitter.com/FrankResearcher/status/1510239094777032713?s=20&t=RBNXo-6wEDCiBE5a9nO0-Q)\r\n\r\n在这次攻击中，没有使用闪电贷，攻击者必须使用自己持有的 901 ETH。这种攻击并不像所有人都能访问，但对某些 DeFi 用户来说仍然是一个选项。以 500 ETH 的成本改变抵押品的价值，借取 1500 萬美元，而仅存入 65 万美元的 INV 代币。\r\n\r\n相同的黑客攻击也发生在 Moola 上。\r\n\r\n[https://www.coindesk.com/markets/2022/10/19/celo-protocol-moola-market-loses-over-10m-in-market-manipulation-attack/](https://www.coindesk.com/markets/2022/10/19/celo-protocol-moola-market-loses-over-10m-in-market-manipulation-attack/)\r\n\r\n看看价格图表——这是 TWAP 操控随时间发生的良好表示。\r\n\r\n![](https://img.learnblockchain.cn/2025/03/09/image.png)\r\n\r\n所以，请注意，使用 TWAP 并不总是有帮助的。但在没有更好的价格来源可用时，有时是必要的。在这种情况下，攻击的成本必须要考虑。当攻击成本高于潜在收益时，任何 TWAP 攻击将变得没有利润。\r\n\r\n此外，TWAP 在不同的上下文中可能会以不同的方式工作。例如，上述 Warp Finance 正确使用了 TWAP，用于流动性较大的交易对（ETH/DAI）。但是 Warp Finance 用 TWAP 来计算 LP 代币的价值。储备仍然受到操控，整体 TVL 计算（基于储备 \\* 价格）也一样。\r\n\r\n## 重入与可Hook代币\r\n\r\n这是最常见的黑客类型之一。\r\n\r\n当协议中的某一个代币是可Hook时，它就会发生。\r\n\r\n想象一个协议，它接受 USD 作为抵押，并允许以 hookUSD（带钩）借款。\r\n\r\n可Hook代币在大多数情况下遵循 ERC-777 标准：\r\n\r\n[https://eips.ethereum.org/EIPS/eip-777](https://eips.ethereum.org/EIPS/eip-777)\r\n\r\n它的转账函数包括三个步骤：\r\n\r\n- 在余额变化之前调用代币发送者\r\n- 应用余额变化\r\n- 在余额变化之后调用代币接收者\r\n\r\n这些调用（Hook）都是可选的，调用接收者必须允许这些调用。在我们的情况下——攻击者肯定会允许这些调用给代币发送者。\r\n\r\n没有攻击的流程将如下工作：\r\n\r\n![](https://img.learnblockchain.cn/2025/03/09/image.png)\r\n\r\n在Hook之后，攻击者可以再次调用任何协议函数。目标是绕过 LTV 检查。因此，攻击者在Hook期间再次调用借款。第一次借款调用仍未完成，代币转账的余额也没有改变。因此，LTV 检查将通过，因为协议尚未转移任何代币，由此攻击者仍然没有借入任何资金（如果观察账户余额）。\r\n\r\n![](https://img.learnblockchain.cn/2025/03/09/image.png)\r\n\r\n通过这种方式，任何与借款调用的Hook都可以绕过多个 LTV 检查。在所有Hook之后，余额的级联变化发生，黑客将看到 700 \\* （Hook数量）的余额。\r\n\r\n这是使用可Hook代币进行黑客攻击的最简单示例。\r\n\r\n在实践中，它们可能具有不同的形式。检查一些选择的示例列表以及详细的黑客描述：\r\n\r\n- CREAM 黑客事件\r\n\r\n[https://blog.merklescience.com/hacktrack/hack-track-analysis-of-cream-finance-hack](https://blog.merklescience.com/hacktrack/hack-track-analysis-of-cream-finance-hack)\r\n- Fei Rari（发送 ETH 的Hook）\r\n\r\n[https://www.certik.com/resources/blog/6LiXVtPQ8q5AQfqOUPnTOS-revisiting-fei-protocol-incident](https://www.certik.com/resources/blog/6LiXVtPQ8q5AQfqOUPnTOS-revisiting-fei-protocol-incident)\r\n- Ola Finance\r\n\r\n[https://twitter.com/peckshield/status/1509431646818234369](https://twitter.com/peckshield/status/1509431646818234369)\r\n- Aagave\r\n\r\n[https://rekt.news/agave-hundred-rekt/](https://rekt.news/agave-hundred-rekt/)\r\n- Hundred Finance\r\n\r\n[https://rekt.news/agave-hundred-rekt/](https://rekt.news/agave-hundred-rekt/)\r\n- [Lendf.me](http://lendf.me/)\r\n\r\n[https://learnblockchain.cn/article/12430](https://learnblockchain.cn/article/12430)\r\n\r\n审计时的建议：\r\n\r\n1. 观察代码时要假设所有转移的代币都有可能是可Hook的（这将有助于识别脆弱点）。\r\n2. 建议客户完全避免使用可Hook代币。\r\n3. 请记住，在某些情况下，ETH 转账可能会成为Hook。\r\n4. 坚持遵循检查-效应-交互模式（但并不总能帮助所有情况）。\r\n5. 重入保护可能是一个好选择。\r\n\r\n## 总结\r\n\r\n在本文中，我们对借贷协议近年来遇到的主要安全事件进行了分类。深度分析的两个关键点是 1) 预言机和 2) 列出的代币。特别关注这些向量在审计过程中是努力的完美投资。\r\n\r\n- 谁是 MixBytes？\r\n\r\n\r\n[MixBytes](https://mixbytes.io/) 是一个由专家区块链审计员和安全研究员组成的团队，专注于为 EVM 兼容和 Substrate 基础的项目提供全面的智能合约审计和技术咨询服务。请加入我们，在 [X](https://twitter.com/MixBytes) 上保持对最新行业动态和见解的了解。\r\n\r\n>- 原文链接： [mixbytes.io/blog/vulnera...](https://mixbytes.io/blog/vulnerable-spots-of-lending-protocols)\r\n>- 登链社区 AI 助手，为大家转译优秀英文文章，如有翻译不通的地方，还请包涵～"},"author":{"user":"https://learnblockchain.cn/people/24680","address":null},"history":null,"timestamp":1741496467,"version":1}