2023年4月,一名攻击者利用 Flashbots 中继器中存在的漏洞攻击了多个 MEV 机器人,非法获利约 2000 万美元。此次攻击的根本原因是私有交易在特定条件下可能会泄露到公共内存池中,攻击者可以抢先(backrun)这些泄露的交易以获取利润。我们还注意到攻击中使用了几种复杂的技术,例如利用蜜罐交易攻击受害者,以及在攻击合约中使用自我保护机制。
背景
Flashbots
正如其网站所述,Flashbots 是一个“研究与开发组织,旨在减轻最大可提取价值 (MEV) 给有状态区块链(以以太坊为首)带来的负面外部性”。Flashbots 涉及多个不同的主体,包括搜索者 (searcher)、构建者 (builder) 和中继器 (relay)。下图展示了它们之间的关系。

图片来自 Flashbots 文档
PBS(提议者-构建者分离)协议允许区块提议者(当他们被选中构建区块时)将其区块空间出售给多个构建者,从而实现利润最大化。具体来说,多个搜索者监听内存池中的交易并生成交易束(bundle),这些交易束会被提交给构建者。构建者汇集来自搜索者的交易束,创建价值最高的区块,然后将其提交给中继器。中继器随后将该区块提交给区块提议者,即已被选中为一个纪元时隙 (epoch slot) 构建区块的验证者。
在这种架构中,中继器是构建者和提议者双方都信任的第三方,而构建者和提议者之间互不信任。它确保提议者在签署区块头之前无法获得区块内容。它还确保向提议者按时支付费用。
我建议对详细架构感兴趣的读者查阅 Flashbots 文档。我们只需要记住中继器需要提供的安全保证:即如果区块未上链,中继器不得向提议者泄露区块内容。否则,恶意提议者可以利用泄露的区块内容获利(如本次攻击所示)。
三明治攻击 (Sandwich Attack)
三明治攻击是指攻击者将一笔交易夹在另外两笔交易之间以获取利润。我想用一个例子来说明这一点。
假设有一个包含 WETH 和 USDC 两种代币的 DEX 池。一名用户提交了一个将 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 机器人可以创建一个包含三笔交易的三明治攻击交易束。

其次,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 Ether,这是一种非常高明的做法。以下是执行蜜罐交易的智能合约(0xe73f1576af5573714404a2e3181f7336d3d978f9)的反编译代码。

为了验证我们的发现,我们在 Phalcon Fork 中模拟了这笔蜜罐交易,置于区块 16964664 的第 0 位。

总结
这是首次利用 Flashbots 中继器漏洞并结合复杂攻击策略的攻击事件。
- 首先,此次攻击利用了 Flashbots 中继器中的零日漏洞。
- 其次,它利用了贪婪的三明治交易策略,并使用蜜罐交易来引诱 MEV 机器人(受害者)。
- 第三,它包含了一种自我保护机制,以便在攻击不成功时挽回蜜罐交易的成本(0.35 WETH)。
阅读本系列的其他文章:
- 引言:2023 年“令人惊叹”的十大安全事件
- #2:Euler Finance 事件:2023 年最大规模黑客攻击
- #3:KyberSwap 事件:通过极其微妙的计算巧妙利用舍入误差
- #4:Curve 事件:编译器错误导致无害源代码产生故障字节码
- #5:Platypus Finance:侥幸幸存的三次攻击
- #6:Hundred Finance 事件:催化易受攻击的衍生协议中与精度相关的漏洞利用浪潮
- #7:ParaSpace 事件:与时间赛跑以挫败业界最危急的一次攻击
- #8:SushiSwap 事件:笨拙的救援尝试引发了一系列模仿攻击
- #9:MEV 机器人 0xd61492:从掠食者到猎物的一场天才攻击
- #10:ThirdWeb 事件:受信任模块之间的不兼容性导致漏洞暴露



