欢迎订阅专栏:10分钟智能合约:进阶实战
借贷池与预言机安全实战:Damn Vulnerable DeFi 深度解析
借贷池是 DeFi 的基石,而预言机则是连接链内外的“眼睛”。当这两者结合不当,便可能成为攻击者的黄金通道。本文将基于 Damn Vulnerable DeFi 的经典挑战,剖析借贷池与预言机交互中的致命漏洞,并给出实战防御方案。
一、借贷池的核心安全风险
借贷池(如 Aave、Compound)允许用户存入资产作为抵押,借出其他资产,但必须维持一定的抵押率。如果抵押品价值下跌至阈值以下,清算人可没收抵押品以偿还债务。
关键依赖:清算触发条件完全取决于预言机提供的资产价格。如果价格被操纵,借贷池将面临:
- 不当清算:用户被提前清算,造成损失。
- 坏账:抵押品价值虚高,导致实际不足以覆盖债务。
攻击者手段:闪电贷 + 价格操纵,在单笔交易中剧烈改变预言机读数,触发大规模清算,从而以极低成本拿走抵押品。
二、Damn Vulnerable DeFi 中的预言机挑战
DVD 提供了多个涉及借贷池和预言机安全的挑战,其中 Puppet 系列是经典代表。
1. Puppet:依赖 Uniswap V1 的瞬时价格
- 背景:存在一个借贷池,用户存入 ETH,可借出 DVT 代币。池子使用 Uniswap V1 ETH/DVT 交易对的瞬时价格作为预言机。
- 漏洞:Uniswap V1 价格可以在一笔交易内被闪电贷操纵,因为其储备是实时更新的。
- 攻击目标:你有 1 ETH 和 100 DVT,需要拯救池中所有的 DVT(约 100,000)。
攻击步骤:
- 闪电贷:从一个支持闪电贷的合约(如 dYdX)借入大量 ETH。
- 价格操纵:在 Uniswap V1 ETH/DVT 池中,用借来的 ETH 大量买入 DVT,使 ETH 储备暴增,DVT 储备锐减,从而使 DVT 价格暴跌(以 ETH 计价)。
- 触发清算:此时池子的预言机认为 DVT 价格极低,导致许多用户的抵押率不足。攻击者调用
liquidate函数,用少量 DVT 偿还债务,换取大量 ETH 抵押品。 - 归还闪电贷:用获得的 ETH 归还闪电贷,剩余利润归攻击者。
示例代码(简化):
function attack() external {
// 1. 从闪电贷借入 1000 ETH
uint256 borrowed = flashLoanETH(1000 ether);
// 2. 在 Uniswap V1 中卖出大量 ETH,买入 DVT
uniswap.ethToTokenSwapInput(borrowed, 1);
// 3. 清算借贷池中的用户(使用 DVT 偿还债务)
pool.liquidate(userAddress, 1000 ether);
// 4. 将获得的 ETH 归还闪电贷
repayFlashLoan(borrowed + fee);
}
教训:永远不要使用 DEX 的瞬时价格作为预言机,它极易被操纵。应使用时间加权平均价格(TWAP)或 Chainlink。
2. Curvy Puppet:Uniswap V2 的变种
- 类似 Puppet,但使用 Uniswap V2 的流动性池,且攻击者需要更精准地计算操纵量。
- 核心漏洞相同:依赖即时储备。
3. Selfie:治理攻击 + 闪电贷
- 背景:借贷池使用治理代币作为抵押品,且治理权与代币挂钩。
- 漏洞:攻击者通过闪电贷借入大量治理代币,在单笔交易中发起恶意治理提案(如修改预言机地址或降低清算门槛),然后立即执行。
- 防御点:治理应设置时间锁和投票延迟,防止闪电贷驱动的快速提案通过。
三、攻击手法对比
| 挑战 | 核心漏洞 | 攻击手段 | 防御要点 |
|---|---|---|---|
| Puppet | 使用 Uniswap V1 瞬时价格作为预言机 | 闪电贷 + 价格操纵 + 清算 | 采用 TWAP 或 Chainlink |
| Curvy Puppet | Uniswap V2 现货价格 | 同 Puppet,但需考虑手续费 | 使用 TWAP 或去中心化预言机 |
| Selfie | 治理快照与闪电贷结合 | 闪电贷借治理代币,快速提案 | 设置时间锁、延迟投票 |
| The Rewarder | 奖励计算依赖可操纵的池状态 | 闪电贷操纵池状态,领取奖励 | 使用时间平均奖励或限制 |
四、防御实战:如何加固借贷池
1. 抗操纵的价格机制
- Chainlink Price Feeds:聚合多个数据源,由去中心化节点提交,抗操纵。
- Uniswap V2/V3 TWAP:使用
priceCumulativeLast计算过去 N 分钟的平均价格,使闪电贷操纵成本极高。 - 中位数多源:从多个 DEX 或预言机取价格中位数。
2. 清算延迟
- 设置价格变动后 1 小时 才允许清算,让市场有足够时间恢复,避免闪电贷冲击。
3. 价格偏差限制
- 单次价格更新幅度不得超过 ±5%,若超过则拒绝或采用旧价。
4. 抵押率门槛提高
- 提高抵押率要求(如 200%),增加攻击成本,但会降低资金效率。
5. 审计重点
- 检查所有价格获取点,确保不是单点瞬时数据。
- 评估闪电贷对预言机的影响,模拟极端价格波动。
- 验证清算逻辑是否可在单笔交易中完成,若可,则存在高度风险。
五、总结
借贷池与预言机的安全是 DeFi 的命脉。Damn Vulnerable DeFi 的 Puppet 系列精准模拟了“瞬时价格操纵”这一经典攻击路径。
- 核心原则:预言机的质量决定了借贷池的生死。
- 最佳实践:采用 Chainlink 或 TWAP,结合延迟清算和价格偏差限制。
- 审计铁律:不信任任何可被单笔交易改变的数据源。