💸 闪电贷攻击:破坏 Solidity 智能合约

本文深入探讨了 DeFi 中的闪电贷,这是一种无需抵押的即时贷款工具,但需要在同一笔交易中偿还。文章详细解释了闪电贷的工作原理、攻击模式,并通过实例展示了如何利用闪电贷操纵价格和漏洞智能合约,导致重大损失。此外,文章还提供了应对闪电贷攻击的缓解策略,包括使用可靠的预言机、实施时间加权平均价格等。

1. 介绍

如果你曾经从银行获得过传统贷款,你就会知道其中的流程——你提供抵押品,签署文件,并在几个月或几年内偿还。但在 DeFi (去中心化金融) 中,情况却大相径庭。进入 闪电贷 的世界——这是一项引人入胜的发明,你可以 立即借到数百万美元,无需抵押品,只要你在同一笔交易中偿还即可

听起来很疯狂,对吧?但这是可能的,因为 以太坊虚拟机 (EVM) 的工作方式:每笔交易都是 原子性的 ——这意味着要么完全发生,要么根本不发生。因此,如果你未能在交易结束前偿还借款,那么整个过程就会恢复原状,就像什么都没发生过一样。

这种机制使闪电贷成为一种 强大的工具。交易者使用它们来进行套利机会(在一个交易所低买,在另一个交易所高卖),开发者使用它们来进行清算或复杂的金融操作——所有这些都无需前期资本。

但这里也有不利的一面:攻击者也喜欢闪电贷。为什么?因为他们可以使用巨额借款来:

  • 操纵价格(欺骗协议,使其认为资产的价值高于或低于其实际价值)。
  • 利用薄弱的智能合约(这些合约没有正确检查输入)。
  • 以压倒性的临时力量耗尽流动性池或治理系统

在过去的几年里,闪电贷攻击已经导致了像 bZx、PancakeBunny 和 Harvest Finance 这样的 DeFi 协议 损失数亿美元

🚀 本博客的目标不仅仅是给你理论,而是要 一步一步地带你了解闪电贷攻击的实际运作方式——这样,无论你是开发者还是安全爱好者,你都会知道如何发现和防御它们。

2. 什么是闪电贷?

从核心上讲,闪电贷 是一种 无抵押贷款,你必须 在同一笔交易中偿还。与你锁定抵押品的传统贷款不同,闪电贷利用了以太坊等区块链的一个特殊属性:原子性

原子性意味着以太坊虚拟机 (EVM) 上的交易要么:

  • 完全执行(每个步骤都成功),或者
  • 失败并恢复原状(就像什么都没发生过一样)。

这个属性使闪电贷成为可能。以下是它们的工作方式:

⚙️ 闪电贷的逐步流程

借款

  • 用户从支持闪电贷的流动性池请求大量代币(例如,10,000 ETH)。
  • 不需要抵押品。

执行

  • 有了借来的代币,用户可以在同一笔交易中执行任意操作。
  • 示例:套利、清算、价格操纵、抵押品互换。

偿还

  • 在交易结束时,用户必须偿还借款金额 加上少量费用
  • 如果没有偿还,交易将 失败并恢复原状,这意味着池永远不会损失资金。

🖥️ 这在 EVM 中是如何运作的

将闪电贷想象成被包裹在 单笔交易 中。在 EVM 层面:

  • 一个智能合约(比如 Aave 的借贷池)暂时发放代币。
  • EVM 会跟踪交易期间的所有状态变化。
  • 在交易完成之前,借贷合约会检查:
  • “我是否得到了我的代币 + 费用?”
  • 如果是 ✅ → 交易被确认。
  • 如果不是 ❌ → 整个交易将自动回滚。

这使得它对 贷方来说是无风险的,但对借款人来说非常强大。

🌐 提供闪电贷的平台

几个主要的 DeFi 平台推广了闪电贷:

  • Aave → 第一个提供闪电贷的主流协议,广泛用于套利和清算。
  • DyDx → 通过其保证金交易合约提供闪电贷。
  • Uniswap (闪电互换) → 允许你预先提取代币,并在交易中稍后支付(通过偿还或提供对应的资产)。

每个平台都有稍微不同的机制,但底层原则——借款 → 执行 → 在一笔交易中偿还——保持不变。

3. 闪电贷攻击基础

到目前为止,我们已经看到 闪电贷本身并没有恶意 ——它们只是一种工具。但像任何工具一样,在错误的人手中,它们可能被用于破坏性目的。当攻击者通过闪电贷借入大量代币,并利用这种临时的力量来 操纵一个易受攻击的 DeFi 协议的逻辑 时,就会发生 闪电贷攻击

