DeFi 协议管理着大量资产,但智能合约的不可变性使其成为黑客攻击的目标。常见的攻击包括重入攻击、整数溢出、访问控制漏洞、预言机操纵和闪电贷攻击。防范措施包括代码审计、安全工具、经济模型优化以及用户安全教育。随着DeFi规模扩大,提升安全水平,平衡创新与安全至关重要。
DeFi 协议管理着数百亿美元的资产,但其开放性也带来了独特的安全挑战。从 2016 年的 The DAO(重入攻击,$60M)到 2022 年的 Ronin Bridge(跨链桥权限管理不当,$625M),再到 2023 年的 Euler Finance(闪电贷攻击,$197M)、Multichain( 跨链桥漏洞,$126M)以及 2025 年初的 Bybit(多签签名欺骗,$1.5B),DeFi 领域持续面临严峻的安全威胁,累计损失已超过数百亿美元。
DeFi 的安全威胁与传统软件系统有本质区别:
代码公开透明:智能合约代码完全公开,攻击者可以充分研究代码逻辑,寻找任何可能的漏洞。一旦发现漏洞,可以编写自动化脚本立即发起攻击。
不可逆性:智能合约一旦部署就难以修改,且由于区块链的不可逆性,资产一旦被盗几乎无法追回。
可组合性风险:协议间的可组合性带来便利,但也放大了风险。一个协议的漏洞可能影响依赖它的所有其他协议。例如,某个借贷协议使用的预言机出现问题,可能导致多个依赖该价格的协议被攻击。
理解 DeFi 的安全风险、攻击手法和防护措施,对于开发者和用户来说都至关重要。本章将重点介绍几种最常见的 DeFi 攻击方式。
什么是重入
重入(Reentrancy)是指在一个函数执行完成之前,该函数被再次调用的现象。
在智能合约中,当合约 A 向外部地址转账 ETH 时(如使用 call() 函数转账),如果目标是另一个合约 B,那么合约 B 的 receive() 或 fallback() 函数会被触发执行。在这个函数中,合约 B 可以再次调用合约 A 的函数,形成"重入"。

