こんにちは。前回の記事の続きです。紫藤かもめ @shidokamo です。 今回の記事では、攻撃の舞台となった Flashbots システムを詳しく解説します。
前回の記事はこちらになります。「MEV bot への攻撃者が逮捕された件の解説」
今回の攻撃手法の概要
さて、前回の記事では、なぜサンドイッチに使われる2つのtxバンドルを盗むことが出来たのかという話で終わりました。
結論からいうと、この攻撃では、攻撃者が(改造)バリデータを稼働させ、バンドルが含まれるブロックの中身を不正に取得しました。 (バリデータは、Flashbotsからブロックを受け取るので、バンドル以外にも多くのtxが含まれていますがそれらは不要なので破棄されました。)
なので、まずは Flashbots というシステムについて見てみましょう。
Flashbots の仕組み
概要
細かいところは端折ってざっくり MEV searcher が使う Flashbots のバンドルの仕組みを説明すると以下のようになります。 Flashbotsシステムの中には色々と細かいものがあるんですが、ごく簡潔に書くとこういうことなります。
Flashbotsシステムは、MEV sercher から Bundle を受け取り、同時に普通のユーザのトランザクションも集めます。
普通のユーザはFlashbotsなんか使いたくはないでしょうが、普通のユーザのトランザクションはブロックに取り込まれる前にすでに公開されているので、Flashbotsはそれを集めることができます。
最終的に、Flashbots はブロックを組み上げ、バリデータに渡します。
バリデータのインセンティブ
バリデータがFlashbotsを使う理由は、一番儲かるブロックを受け取るためです。 Flashbotsが自動的に、Validatorの手数料収入が一番大きくなるブロックを作ってくれるので、自分がBlock proposerになる番が来た際に、そのブロックを使うと得をします。
ちょうど先日、全財産イーサリアム氏が、自分が運用しているバリデータで、宝くじ並みの確率で時価1500万円の手数料収入を引いていました。 (くっっっっっそ羨ましい)
【祝杯】34ETHが降ってきた【1500万まじ?】
— 全財産イーサリアム (@nook_ethereum) May 14, 2024
何を言ってるのかわからねーと思うが、俺も何が起こったのかわからねーが
あ・・ありのまま、起こったことを話すぜ!
俺は今、ステーキングをしてる。当然イーサリアムのだ。… pic.twitter.com/TsXP2eOVYk
これが正にFlashbotsシステムが作った一番儲かるブロックを使ったことによるものです。
バリデータは基本的に自分が入れたいトランザクションを選んで、また自分でトランザクションを追加したりもできます。 しかし、全イー氏が独自にどんなに頑張ってもこのような高額の利益が出るブロックができるようにトランザクションを組み上げるのはほぼ不可能だと思います。
Flashbotsシステムはバリデータに代わってこのようなブロックを作ってくれる訳です。 バリデータからすればFlashbotsシステムを使わない理由は経済的にはゼロです。
代わりに、その利益の一部を MEV searcher と呼ばれるサンドイッチbotなどが貰っていくという共生関係になっています。
Block Proposer
バリデータは現在では100万台以上稼動していますが、自分でブロックをFlashbotsから受け取ってそれをネットワーク上に公開するのは、 ランダムに割り当てられる Block Proposer だけです。 Block Proposer になれる確率は多数のバリデータが稼動している現状ではそれほど高くありません。
今度は、Block Proposerであるバリデータが Flashbots からブロックを受け取る方法を詳しく見ていきましょう。
Trustless にブロックを渡す手法
Flashbots はバリデータに対してブロックを渡す仕組みは、トラストレスでなくてはなりません。 バリデータを信頼してブロックの中身を渡してしまえば、今回の攻撃のように悪用されるからです。
そのために、Flashbots はよくある Commit-and-reveal (コミットしたら公開)を採用しています。
Commit-and-reveal の例
Commit-and-reveal で例えばわかりやすいのは、ENSドメインでしょうか。 イーサリアムの .eth というドメインです。 あれを取得した人はわかると思いますが、ドメインを取るためにトランザクションをなぜか時間を置いて2回発行する必要がありますね。
これは、一番目のトランザクションが暗号化されたコミットになっているのです。 その暗号の中に、取得したい .eth ドメインの名前が書いてあります。当然暗号化されているので他の人にはわかりません。
そして、二番目のトランザクションでは、一定時間の後に先ほどの暗号をデコードする鍵を公開します。 すると、先ほどの一番目のトランザクションの正当性を自分だけが証明できる訳です。
取得したい .eth ドメインの名前を最初は隠しているわkです。これによって、誰かがフロントランニングしてその .eth ドメインの名前を奪うことが できないようになっているのです。
Commit-and-reveal は、オープンな環境でトラストレスに物事を進めるために、クリプトではよく使われているようです。
Flashbots の commit-and-reveal
Flashbots では、以下のように commit-and-reveal でバリデータにブロックを渡します。
- Flashbots はまずバリデータにブロックヘッダーのみを渡す
- バリデータはブロックヘッダーに署名をする
- Flashbots は署名を確認したら、バリデータに完全なブロックを返す。
Block header
イーサリアムのブロックヘッダーには、Transaction rootというハッシュが含まれており、これがブロック内のトランザクション全体の中身を表していると考えてください。 ただし、ハッシュなのでこれだけでは個別のトランザクションの中身はわかりません。 それを利用して、Flashbotsはまずブロックヘッダーのみを渡すわけです。
Header への署名
バリデータがヘッダーに一度署名をしてしまうと、それは人質のようなものになります。 不正な署名がオープンになってしまえば、二重署名によるPoSネットワークからの排除などが行われるからです。
脆弱性の中身
攻撃者は、Flashbots の commit-and-reveal に存在していた脆弱性を突きました。
- バリデータがブロックヘッダーに署名をしてコミットする際に、署名が無効であっても Flashbots はブロックを公開するようになっていた。
おそらく、署名が不正であっても、そのようなブロックはチェーンが拒否するので問題はないと考えたのではないかと思われます。 実際は、公開したブロックを攻撃者が解析し、瞬時に新しい不正なブロックを公開する攻撃経路が存在していました。
時系列と Flashbots の脆弱性
最後に時系列をまとめてみます。 公式のレポートはこちら
(注意)以下では、独自調査による筆者の推測が含まれており、経緯に誤りがある可能性があります。 Flashbots が公開しているレポートに彼ら自身が脆弱性を埋め込んでしまった経緯が伏せられている気がするのでその点の推測を追加しました。
2023年2月頃
Flashbots のパフォーマンスを改善するために(簡単にいうと利益が出せるブロックを探すための時間を出来るだけ稼ぐために)、 「楽観的なリレー」 という変更が提案される。 名前からしてヤバそうですね。
- https://github.com/michaelneuder/optimistic-relay-documentation/blob/main/proposal.md
- https://github.com/flashbots/mev-boost-relay/pull/285
この変更により、時間のかかるブロックの正当性の検証を後回しにする変更が実装された。 この変更がおそらく脆弱性になったと推測される。(それまではバリデータが行うヘッダーへの署名の検証をしなくても問題はなかったと思われる。)
2023年3月16日
攻撃者がバリデータを登録する。 以下が、そのバリデータへの32ETHのデポジットだが、おそらく、Block proposer になる確率を高めるために、他にも複数のバリデータを登録していたと推測される。
- https://etherscan.io/tx/0x9cf11fde666d94b32ee9ba3fc6aee468b03f2f5e7ef06f1642415fe0ebfe7c58
- https://beaconcha.in/validator/552061
2023年3月17日
Flashbots の複数あるエンドポイントのうち、Ultra Sound Relay というエンドポイントで、 「楽観的なリレー」 のテストが始まる。 これは本番環境でのテストになる。のちに攻撃されるエンドポイントとなった。 (Flashbots は分散システムなので、複数のノードがそれぞれ別のコードで動くことができる。)
2023年4月2日
攻撃者がサンドイッチへの餌となるトランザクションを撒き始める。
2023年4月2日
攻撃発生。攻撃者のバリデータが、Ultra Sound Relay エンドポイントに不正な署名を送り、ブロックの中身を取得し、 それを完全に書き換えて、MEV サーチャーから時価2500万ドルの資金を奪った。
ちなみに、攻撃者は自分が Block Proposer にランダムに選ばれるのを待つ必要があり、たまたまこの時選ばれたので攻撃を行った。 Block Proposer になれる時を適切に予測できないと、常にサンドイッチをはめる餌を撒き続ける必要があるが、 この点はどうだったのか不明。PoSの仕様を調査できておらず、なぜ攻撃者が餌を撒いてすぐに効率的に攻撃できたのか不明。 相当な台数のバリデータを稼動していたのか?
感想
まあ簡単にいうと以上のようになります。最後に感想です。
この攻撃が犯罪なのかどうかという点が議論になっています。まあそれは裁判所が決めることですが、 今まで数々のハッカーがコントラクトの脆弱性を突いて資金を強奪してきたことは犯罪だというコンセンサスがありますので、まあこれも犯罪ではないでしょうか。
コントラクトの脆弱性をつくというのは、イーサリアム的には「正当な手法」です。 単にコントラクトにそう書いてあったから俺はそれを実行しただけ、金が落ちてるのが悪い、という主張はまあ通らないような感じで合意形成されているようです。
なので、Flashbotsのコードに脆弱性が含まれていたからそれを利用して、うまく奪ったというのもほぼ同じ行為ではないかと思います。
しかし、それにしてもこの攻撃は敵ながらあっぱれでした。 まさに意表を突くとはこのことでした。 多くの攻撃は、コントラクトの脆弱性を突きますが、この攻撃はイーサリアムエコシステム自体を攻撃して、 大胆にもブロック全体の中身を書き換えて、2500万ドルもの資金を奪うということをやってのけた訳です。 今回犯人が捕まったと聞いた時は、あれほど洗練された攻撃を行うハッカーが捕まるのかと個人的には驚きました。
私の推測した時系列を見ると、ゼロデイの前にすでに攻撃の準備を始めており、また複数あるエンドポイントのうちただ一つ脆弱性があるコードがテストされていた箇所を 的確に狙っているため、攻撃者は相当にFlashbotsに深入りしていたのではないかと思います。 攻撃者の兄弟は一体どういう人物なのかこの先明らかになるのを期待しています。