⚡ 为什么闪电贷攻击是可能的?

大多数 DeFi 协议的设计都基于以下假设:

  • 市场价格相对稳定。
  • 流动性变化是渐进的。
  • 没有哪个用户可以突然立即转移数百万美元。

闪电贷打破了所有这些假设。在一个原子交易中,攻击者可以控制巨大的流动性,冲击代币的市场价格,或者压倒治理——然后返还资金,就像什么都没发生过一样。

这为利用创造了一个完美的设置。

🕸️ 常见的闪电贷攻击模式

让我们来看看攻击者最常使用的模式:

价格预言机操纵

  • 一些协议直接依赖于来自 DEX 池(如 Uniswap)的 链上价格
  • 攻击者可以借入一大笔钱,操纵流动性池,欺骗协议,使其相信该资产更有价值或毫无价值。
  • 然后,他们利用这个错误的价格(例如,借入定价过低的资产或清算其他资产)。

带有闪电贷的重入攻击

  • 闪电贷可以增强经典的 重入攻击
  • 攻击者借款,在状态更新之前重复调用一个易受攻击的函数,并耗尽资金——然后在最后偿还贷款。

套利利用

  • 合法的套利利用了跨市场的价格差异。
  • 攻击者通过将闪电贷与操纵结合起来,扭曲了这一点,迫使出现人为的套利机会(例如,抬高一个池子,在另一个池子抛售)。

流动性池耗尽

  • 通过操纵池子的储备金,攻击者可以迫使协议发放比他们应该发放的更多(例如,定价过低的抵押品,过多的奖励代币)。
  • 本质上是“吸取”池子中的价值,在单笔交易中。

💥 现实世界中的闪电贷攻击

一些著名的事件表明了这些攻击的破坏性:

  • bZx 协议 (2020) → 第一批大型闪电贷攻击之一。攻击者操纵了基于 Uniswap 的价格预言机,窃取了约 350,000 美元的 ETH。
  • Harvest Finance (2020) → 攻击者通过使用闪电贷操纵稳定币池耗尽了约 2400 万美元。
  • PancakeBunny (2021) → 通过 PancakeSwap 池对 BUNNY 代币进行价格操纵攻击,造成约 4500 万美元的损失。
  • Cream Finance (2021) → 闪电贷 + 预言机操纵 + 重入攻击相结合,导致损失超过 1 亿美元。

这些案例都遵循了相同的公式:使用借来的流动性 → 操纵一个薄弱点 → 提取利润 → 偿还贷款。

闪电贷攻击不是关于“直接偷钱”。它们是关于 暂时成为房间里最富有的人 并利用这种力量将协议规则弯曲成对你有利的角度——然后在悄无声息地离开

4.一步一步的闪电贷攻击演练:从借款到利用和偿还 - 带有 Foundry 测试的 Solidity PoC

1. 易受攻击的合约示例 (Solidity)

假设我们有一个 DEX 池,它有一个糟糕的价格预言机(只是使用代币余额,可以操纵),还有一个 vault,允许任何人存入某种代币,并根据价格提取。这个 vault 使用可操纵的池价格计算价值。

2. 攻击者合约示例 (Solidity)

简化的 DEX 闪电贷提供者接口

3. Foundry 测试示例

4. 带注释的交易流程

  1. 攻击者请求目标代币的闪电贷(例如,立即获得 1000 个代币)。
  2. 攻击者使用闪电贷在 DEX 上交换大量代币,人为地抬高价格。
  3. 攻击者将闪电贷的代币存入易受攻击的 vault,该 vault 现在使用被操纵的 DEX 价格高估代币。
  4. Vault 向攻击者支付过多的稳定币。
  5. 攻击者用超额支付的稳定币偿还闪电贷。
  6. 剩余的稳定币(夸大的利润)由攻击者保留——所有步骤都在一个原子交易中发生。

每个部分的关键注释

  • 易受攻击的代码:使用链上、可操纵的价格预言机——永远不要直接使用 LP 代币余额来定价!
  • 攻击者合约:捆绑所有逻辑:借款、操纵、耗尽利润,然后偿还贷款。
  • Foundry 测试:使读者可以轻松地在安全环境中复制该攻击并确认该漏洞。

5. 闪电贷攻击的代码概念验证(PoC)

适用于 Foundry/Hardhat 环境的带有解释的最小 Solidity 示例

概述

此示例分 3 步捕获闪电贷攻击的本质:

  • 第 1 步:借入闪电贷
  • 第 2 步:使用借来的资产来操纵价格或调用易受攻击的函数
  • 第 3 步: 偿还贷款并提取利润

