利用Flashbots Relay漏洞收割MEV机器人

Flashbots 中继漏洞导致 MEV 机器人被利用,成为 2023 年十大“杰出”安全事件之首。

利用Flashbots Relay漏洞收割MEV机器人

2023年4月,一名攻击者利用Flashbots relay中存在的漏洞,攻击了多个MEV机器人,获利约2000万美元。此次攻击的根本原因是,在某些条件下,私有交易可能泄露到公共池中,攻击者可以进行反向运行(backrun)来获取利润。我们还注意到攻击中使用了几种复杂的技术,例如利用“诱饵交易”(honeypot transactions)攻击受害者,以及攻击合约中的自我保护机制。

背景

Flashbots

Flashbots在其网站上显示,“是一个研究和开发组织,旨在减轻最大可提取价值(MEV)对有状态区块链(以以太坊为首)造成的负面外部性。” Flashbots涉及多个实体,包括搜寻者(searchers)、构建者(builders)和中继(relays)。下图展示了它们之间的关系。

这张图片来自Flashbots文档

PBS(提案者-构建者分离)协议允许区块提案者将其区块空间(在被选定构建区块时)出售给多个构建者,以最大化利润。具体来说,多个搜寻者监听内存池(mempool)中的交易并生成交易包(bundles),然后提交给构建者。构建者聚合搜寻者的交易包,创建最有价值的区块,然后将其提交给中继。中继将区块提交给区块提案者,即在某个时期槽(epoch slot)被选定构建区块的验证者。

在这种架构中,中继是构建者和提案者之间受信任的第三方,因为他们彼此不信任。它确保提案者在签署区块头之前无法获取区块内容。它还确保向提案者支付的费用金额。

对于有兴趣了解详细架构的读者,我推荐Flashbots文档。我们只需要记住中继需要提供的安全保证,即中继不能向提案者透露区块内容,除非该区块已在链上。否则,恶意提案者可以利用泄露的区块内容获利(如攻击所示)。

三明治攻击(Sandwich Attack)

三明治攻击是指攻击者将一笔交换放在两笔交易之间以获取利润。我想用一个例子来说明。

假设我们有一个DEX池,包含两种代币:WETH和USDC。一个用户提交了一个兑换请求,将WETH兑换成USDC。这笔兑换交易将进入内存池,并被MEV机器人(假设为一个搜寻者)获取。然后,机器人将进行两笔交易,一笔在用户兑换交易之前,一笔在之后。

具体来说,机器人的第一笔交易是使用WETH兑换USDC,这将提高USDC的价格。然后,用户的兑换交易将被执行(由于USDC价格上涨,获得的USDC会减少)。之后,机器人的第二笔交易会将USDC兑换成WETH,这样可以获得比第一笔交易更多的WETH。

这张图片来自Liyi Zhou等人的论文“High-Frequency Trading on Decentralized On-Chain Exchanges”。

反向运行(Backrunning)

反向运行是一种在进行大额交易后立即执行交易的策略。反向运行基本上利用大额交易对代币价格的影响产生的套利机会。例如,如果一个用户在DEX池中进行大额交易,将WETH兑换成USDC,这可能会导致USDC的价格高于其他交易所。反向运行机器人可以立即抓住这个套利机会,以较低的价格将USDC兑换成WETH,从而获得更多的WETH,然后在其他交易所的DEX池中出售WETH获利。

漏洞

事后分析所示,漏洞存在于中继的代码中。它会向(恶意的)提案者泄露构建者的区块内容,即使签名后的区块头无效(签名本身有效)。在这种情况下,提交给信标链的无效区块头和区块内容将被拒绝,而提案者可以通过抢先提交自己的区块并利用泄露的区块内容来获利。

攻击过程

攻击者是恶意的提案者,受害者是打算进行三明治交易的MEV机器人。

我们以一个实际的攻击交易为例。

区块 16964664
位置 0 受害者交易:0xd2edf726fd3a7f179c | Phalcon Explorer (blocksec.com) MEV机器人使用2454.1 WETH兑换4.5 STG
位置 1 攻击交易:0x4b2a2d03b3dc136ef9 | Phalcon Explorer (blocksec.com) 攻击者使用158 STG兑换2454.1 WETH

受害者交易和攻击交易分别位于区块16964664的位置0和1。基本上,受害者(MEV机器人)在uniswap WETH-STG池中进行了一笔大额交易,使用2454.1 WETH兑换4.5 STG。这创造了一个巨大的套利机会,而攻击者利用158 STG耗尽了池中的所有WETH。

问题是,为什么受害者(MEV机器人)愿意使用2,454 WETH(价值约500万美元)来兑换池中的4.5 STG代币(价值约3美元)?请注意,当受害者进行此次兑换时,池中的流动性非常低(0.005 WETH和4.5 STG)。

我们的分析表明,MEV机器人进行如此荒谬的兑换有两个原因。

首先,攻击者使用了一个“诱饵交易”来引诱受害者发送这笔兑换交易,以便进行三明治攻击。这笔诱饵交易的哈希是0xd534c46ba5a444e886 | Phalcon Explorer (blocksec.com)。具体来说,攻击者广播了一笔交易,在区块16964664之前将WETH兑换成STG。由于池中的流动性非常低,这为MEV机器人制造了一个进行三明治攻击的机会。如下图所示,MEV机器人可以创建一个包含三笔交易的三明治攻击交易包(Sandwich attack bundle)。

其次,MEV机器人使用了贪婪的三明治策略,并利用Flashbots发送了这笔交易。为了最大化利润,交易包内的第一笔交易试图耗尽池中几乎所有的STG代币(价值2,454 WETH)。这是一个非常贪婪的策略,使用500万美元(2,454 WETH)来获得约700美元(0.35 WETH)的利润——比例为7000:1。机器人假设,除非这笔兑换交易已提交到链上,否则它不会被公开。然而,由于中继的漏洞,这一假设被打破了。利用这一点,攻击者创建了一个新的交易包,其中包含了机器人最初的三明治攻击交易,并添加了一笔反向运行交易以获取2,454 WETH。

BlockSec在Twitter上的图展示了整个攻击过程。

自我保护机制

我们知道攻击者发送了一笔“诱饵交易”来引诱受害者进行WETH兑换STG。然而,如果没有可供利用三明治交易的情况,会发生什么?在这种情况下,攻击者会监控池的状态,并执行反向兑换以保护其0.35以太币,这是一个明智之举。下面是执行“诱饵交易”的智能合约(0xe73f1576af5573714404a2e3181f7336d3d978f9)的反编译代码。

为了验证我们的发现,我们在Phalcon Fork中模拟了这笔“诱饵交易”[(https://phalcon.blocksec.com/explorer/tx/eth/0xb472ec7718a352cdfb0f09801cc36cbcb54bc7afc69086535af55b37d80ba3ab?event=fork&forkId=fork_c338a555c18747a39306bacb8b81d0dd)],但在区块16964664的位置0。

总结

这是首次利用Flashbots中继的漏洞并结合复杂攻击策略的攻击。

  • 首先,此次攻击利用了Flashbots中继的零日漏洞。
  • 其次,它利用了贪婪的三明治策略,并使用“诱饵交易”来引诱MEV机器人(受害者)。
  • 第三,它包含了一个自我保护机制,以在攻击未成功的情况下节省“诱饵交易”的成本(0.35 WETH)。

阅读本系列的其它文章:

Sign up for the latest updates