Cointime

扫码下载App
iOS & Android

走进MEV攻击:看黑客如何通过夹层手法获取暴利

个人专家

作者:Immunefi. 编译:Cointime.com QDD

引言

区块链空间中的利用行为变得越来越复杂。

在过去,智能合约开发人员和审计员主要需要考虑如何保护智能合约免受单个交易中的利用。但现在,越来越常见的是看到跨多个交易发生的攻击。

黑客在攻击中愿意冒的个人资金风险也越来越大,以追求巨大的收益。

就在上周,一名黑客冒险投入50 ETH(约96,000美元)对Rodeo Finance进行攻击,结果获得约472 ETH的利润,价值约890,000美元。像这样的案例巩固了“攻击成本”不是有效的安全威慑措施的原则,任何依赖高攻击成本来保护自身安全的协议都应重新考虑其策略。

在本文中,我们将解释黑客如何使用MEV攻击脆弱的协议的常见方式之一。我们还将解释作为漏洞猎手如何使用PoC(概念证明)正确演示MEV攻击向量。

什么是MEV

MEV(矿工可提取价值或最大可提取价值)允许矿工在区块被挖掘之前排除、包含和排序区块中的交易。随着以太坊合并后的结果,这种情况发生了相当大的变化,将这种交易排序角色转移到了网络的验证者。但尽管如此,MEV攻击向量在区块链空间仍然很常见和相关。

攻击者可以通过多种方式使用MEV。我们将演示被称为“夹层攻击”的方法,这是通过对受害者的交换交易进行前奏和后奏来实现的。

前奏(Frontrunning)

前奏是一种技术,攻击者设法在受害者的交易之前提交自己的交易,使得攻击者的交易首先执行。这可以通过增加恶意交易的燃气价格来完成,以便优先于具有较低燃气费率的受害者交易。

后奏(Backrunning)

后奏是一种技术,攻击者将恶意交易放在受害者交易执行后。攻击者可以通过降低恶意交易的燃气价格来实现这一点。这将确保受害者交易优先于后奏交易。

夹层攻击

在夹层攻击场景中,攻击者监视交易池(未决交易的列表)以寻找他们想要利用的目标交易。一旦他们确定目标,他们会提交两个交易——一个在目标交易之前,一个在目标交易之后——就像夹层面包中夹着馅料一样。这个夹层的目的是为了以攻击者的利益操纵目标交易的执行或结果。

使用前面部分提到的方法,攻击者会提交两个燃气费比受害者交易更高和更低的交易,以成功执行夹层攻击。或者,他们可以通过专业的RPC提供者提交交易捆绑,以收取费用保证交易的排序。

这种攻击在DeFi生态系统中可能特别有问题,因为涉及代币、流动性池或去中心化交易的交易非常容易受到交易排序的影响。在这些情况下,攻击者的目标通常是操纵资产价格,从套利机会中获利,或者利用协议中的其他漏洞谋取个人收益。

如何测试MEV攻击

为了创建一个演示MEV攻击的PoC,我们可以使用Hardhat和Forge等工具创建区块链的本地分支。

为了证明这两个测试之间的确定性结果,我们将使用相同的Attacker合约,可以通过此Github gist访问。

在这个演示中,我们故意让受害者在UniswapV2中调用从WETH到USDC的交换交易,最低金额设为0。使得这个交易容易受到夹层攻击的脆弱性是将最小金额设为0,这意味着即使受害者只收到0 USDC或99%滑点,交易也不会回滚。这就是为什么设置最小金额非常关键。

Hardhat

Hardhat是用于智能合约开发的框架,允许开发人员使用JavaScript/TypeScript与智能合约进行交互。在Forge(一种较新的框架)出现之前,大多数白帽黑客通过使用Hardhat分叉区块链来制作他们的PoC。

方便的是,Hardhat已经提供了一种机制来保持交易的最终化,以便我们调用的交易可以在这些交易最终化之前在交易池中聚合。

一步一步的指南:

l   确保你的机器上已经安装了Hardhat(https://github.com/NomicFoundation/hardhat

l   创建一个简单的Hardhat项目

l   mkdir MEV-poc

l   cd MEV-poc

l   yarn add hardhat

l   npx hardhat init

l   将合约更改为Attacker合约。

l   将scripts文件夹中的文件更改为sandwichAttack.js https://gist.github.com/GibranAkbaromiL/05020630475f4f2599f72b47e52c7949#file-sandwichattack-js

l   运行npx hardhat run scripts/sandwichAttack.js

输出:

Forge

Forge是一个智能合约开发工具链,允许你使用Solidity脚本测试、部署和与区块链交互。这使我们能够仅通过测试文件中的交易排序演示MEV攻击。

一步一步的指南:

l   确保你的机器上已经安装了Forge(https://book.getfoundry.sh/getting-started/installation)。

l   创建一个简单的forge项目。

l   mkdir MEV-poc

l   cd MEV-poc

l   forge init

l   将src文件夹中的合约更改为攻击者合约。

l   将test文件夹中的测试文件更改为Sandwich.t.sol。https://gist.github.com/GibranAkbaromiL/05020630475f4f2599f72b47e52c7949#file-sandwich-t-sol

输出:

通过这两个测试案例,我们成功地演示了使用Hardhat和Forge进行MEV夹层攻击。从测试案例的输出中可以看出,攻击者和受害者的初始余额都是1000 WETH,攻击者成功地在受害者交易前奏和后奏,导致攻击者获得约123 WETH的利润。受害者收到的USDC较少。

我们学到了什么

在安全研究中,最关键的部分之一是根据你所发现的潜在漏洞创建一个PoC。为什么这么重要呢?因为仅仅识别潜在的漏洞并不能使攻击有效。我们确认攻击是否有效的唯一方法是通过创建一个PoC,每个已识别的漏洞都必须单独创建一个PoC。

我们只讨论了可能发生MEV的许多攻击向量中的一种,你作为研究人员发现的实际攻击场景可能与这里展示的场景大相径庭。在上面的示例中,我们只涉及了其中最常见的一种向量,即没有滑点保护的交换夹层攻击。如果你想测试自己的技能并尝试复制其他攻击向量,请还参阅:NFT铸造前奏链外言机价格更新前奏和JIT(即时)流动性

这篇文章就到这里了。我们希望你能通过在这里度过的几分钟时间,获得一些新的理解或者巩固现有的知识。继续搜寻漏洞,不要停止学习。每天都有新的利用和漏洞等待我们去发现,对于付出努力的白帽黑客来说,奖励和机会是不会缺乏的。

评论

所有评论

推荐阅读