本文深入探讨了价格预言机操控攻击,特别是在去中心化金融(DeFi)空间中的影响。通过解析攻击原理和实例,读者能够理解如何通过闪电贷操控资产价格,以及如何选择和评估预言机以抵御此类攻击。
深入了解价格预言机操纵攻击,学习你在本完整指南中需要了解的一切,包括示例。
在2022年,由于超过40起价格预言机操纵攻击,DeFi领域损失超过4.032亿美元。
作为加密领域中最常见的攻击类型之一,理解预言机操纵及其发生方式对于成为更好的工程师和智能合约审计员至关重要。
由于价格预言机操纵攻击造成的DeFi总价值损失
如果这是你第一次听说预言机,你应该查看我们在Cyfrin Updraft上免费提供的智能合约开发和审计课程。
在互联网世界,任何人都可以托管一个网站和服务器,就像任何人都可以在区块链网络上托管一个节点一样。然而,节点和服务器并不相互连接;区块链是封闭系统,无法获取互联网的数据。
直到出现了预言机。
连接到区块链的区块链预言机
在区块链的世界中,预言机作为与外部系统(如API或其他链上数据)的桥梁。预言机使智能合约能够根据来自现实世界或其他智能合约和链的输入和输出执行操作。
数据通过预言机从外部源引入区块链——预言机的工作是更新和暴露数据,使智能合约可以将这些信息作为触发条件来执行区块链交易。作为智能合约的一种,预言机是连接更广泛互联网和跨链智能合约的关键。
这种与现实世界的连接对于DeFi协议特别重要,因为它们依赖于资产的链上价格才能正常运作。在DeFi协议(去中心化金融)中,你可以将任何交付资产价格的设备(例如,ETH、USD或BTC)视为预言机。
例如,DeFi协议可能需要知道何时清算用户的贷款。这个决定通常来自从预言机获取的价格信息,因为它们暴露了资产的价值,以便合约可以在其之上构建。
一些示例预言机包括:Chainlink、Tellor或Uniswap。
注意: 熟悉Uniswap的人可能会对此感到困惑,因为Uniswap在列表中。难道Uniswap不是一个去中心化交易所(DEX)吗?事实上,DEX(以及其他带有流动性池的链上协议)通常被视为预言机,因为你可以根据流动性池的比例推导出资产的价格。特别是Uniswap有一个称为"TWAP"(时间加权平均)的扩展,抵御闪电贷,但价格值本质上滞后,可能更加不准确。不过,使用流动性池作为预言机是让自己陷入预言机操纵攻击的最常见方法之一。
这就是问题所在。
预言机操纵攻击发生在预言机的价格信息被人造改变时。
这种操纵可以显著影响依赖该预言机进行内部逻辑的DeFi协议中的行为。这些改变可能会创造出本不可用的套利机会。
举个例子:
当我们操纵预言机发送给区块链的信息时,就会发生预言机操纵攻击,从而影响链上执行操作,给操纵者带来利益。
大多数价格预言机操纵攻击是通过使用闪电贷进行的。
闪电贷是一种DeFi机制,允许用户在没有抵押品的情况下借用资产。
关键?资金必须在同一交易块内归还给贷款人,否则整个操作将被撤回。
攻击者可以利用闪电贷来改变像Uniswap这样的自动化市场制造商中资产的价格,在贷方智能合约有机会再次查找该代币之前改变代币的现货价格。
由于这一切都发生在同一交易块内,受损的流动性池最终扭曲了价格预言机,从而操纵了特定协议中的行为。
去年,Mango Markets(一个加密货币在线交易所)通过预言机操纵攻击。115亿美元的数字货币被盗。
事情是这样发生的:
如果我们在Solidity中实施这样的攻击,大致会像这样:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import 'MarketManipulator.sol'
contract OracleAttack {
IDeFiTradingPlatform public tradingPlatform;
IOracle public priceOracle;
IDeFiLendingPlatform public lendingPlatform;
MarketManipulator public marketManipulator;
constructor(address _tradingPlatform, address _priceOracle, address _lendingPlatform) {
tradingPlatform = IDeFiTradingPlatform(_tradingPlatform);
priceOracle = IOracle(_priceOracle);
lendingPlatform = IDeFiLendingPlatform(_lendingPlatform);
}
function manipulateMarket() external {
// 该函数会使用交易平台购买某个代币并操纵市场
marketManipulator.manipulateMarket();
}
function exploitOracle() external {
// 该函数将使用来自预言机的操纵价格来借出资金
uint256 manipulatedPrice = priceOracle.getPriceOfToken();
lendingPlatform.borrowFunds(manipulatedPrice);
}
function withdrawFunds() external {
// 该函数将借取的资金提取到攻击者的钱包中
lendingPlatform.withdrawBorrowedFunds();
}
}
在这种情况下,我们可以设想一个manipulateMarket
函数以如下方式将ETH兑换为MANGO代币:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
interface IUniswapV2Router {
function swapExactETHForTokens(
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external payable returns (uint[] memory amounts);
}
contract MarketManipulator {
IUniswapV2Router public uniswapRouter;
address public mangoTokenAddress;
// 在部署时设置Uniswap路由器地址和MANGO代币地址
constructor(address _uniswapRouter, address _mangoTokenAddress) {
uniswapRouter = IUniswapV2Router(_uniswapRouter);
mangoTokenAddress = _mangoTokenAddress;
}
// 该函数利用发送的所有ETH购买MANGO代币。
function manipulateMarket() external payable {
address[] memory path = new address[](2);
path[0] = uniswapRouter.WETH(); // Uniswap上的包装ETH代币地址
path[1] = mangoTokenAddress;
// 进行交换,发送ETH并接收MANGO代币
uniswapRouter.swapExactETHForTokens{value: msg.value}(
0, // 接受任意数量的MANGO代币(无最低限制)
path,
msg.sender, // 代币应发送到该交易的发送方
block.timestamp // 截止时间设置为当前区块的时间戳
);
}
}
在此案例中,攻击者Avraham Eisenberg公开确认自己是预言机价格操纵攻击的幕后黑手,认为这一切都不是非法行为。
然而,SEC 提起了指控,认为Eisenberg的行为可能算作市场操纵,因为他在攻击当天将MNGO的交易量提高了2000%,相比于之前十天的平均价格。此案仍在进行中,尚未对此事得出法律结论。
关于攻击本身,值得注意的是,这次攻击并不针对特定代码,而是针对真相源——预言机,从而操纵协议的行为。代码实际上是按预期运行的。
在Mango Markets事件中,例如,Mango Markets协议利用像FTX这样的中心化交易所作为预言机来定义其贷款的抵押品估值。
1. 仔细选择预言机
了解不同预言机设计的优缺点尤其重要,尤其是它们如何满足你具体协议的需求。
所有这些问题都极其重要,并且在选择适合某一协议的预言机时必须认真对待。使用流动性池作为你的预言机几乎可以保证你的协议会被闪电贷攻击所破坏,尤其是当利用流动性较低的代币时,这些代币比市值较大的代币更容易被操纵。
2. 拥有备用系统
许多DeFi项目使用双重预言机系统,利用(例如:Chainlink价格数据)和链上预言机(例如:Uniswap V3 TWAP预言机)。当第一个预言机工作不正常(例如数据错误)时,该系统可以切换到另一个预言机。
3. 优先使用去中心化预言机而非中心化预言机
虽然中心化预言机可能效率高,但缺点通常大于好处。依赖单一实体使得预言机容易受到该实体下线或被操纵的影响。此外,用户还必须信任该中心化方提供准确和公正的数据。这种中心化还降低了韧性和抗审查能力。
一个使用多种资源的去中心化预言机服务并非完全安全,但通常成本过高,不会造成问题。去中心化预言机的一些缺点是需要额外的资源和协调能力,在规模上操作并在多个独立源之间达成共识。
尽管如此,我们推荐使用去中心化预言机,因为它们更难以操纵。
一些去中心化预言机的示例包括Chainlink、API3和Synthetix。中心化预言机的示例有Coinbase和Kraken,它们暴露出其中心化交易所的订单簿价格数据。
4. 不断检查预言机的性能,并在必要时采取保护措施
不要总是信任预言机的数据是正确的。相反,定期检查数据。例如,你可以编写脚本,将预言机的价格与其他来源进行比较,并查找较大差异。
如果没有备用系统,你应该有方法来限制预言机操纵的影响。一个方法可能是在预言机数据源(或预言机本身)可疑时暂停协议的智能合约。
5. 进行审计
尽管审计不能完全防止黑客攻击,但私人审计和竞争审计可以显著降低你的协议发生预言机操纵攻击的可能性。
如果你对此感兴趣,请确保联系Cyfrin进行智能合约审计,并获取你的代码库的估算。
预言机操纵攻击是如今DeFi领域一个重要的威胁。
虽然智能合约的Solidity代码如预期运行,但脆弱性在于对预言机作为真相源的依赖。
通过理解它们的发生和机制,可以开发保护措施来确保未来DeFi协议的安全。
如果你担心你的代码库是否容易受到预言机操纵攻击,请随时联系这里进行审计。
另外,你还可以查看终极智能合约开发学习平台,提升你的智能合约安全技能!
- 原文链接: cyfrin.io/blog/price-ora...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!