10分钟智能合约:进阶实战-7.5 借贷池与预言机安全实战

15 阅读5分钟

欢迎订阅专栏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)。

攻击步骤

  1. 闪电贷:从一个支持闪电贷的合约(如 dYdX)借入大量 ETH。
  2. 价格操纵:在 Uniswap V1 ETH/DVT 池中,用借来的 ETH 大量买入 DVT,使 ETH 储备暴增,DVT 储备锐减,从而使 DVT 价格暴跌(以 ETH 计价)。
  3. 触发清算:此时池子的预言机认为 DVT 价格极低,导致许多用户的抵押率不足。攻击者调用 liquidate 函数,用少量 DVT 偿还债务,换取大量 ETH 抵押品。
  4. 归还闪电贷:用获得的 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 PuppetUniswap 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,结合延迟清算和价格偏差限制。
  • 审计铁律:不信任任何可被单笔交易改变的数据源。