第 1 步:闪电贷借款接口(示例提供者)

第 2 步:脆弱的协议合约(简化)

第 3 步:攻击者合约(借款、利用、偿还)

交易流程说明

  • 攻击者调用 executeAttack 请求代币的闪电贷。
  • 贷款提供者转移代币并立即调用攻击者的回调 onFlashLoan
  • 在回调内部,攻击者:
    • 批准并将借来的代币存入易受攻击的协议中。
    • 由于存在缺陷的逻辑,易受攻击的协议会向攻击者记入双倍的代币。
    • 攻击者提取膨胀的代币数量。
    • 然后用原始借入金额偿还闪电贷。
    • 由于该漏洞,剩余的代币是纯利润。

部署和测试设置

  • 在 Foundry 或 Hardhat 中将代币设置为 ERC20 模拟。
  • 部署易受攻击的合约并模拟闪电贷提供者。
  • 部署攻击者合约,其中包含对这些合约的引用。
  • 测试完整流程以查看攻击者的余额增加,而没有初始资金。

6. 为什么闪电贷攻击会奏效

  • EVM 原子性(全有或全无执行):

以太坊虚拟机 (EVM) 保证单笔交易中的所有操作要么成功完成,要么完全恢复原状。这种原子性质支持闪电贷,用户可以在其中借入大量资金、执行操作并在一次交易中偿还贷款。如果未能偿还,则整个交易将恢复原状,就像从未发生过一样。这种独特的属性允许攻击者在没有前期资本的情况下执行多个复杂操作,对他们自己来说是无风险的,但可能会损害目标协议。

  • 缺少或薄弱的协议检查:

许多协议缺乏必要的保护措施,例如延迟的预言机更新或在交易期间验证资产价格完整性的机制。如果没有这些,攻击者可以暂时操纵内部状态或价格参考,并在状态最终确定之前利用这些不一致之处。

  • 过度依赖外部价格馈送或原始预言机:

协议通常依赖价格预言机来确定资产估值。如果这些预言机依赖于单一来源(例如可以轻松操纵的去中心化交易所池),攻击者会在其闪电贷交易期间执行价格操纵来欺骗协议。这种脆弱性让攻击者可以在基于这些已损坏价值借入、铸造或清算资产之前人为地抬高或降低资产价格。

7. 缓解策略

  • 使用可靠的去中心化预言机:

集成像 Chainlink 这样的预言机,它可以聚合多个数据源并提供防篡改的价格馈送,从而降低闪电贷期间价格操纵的风险。

  • 实施时间加权平均价格 (TWAP):

TWAP 预言机在特定的时间窗口内计算价格,而不是依赖于瞬时现货价格,从而平滑了闪电贷旨在利用的突然峰值或下跌。

  • 添加滑点和健全性检查:

包括约束以拒绝具有巨大价格影响或交易量的异常交易或贷款,从而防止超出预期范围的突然协议状态更改。

  • 限制敏感操作中的闪电贷使用:

设计具有闪电贷意识的智能合约函数。例如,限制闪电贷参与或要求对清算或抵押品估值等关键函数进行额外验证。

  • 定期审计和安全检查清单:

开发人员和安全研究人员应维护全面的审计实践,重点关注预言机完整性、重入、输入验证和经济攻击向量。安全检查清单应包括使用模拟闪电贷场景进行测试,以便及早发现漏洞。

8. 结论

闪电贷是去中心化金融 (DeFi) 中强大而创新的金融工具,可以在单笔区块链交易中实现即时、无抵押的借款。它们为套利、自动化清算和高效的资本利用开辟了途径,使 DeFi 更加动态和易于访问。

但是,闪电贷本身并非本质上是恶意的——只有当协议未能充分防范操纵时,风险才会出现。开发人员必须主动设计和审计智能合约,以防御价格预言机操纵和攻击者使用闪电贷利用的逻辑缺陷等漏洞。

对于读者和崭露头角的安全研究人员,强烈建议在 Foundry 或 Hardhat 等安全环境中尝试概念验证 (PoC),以加深对 DeFi 中攻击和防御的理解。

请继续关注我们未来的帖子,我们将在其中探讨其他关键的 DeFi 攻击向量,例如价格预言机攻击、夹层攻击和治理利用,帮助你构建在此快速发展的生态系统中保护去中心化应用程序所需的知识和技能。

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

0 条评论

请先 登录 后评论
blockmagnates
blockmagnates
The New Crypto Publication on The Block