2023年4月、攻撃者がFlashbotsリレーに存在する脆弱性を利用して複数のMEVボットを攻撃し、約2,000万米ドルの利益を得るという事案が発生しました。この攻撃の根本的な原因は、特定の条件下でプライベートトランザクションがパブリックプールにリークされる可能性があり、攻撃者がそのリークされたトランザクションにバックラン(後追い取引)を仕掛けることで利益を得られたことにあります。また、攻撃者が被害者を攻撃するためにハニーポットトランザクションを使用したり、攻撃用コントラクトに自己防衛メカニズムを組み込んだりと、いくつかの高度なテクニックが使用されていたことも確認しています。
背景
Flashbots
Flashbotsのウェブサイトによると、Flashbotsは「Maximal Extractable Value(MEV、最大抽出可能価値)がステートフル・ブロックチェーンにもたらす負の外部性を緩和するために結成された研究開発組織であり、まずはイーサリアムから着手している」とのことです。Flashbotsには、サーチヤー(Searcher)、ビルダー(Builder)、リレー(Relay)など、いくつかの異なる主体が関与しています。以下の画像は、それらの関係を示したものです。

この画像はFlashbotsのドキュメントから引用したものです。
PBS(プロポーザー・ビルダー分離)プロトコルは、ブロックプロポーザー((ブロック構築のために選出された)ブロックの提案者)が自分のブロック領域を複数のビルダーに販売し、利益を最大化することを可能にするプロトコルの一つです。具体的には、複数のサーチヤーがメモリプール内のトランザクションを監視し、バンドル(取引の束)を生成してビルダーに送付します。ビルダーはサーチヤーからのバンドルを集約し、最も価値の高いブロックを作成した後、リレーに引き渡します。リレーはそのブロックを、エポックスロットのブロック構築のために選出されたバリデーターであるブロックプロポーザーに提出します。
このアーキテクチャにおいて、リレーはビルダーとプロポーザーの双方から信頼される第三者機関です(両者は互いに信頼していません)。リレーは、プロポーザーがブロックヘッダーに署名する前に、ブロックの中身を取得できないように保証します。また、手数料が確実にプロポーザーへ支払われるようにします。
詳細なアーキテクチャに興味のある読者は、Flashbotsのドキュメントを参照してください。ここでは、リレーが提供すべきセキュリティ保証、つまり「ブロックがチェーン上に存在しない場合、リレーはプロポーザーにブロックの中身を明かしてはならない」ということだけを覚えておいてください。もしこれが守られなければ、悪意のあるプロポーザーはリークされたブロックの内容を利用して利益を得ることができてしまいます(今回の攻撃のように)。
サンドイッチ攻撃
サンドイッチ攻撃とは、攻撃者が2つのトランザクションの間に自身のスワップ(交換)取引を挟み込むことで利益を得る手法です。例を挙げて説明します。
WETHとUSDCの2つのトークンを持つDEXプールがあるとします。ある利用者がWETHをUSDCに交換するスワップリクエストを提出したとします。このスワップトランザクションはメモリプールに入り、MEVボット(サーチヤー)によって取得されます。するとボットは、利用者によるスワップトランザクションの「前」と「後」に、それぞれ1つずつ、計2つのトランザクションを生成します。
具体的に、ボットの1つ目のトランザクションはWETHを使ってUSDCをスワップするもので、これによりUSDCの価格が上昇します。次に、利用者のスワップトランザクションが実行されますが、1つ目のトランザクションによってUSDCの価格が高騰しているため、利用者はより少ないUSDCしか受け取れません。その後、ボットの2つ目のトランザクションがUSDCをWETHに交換し、最初のスワップ時よりも多くのWETHを獲得します。
この画像は、Liyi Zhouらによる論文『High-Frequency Trading on Decentralized On-Chain Exchanges』から引用したものです。
バックラン(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プールで2,454.1 WETHを使用して4.5 STGをスワップするという大規模トレードを実行しました。これが大きな裁定機会を生み出し、攻撃者は158 STGを使ってプール内のWETHをすべて吸い上げました。

ここで疑問が生じます。なぜ被害者(MEVボット)は、3米ドル程度の価値しかない4.5 STGを得るために、500万米ドル相当(2,454 WETH)もの資金を使おうとしたのでしょうか。被害者がこのスワップを実行したとき、プール内の流動性は極めて低かった(0.005 WETHと4.5 STG)ことに注意してください。
分析の結果、MEVボットがこのような馬鹿げたスワップを実行した理由が2つ判明しました。
一つ目は、攻撃者がハニーポットトランザクションを作成し、被害者を誘い込んでサンドイッチ攻撃を実行させようとしたことです。このハニーポットトランザクションのハッシュは0xd534c46ba5a444e886 | Phalcon Explorer (blocksec.com)です。具体的には、攻撃者は(ブロック16964664の前に)WETHをSTGに交換するトランザクションをブロードキャストしました。プール内の流動性が極めて低いため、これがMEVボットにとってサンドイッチ攻撃を行う絶好の機会となりました。以下の図に示すように、MEVボットはサンドイッチ攻撃用の3つのトランザクションからなるバンドルを作成したのです。

二つ目は、このMEVボットが強欲なサンドイッチ戦略を採用しており、その送信にFlashbotsを利用していたことです。利益を最大化するため、バンドル内の最初のトランザクションは(2,454 WETHを使って)STGトークンをほぼすべて吸い上げようとしていました。これは、700ドル程度の利益(0.35 WETH)を得るために500万ドル(2,454 WETH)もの資金を投じるという、極めて強欲で7,000対1の非効率的な戦略です。ボットは、このスワップがチェーン上で確定するまで誰にも知られることはないと思い込んでいました。しかし、リレーの脆弱性によってこの前提が崩れました。これを利用して、攻撃者はボットの初期サンドイッチ攻撃トランザクションを組み込んだ新しいバンドルを作成し、そこへ2,454 WETHを獲得するためのバックラントランザクションを追加したのです。
BlockSecのTwitterに記載されている図は、攻撃の全工程を示しています。

自己防衛メカニズム
攻撃者がWETHとSTGのスワップを行うハニーポットトランザクションで被害者を誘い込んだことは分かりました。では、ハニーポットトランザクションを利用できるサンドイッチ取引が存在しない場合はどうなるのでしょうか? 実はその場合、攻撃者はプールの状況を監視し、自身の0.35イーサを保護するために逆方向のスワップを実行する仕組みを組み込んでいました。これは非常に賢い動きです。以下は、ハニーポットトランザクションを実行したスマートコントラクト(0xe73f1576af5573714404a2e3181f7336d3d978f9)の逆コンパイルされたコードです。

我々の発見を検証するため、ブロック16964664の位置0でPhalcon Forkを用いてハニーポットトランザクションをシミュレートしました。

まとめ
本件は、Flashbotsリレーの脆弱性を巧妙な攻撃戦略と組み合わせて利用した初めての攻撃事例です。
- 第一に、この攻撃はFlashbotsリレーに存在するゼロデイ脆弱性を悪用しました。
- 第二に、MEVボット(被害者)の強欲なサンドイッチ戦略を逆手に取り、ハニーポットトランザクションを使用して彼らを誘い込みました。
- 第三に、攻撃が成功しなかった場合でもハニーポットトランザクションのコスト(0.35 WETH)を回収するための自己防衛メカニズムが備えられていました。
本シリーズの他の記事を読む:
- リード:2023年を象徴するセキュリティインシデント トップ10
- #2: Euler Financeインシデント:2023年最大のハッキング
- #3: KyberSwapインシデント:微細な計算ミスを突いた巧みなアービトラージ攻撃
- #4: Curveインシデント:コンパイラのバグによりクリーンなソースコードから欠陥のあるバイトコードが生成
- #5: Platypus Finance:幸運によって3度の攻撃を生き延びた事例
- #6: Hundred Financeインシデント:脆弱なプロトコルフォークにおける精度関連の悪用が連鎖
- #7: ParaSpaceインシデント:業界で最も致命的な攻撃を阻止するための時間との戦い
- #8: SushiSwapインシデント:不手際な救済の試みが模倣攻撃の引き金に
- #9: MEVボット 0xd61492:捕食者が獲物に変わった巧妙なエクスプロイト
- #10: ThirdWebインシデント:信頼されたモジュール間の相互運用性の欠如が脆弱性を露呈



