2023 年 4 月,一名攻擊者利用 Flashbots 中繼器(Relay)中存在的漏洞攻擊了多個 MEV 機器人,獲利約 2,000 萬美元。此攻擊的根本原因在於,私人交易在特定條件下可能會洩漏到公共交易池中,而攻擊者可以透過「搶跑」(backrun)洩漏的交易來獲利。我們還注意到攻擊中使用了幾種精密技術,例如使用蜜罐(honeypot)交易來攻擊受害者,以及在攻擊合約中加入自我保護機制。
背景
Flashbots
正如其官網所述,Flashbots 是一個「研究與開發組織,旨在減輕最大可提取價值(MEV)對狀態區塊鏈造成的負面外部性,並以以太坊作為起點」。Flashbots 涉及多個不同的實體,包括搜尋者(searchers)、建構者(builders)和中繼器(relays)。下圖展示了它們之間的關係。

圖片來源:Flashbots 文件
PBS(提議者-建構者分離)協議允許區塊提議者將其區塊空間出售給多個建構者(因為他們被選中來建構區塊),以最大化利潤。具體來說,多個搜尋者監聽內存池(mempool)中的交易並產生交易包(bundles),隨後提交給建構者。建構者聚合來自搜尋者的交易包,建立最有價值的區塊,然後將其提交給中繼器。中繼器將區塊提交給區塊提議者,即已被選中為某個 epoch 間隙(slot)建構區塊的驗證者。
在這種架構下,中繼器是建構者和提議者雙方信賴的一方,而這兩者之間互不信任。它確保提議者在簽署區塊標頭之前無法取得區塊內容,並確保提議者能獲得相應的費用。
建議讀者參考 Flashbots 文件以了解詳細架構。我們只需要記住中繼器必須提供的安全保證:如果區塊尚未上鏈,中繼器不得向提議者洩露區塊內容。否則,惡意的提議者可能會利用洩露的區塊內容來獲利(如本次攻擊所示)。
三明治攻擊(Sandwich Attack)
三明治攻擊是指攻擊者將一筆交易置於目標交易的前後,藉此獲利。我們透過一個例子來說明。
假設有一個擁有 WETH 和 USDC 兩種代幣的去中心化交易所(DEX)池。一位用戶提交了一個將 WETH 兌換為 USDC 的請求。該交換交易將進入內存池並被 MEV 機器人(例如一個搜尋者)獲取。隨後,機器人會發出兩筆交易,一筆在用戶的交換交易之前,另一筆在之後。
具體來說,機器人的第一筆交易是使用 WETH 兌換 USDC,這會推高 USDC 的價格。接著,用戶的交換交易隨之執行(由於第一筆交易導致 USDC 價格上漲,用戶獲得的 USDC 會變少)。之後,機器人的第二筆交易將 USDC 換回 WETH,這能比機器人的第一筆交易換回更多的 WETH。
圖片來源:Liyi Zhou 等人的論文《去中心化鏈上交易所的高頻交易》。
搶跑(Backrunning)
搶跑是一種在大額交易後立即執行交易的策略。搶跑主要利用大額交易對代幣價格產生的影響所帶來的套利機會。例如,如果用戶在 DEX 池中進行了大額兌換(將 WETH 換為 USDC),這可能導致 USDC 在該交易所的價格高於其他交易所。搶跑機器人可以立即捕捉到這個套利機會,以較低的價格將 USDC 換回 WETH 以獲取更多 WETH,然後再將 WETH 賣到其他 DEX 池中賺取利潤。
漏洞
正如事故分析報告中所述,該漏洞存在於中繼器的代碼中。即使簽署的區塊標頭無效(簽名本身是有效的),它也會將建構者的區塊內容洩露給(惡意的)提議者。在這種情況下,提交給信標鏈的無效區塊標頭和區塊內容將被拒絕,而提議者可以搶先提交自己的區塊,並利用洩露的區塊內容獲利。
攻擊過程
攻擊者是惡意的提議者,受害者是打算進行三明治交易的 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)的利潤——比例高達 7,000: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 Bot 0xd61492:在一場巧妙的攻擊中從獵食者變為獵物
- #10:ThirdWeb 事件:受信任模組之間的不相容性暴露漏洞