攻击统计调用流程示例:
1. 用户调用合约 A 的 withdraw() 函数
2. withdraw() 向用户地址转账
3. 如果用户是合约 B,B 的 receive() 被触发
4. receive() 中再次调用合约 A 的 withdraw()
5. 此时回到步骤 2,但合约 A 的余额可能还未更新
6. 重复提取资金
正常情况下,如果合约 A 在转账前先更新了余额,重入就不会造成问题。但如果余额更新在转账之后,攻击者就可以利用重入来重复提取资金。
典型的漏洞代码模式:
function withdraw() public {
uint amount = balances[msg.sender];
// ❌ 漏洞:先转账,后更新状态
msg.sender.call{value: amount}(""); // 调用 receive()
balances[msg.sender] = 0; // 状态更新在转账之后
}
攻击者的合约可以在 receive() 函数中再次调用 withdraw(),由于余额尚未清零,可以重复提取资金。
真实案例:The DAO 攻击(2016年)
2016 年 6 月,The DAO 项目遭受重入攻击,成为以太坊历史上最著名的安全事件。
splitDAO 函数存在重入漏洞。该函数在转账后才更新用户余额,攻击者反复调用该函数,在单笔交易中多次提取资金防护措施
现代智能合约开发已建立了完善的防护模式:
Checks-Effects-Interactions 模式:先检查条件、再更新状态、最后与外部交互
function withdraw() public {
uint amount = balances[msg.sender];
require(amount > 0, "No balance");
balances[msg.sender] = 0; // ✓ 先更新状态
msg.sender.call{value: amount}(""); // 后外部调用
}
重入锁(ReentrancyGuard):使用 OpenZeppelin 的标准库
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
function withdraw() public nonReentrant { // 函数逻辑 }
## 价格操纵
价格操纵是指攻击者通过各种手段人为改变资产价格,然后利用被操纵的价格在 DeFi 协议中获利。DeFi 协议依赖价格数据进行借贷抵押率计算、清算触发、衍生品定价等关键操作,如果价格被操纵,协议就会做出错误的决策。
最常见的价格操纵方式是利用价格来源的缺陷。早期许多协议直接使用单一 DEX 的即时价格,攻击者可以通过大额交易短暂改变价格,在协议中完成操作后再恢复价格。
早期常见的漏洞设计:
```solidity
// ❌ 漏洞:直接使用 DEX 即时价格
function getPrice() public view returns (uint) {
uint reserve0 = pair.reserve0();
uint reserve1 = pair.reserve1();
return reserve1 / reserve0; // 即时价格,易被操纵
}
典型的价格操纵攻击流程:
整个过程在一个区块内完成,成本仅为 Gas 费和手续费。
案例:Harvest Finance 攻击(2020年)
2020 年 10 月,Harvest Finance 遭受价格操纵攻击。
案例:Mango Markets 攻击(2022年)
2022 年 10 月,Solana 上的去中心化交易平台 Mango Markets 遭受价格操纵攻击。
防护措施
现代 DeFi 协议采用多层防护:
时间加权平均价格(TWAP):使用一段时间内的平均价格,而非即时价格
// Uniswap V2 TWAP 示例
uint32 blockTimestamp = uint32(block.timestamp % 2**32);
uint32 timeElapsed = blockTimestamp - blockTimestampLast;
price0Average = FixedPoint.uq112x112(
uint224((price0Cumulative - price0CumulativeLast) / timeElapsed)
);
多数据源聚合:使用 Chainlink 等专业预言机服务,聚合多个独立数据源,避免依赖单一价格来源
价格变动限制:设置单次更新的最大变动幅度,异常波动时暂停操作
延迟更新机制:关键操作(如清算、铸造)使用延迟价格,给套利者时间纠正异常价格
闪电贷(Flash Loan)是 DeFi 的创新金融工具,最初由 Aave引入,后被大多数借贷协议采用(如 dYdX、Uniswap V2 等)。它允许用户在单个交易内借入大量资金而无需抵押,只要在交易结束前归还即可。如果交易执行失败或未归还资金,整个交易会回滚。
闪电贷本身是中性的金融工具,但它为攻击者提供了巨大的资金杠杆,能够放大其他漏洞的影响。攻击者无需任何初始资金,只需支付少量手续费,就能调动数千万甚至上亿美元的资金。
典型的闪电贷攻击流程:
1. 从 Aave/dYdX 借入大量资产(如 1 亿 USDC)
2. 执行攻击操作:
- 操纵 DEX 价格
- 利用协议漏洞
- 触发异常清算
3. 从攻击中获利(如借出 1.1 亿 USDC 等值资产)
4. 归还闪电贷本金 + 手续费
5. 保留利润

整个过程在一个原子交易中完成,要么全部成功,要么全部回滚。
真实案例:bZx 攻击(2020年)
2020 年 2 月,去中心化借贷协议 bZx 连续遭受两次闪电贷攻击。
第一次攻击(2月15日):
第二次攻击(2月18日):
案例:Cream Finance 攻击(2021年)
2021 年 10 月,Cream Finance 遭受史上最大的闪电贷攻击之一。
防护措施
无法直接禁止闪电贷(它们是开放金融的一部分),但可以通过以下方式降低风险:
使用可靠的预言机:避免依赖单一 DEX 的即时价格,使用 TWAP 或 Chainlink
限制单笔交易影响:设置单笔交易对协议状态的最大影响范围
多区块操作:关键操作(如大额借贷、清算)需要分多个区块完成
异常检测:实时监控异常大额交易和价格波动,自动暂停协议
审慎的资产支持:对于支持的抵押资产,特别是 LP 代币、收益代币等派生资产,需要仔细审查其定价机制
许多 DeFi 协议采用链上治理机制,代币持有者可以通过投票决定协议的关键参数、合约升级、资金分配等事项。如果攻击者能够获得足够的治理代币(通常需要超过法定人数或多数票),就可以通过恶意提案控制协议。
治理攻击的两种主要方式:
案例:Beanstalk Farms 攻击(2022年)
Beanstalk 是一个算法稳定币协议,采用完全链上治理,STALK 代币持有者可以通过投票决定协议升级 2022 年 4 月,算法稳定币协议 Beanstalk Farms 遭受了治理攻击。
由于 Beanstalk 没有时间锁,攻击者可以在一个交易内完成闪电贷和治理投票,导致了严重的损失。
现代治理机制的标准防护措施:
投票权快照(Snapshot):在提案创建时记录代币持有情况,防止闪电贷投票
function propose() public returns (uint) {
uint votingPower = getPriorVotes(msg.sender, block.number - 1);
// 使用历史区块的投票权,而非当前区块
}
时间锁(Timelock):提案通过后延迟执行(通常 2-7 天),给社区反应时间
// Compound、Uniswap 等使用的 7 天时间锁
uint public constant DELAY = 7 days;
function executeProposal(uint proposalId) public { require(block.timestamp >= proposal.eta, "Timelock not expired"); // 执行提案 }
3. **合理的提案门槛**:
- 提案创建:需要持有总供应量的 1-2%
- 法定人数:需要至少 4-10% 的代币参与投票
- 通过阈值:需要 50-66% 的票数支持
4. **多签紧急停止**:由多签控制的紧急暂停机制,可在发现恶意提案时立即中止
5. **治理守护者(Guardian)**:具有否决权的多签地址,可以否决明显恶意的提案
6. **分级治理**:重要决策需要更高的门槛和更长的时间锁
## MEV
区块链的透明性使得交易在被打包进区块前就对外可见(在内存池 mempool 中)。攻击者(通常称为 MEV 搜索机器人)可以实时监控待处理的交易,通过支付更高的 Gas 费或直接与验证者合作,让自己的交易优先执行,从中获利。
这种行为被称为 **MEV(Maximal Extractable Value,最大可提取价值)**,之前称为 Miner Extractable Value(矿工可提取价值),在[以太坊](https://learnblockchain.cn/learn/21)转向 PoS 后改为 Maximal Extractable Value。
MEV 严格来说不是一种攻击,而是获利方式,但是当套利机器人套利的对象是我们时,我们也可以认为是被 MEV 攻击了。
MEV 的主要形式:
**1. 抢跑(Front-running)**
机器人检测到有利可图的交易,提交相似交易并支付更高 Gas 费,让自己的交易先执行。
**场景 1:清算抢跑**
场景 2:NFT 抢购
1. 某个热门 NFT 项目开启公开销售
2. 用户提交购买交易
3. MEV 机器人检测到 mempool 中的购买交易
4. 机器人立即提交相同的购买请求,支付极高 Gas 费(有时高达几十 ETH)
5. 机器人抢先购得 NFT
2. 三明治攻击(Sandwich Attack)
在目标交易前后各插入一笔交易,这是 MEV 中最常见的攻击方式:
交易 1(机器人):买入资产,推高价格
交易 2(受害者):按更差的价格成交
交易 3(机器人):卖出资产,获利
以下是三明治攻击的运作方式示意:

以下是在 Uniswap 上使用 Ampleforth 的治理代币 (FORTH) 发生的三明治攻击的实际案例:

3. 后跑(Back-running)
在目标交易之后立即执行交易,利用目标交易造成的市场状态变化获利。
场景 1:DEX 套利
1. Uniswap 上有用户执行大额交易,将 ETH/USDC 价格从 2000 推高至 2005
2. MEV 机器人检测到这笔交易
3. 机器人在该交易后立即执行套利:
- 在 Uniswap 以 2005 价格卖出 ETH
- 在 Sushiswap 以 2000 价格买入 ETH
- 获得价差利润
场景 2:预言机套利
1. Chainlink 预言机更新 ETH 价格从 2000 提升到 2010
2. MEV 机器人检测到预言机更新交易
3. 机器人在更新交易后立即执行:
- 在依赖该预言机的 DEX 中,按旧价格买入 ETH
- 在其他市场按新价格卖出
- 获得价差利润
4. 清算狙击
监控借贷协议中接近清算线的仓位,一旦可以清算就立即抢先执行,获得清算奖励。
案例 1:jaredfromsubway.eth(2023年)
2023 年,一个名为 "jaredfromsubway.eth" 的 MEV 机器人成为以太坊上最活跃的三明治攻击者。
案例 2:0xbadc0de MEV 机器人(2021年)
2021 年,一个清算机器人在单笔交易中获利 670 万美元。
用户在 DEX 交易时,三明治攻击会导致:
MEV 保护方案的演进
2021-2024 年间,以太坊上提取的 MEV 总价值超过 10 亿美元。为应对日益严重的 MEV 攻击,DeFi 生态演化出多种保护方案:
1. Flashbots MEV-Boost
2022 年推出,将 MEV 提取透明化和民主化。验证者可以通过 MEV-Boost 接收来自多个构建者(Builder)的区块提案,选择最优方案。这使得 MEV 价值能够部分回流给验证者和用户,而非完全被机器人获取。
2. CoW Swap 批量拍卖
将一个区块内的所有交易收集后统一定价执行,消除了交易顺序的影响。用户提交意图(Intent)而非直接交易,求解器(Solver)在链下计算最优执行路径。通过批量撮合,CoW Swap 能够提供优于传统 AMM 的价格,同时避免三明治攻击。
3. 1inch Fusion 私有订单流
订单不广播到公开内存池,而是直接发送给可信的解析器(Resolver)网络,避免被 MEV Bot 监控。解析器竞争提供最优执行价格,用户无需担心被抢跑或三明治攻击。
4. Uniswap X
类似 1inch Fusion,将交易路由外包给专业的填充者(Filler),在链下竞争最优价格。填充者承担执行风险,用户只需签署意图,无需支付 Gas 费(除非交易失败)。
5. JIT(Just-In-Time)流动性攻击防护
除了传统的三明治攻击,市场还出现了 JIT 流动性攻击等新手法:MEV Bot 在大额交易前瞬间添加流动性,交易后立即撤出,赚取手续费的同时避免无常损失风险。这使得 MEV 保护成为现代 DEX 设计的重要考量,部分协议开始限制单区块内的流动性变动或采用延迟生效机制。
用户层面的防护措施:
使用私密交易池:Flashbots Protect、MEV Blocker 等服务隐藏交易,直接发送给验证者
传统流程:交易 → 公开 mempool → 被 MEV 机器人看到 → 被攻击
私密流程:交易 → 直接发送给验证者 → 不公开 → 避免攻击
设置严格的滑点保护:限制可接受的最大价格滑点(如 0.5%)
使用聚合器:1inch、Cowswap 等聚合器提供 MEV 保护
使用订单簿 DEX:dYdX、Vertex 等订单簿式 DEX 没有公开 mempool
以上是 DeFi 中最常见的几种攻击方式。除此之外,还有许多其他安全风险,例如跨链桥漏洞(Ronin Bridge $625M、Wormhole $326M)、用户层面的钓鱼攻击、私钥管理不当、代币授权滥用等,这些问题同样会造成严重损失,但本章不一一详述。
面对如此复杂的安全威胁,安全审计成为 DeFi 协议上线前的必要环节。
随着 DeFi 的发展,智能合约安全审计已成为项目上线的标准流程。专业的审计公司会对代码进行人工审查和自动化测试,识别潜在的安全问题。
主流的审计公司包括 Trail of Bits、OpenZeppelin、ConsenSys Diligence、CertiK、PeckShield、GoPlus 等。一次全面的审计通常需要数周时间,费用从数万到数十万美元不等。审计报告会列出发现的问题及其严重程度,项目方需要在上线前修复关键和高危问题。
但需要明确的是,审计不能保证绝对安全。审计只能发现已知的漏洞模式,新型的攻击方式或复杂的经济模型缺陷可能被遗漏。即使是经过多次审计的协议,也可能因为后续升级引入新问题或在实际运行中暴露问题。
除了人工审计,还有很多自动化安全工具可以辅助检测。Slither、Mythril 等静态分析工具可以扫描常见的代码模式问题。Echidna、Foundry 的模糊测试功能可以自动生成测试用例发现边界条件错误。Certora 等形式化验证工具可以数学证明代码的某些属性,提供更强的安全保证。
Bug Bounty(漏洞赏金计划)是另一种重要的安全机制。项目方在 Immunefi、HackerOne 等平台发布赏金,邀请白帽黑客测试系统安全。发现严重漏洞可以获得高额奖励(有时达到数百万美元),这激励了安全研究者持续关注协议安全,并倾向于负责任地披露漏洞而非利用漏洞攻击。
对于开发者,遵循安全开发规范可以大幅降低风险。使用经过验证的代码库(如 OpenZeppelin)而非自己实现基础功能,可以避免重复造轮子带来的风险。编写全面的单元测试和集成测试,覆盖各种边界情况和异常场景。使用静态分析工具在开发阶段就发现潜在问题。
代码应该保持简洁明了,避免过度复杂的逻辑。复杂的合约更容易隐藏漏洞,也更难审计。将系统拆分为多个职责单一的合约,降低单点风险。对外部调用保持警惕,假设外部合约可能是恶意的。
上线前进行充分的审计和测试。可以先在测试网运行一段时间,或以有限规模上线(设置资金上限),逐步放开限制。部署后持续监控协议运行状况,建立异常检测和紧急暂停机制。使用时间锁和多签控制关键操作,避免单点控制。
DeFi 的开放性带来了创新,也带来了独特的安全挑战。本章介绍了五种最常见的攻击方式:
这些攻击的共同特点是利用协议设计缺陷、价格来源漏洞、治理机制弱点或区块链透明性。防护措施包括使用 Checks-Effects-Interactions 模式、重入锁、TWAP 价格预言机、投票权快照、时间锁等。
安全审计是项目上线前的必要环节,但审计无法保证绝对安全。新型攻击方式、经济模型缺陷、升级引入的问题,都可能导致损失。漏洞赏金计划、形式化验证、实时监控等工具可以补充审计的不足。
从 2016 年的 The DAO 到 2025 年的 Bybit,DeFi 累计损失已超过数百亿美元。安全不是一次性达成的目标,而是需要持续投入的过程。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!