Euler Financeハッキング事件はなぜ起きたのか

2023年3月13日、Euler Financeはフラッシュローン攻撃によるハッキングを受け、約200億円がハッカーにより盗まれました。
実はこの事件、複数社によるコードのセキュリティ監査の実施やバグバウンティプログラムの開催、フォーラムにおける提案・ディスカッションなど様々な対策を講じていたのにも関わらず発生しています。
この記事では、この事件のハッキングの手順を解説するとともに、なぜ万全の対策をしているように見えるにも関わらずハッキングが起きてしまったのかも併せて考察してみたいと思います。

ちなみにハッキングの手順に関しては、Ethereum Japanが主催した「Euler Financeハッキング事件から学ぶフラッシュローン攻撃」という勉強会でも発表しています。動画で確認したい場合はこちらのアーカイブをご参照ください。

Euler Financeとは?

Euler Financeは、CompoundやAaveのようなDeFiプロトコルと同じく資金の貸し借りのできるレンディングプラットフォームです。
他のレンディングプラットフォームと比べ、各トークンのリスク特性に応じて資産の「階層分け」を行っているという特徴がEuler Financeにはあります。
より詳しく知りたい場合は、公式サイトのホワイトペーパーをご確認ください。
https://docs.euler.finance/getting-started/white-paper

フラッシュローンとは?

フラッシュローンとは、担保を用意することなく同一トランザクション内で借り入れた金額を返済することでのみ資金の借り入れが可能となっているローンのことです。
UniswapやAaveなど多くのDeFiプロトコルがフラッシュローンを提供しています。
フラッシュローン攻撃としてハッキングに使われることがよくありますが、本来の用途はハッキングではなく、アービトラージでプロトコル間の価格差をなくすために利用してもらう機能として提供されています。

ハッキングの手順

ハッキングには、Euler Financeの以下の2つの機能が使われました。
  1. 手数料の保管や損失のカバーなどを行うリザーブへの寄付機能 (donateToReserves)
  2. 最大19倍までレバレッジを効かして借入ができるMint機能 (mint)
そしてこの寄付機能にアカウントのヘルスチェック(担保が十分に存在するか確認する処理)がなかったことを悪用してハッカーは攻撃を成功させました。

実際のトランザクションの1つがこちら。
https://etherscan.io/tx/0xc310a0affe2169d1f6feec1c63dbc7f7c62a887fa48795d327d4d2da2d6b111d


ここからはこのトランザクションをベースに、具体的にどのように攻撃されたか解説していきます。
まず攻撃には、攻撃の起点となったMainのコントラクトと、そこからデプロイされたVaiolatorコントラクト、Liquidatorコントラクトの3つが登場します。
そしてそれぞれのコントラクトが、以下のようなフローで攻撃を成功させます。

<Main Contractによる事前処理>

1) AaveからフラッシュローンでMainが3000万DAIを借りる
2) 攻撃のために2つのコントラクト「Vaiolator」「Liquidator」をデプロイする
3) 3000万DAIをMainからViolatorに送る

<Violator Contractによる精算対象のアカウントの作成>

4) ViolatorがEuler Financeに2000万DAIを入金し、それに応じた1956万eDAI(資産)を受け取る
5) レバレッジをかけ、資産として1億9568万eDAI、負債として2億dDAIをmintする

6) 1000万 DAIを返済し、dDAI残高を1億9000万に減らす
7) 資産に余力が生まれたので、再度レバレッジをかけ1億9568万eDAIと2億dDAIをmintする
8) 資産として保持している4億1093万eDAIのうち、1億をリザーブに寄付する (※ここがハッキングの原因)
9) 結果、eDAIより負債であるdDAIの方が多くなり、精算対象のアカウントとなる

<Liquidator contractによる精算処理実行>

10) LiquidatorがViolatorに対し精算処理を実行し、その報酬として3億1093万eDAIと2億5931万dDAIを取得する
11) 資産であるeDAIの方が多いため、その余力分の3890万DAIを引き出す

<Main Contractによる事後処理>

12) Liquidatorが3890万DAIをMainに送る
13) MainがAaveに3000万DAIを送り、フラッシュローンで借りた分を返済する
14) 結果、890万DAIがMainに残る

ハッキングの原因

上記の「ハッキングの手順」の 8)で実行された寄付機能であるdonateToReservesファンクションにヘルスチェックがなかったことが原因で
す。
こちらが実際のdonateToReservesファンクションのコードです。


ヘルスチェックが行われる場合は、下記のようにcheckLiquidity ファンクションが実行されます。

ヘルスチェックがないということは、負債の状態に関係なく資産を寄付できてしまうことになるため、意図的に精算対象のアカウントを作ることができます。
そしてさらにMint機能で大きな借り入れポジションを作ることで巨額の精算処理となり、リザーブファンドから多額の資金が流出してしまいました。

Euler Financeにおけるハッキングへの対策

Euler Financeでは、定期的なセキュリティ監査の実施、Bug Bountyプログラムの実施、フォーラムにおける提案・ディスカッションなど品質を高めるための仕組みは複数導入されていました。
しかし、それぞれを細かくみていくと、
  • 定期的なセキュリティ監査: ハッキングに利用された寄付機能(donateToReserves)は監査の対象外になっていた。
  • Bug Bountyプログラム: 利用していたプラットフォームがリンク切れになっており、直近は正常に稼働していなかった。
  • フォーラム: 更新内容の提案(eIP-14)、事前デプロイ、ディスカッション、コントラクト更新という手順を踏んでいたが、実際にはディスカッションが活発にはされていなかった。
というように、それぞれの実施状況が十分ではありませんでした。しかし、なぜそのような状況になってしまったのでしょうか。
おそらくそれぞれに理由があって、例えば
  • セキュリティ監査: 定期的に全ての追加機能に対して実施するべきだったが、セキュリティ監査の費用は高額であるため定期的に全ての追加機能に対して実施することができず、費用の問題から対象機能を絞っていた。
  • フォーラム:メジャーなプロトコルでない限りなかなか注目されず人が集まらないため、ディスカッションも多く発生しなかった、
などが考えられます。

まとめ

最終的にこの事件では、Tornadoを使って送金されたトークンなど追跡不能になってしまった一部の資金を除き、ハッカーは盗んだ分を全てEuler Financeに返金しました。これにより、プロトコルが不足分を補填した上で各ユーザーに対して全額返金することができました。これはハッカーの身元を特定できたことで、ハッカーが返金に応じざるを得なくなったからなのではと言われています。
(ちなみに意図は謎ですが、ハッカーはオンチェーン上で謝罪もしています。)
https://etherscan.io/tx/0xedd8102ca037abaeb75ce6a1afe951d2953258392d891ff23510276993a5437c

プログラムを書く以上、いかにツールや仕組みを導入してもバグを0にすることはできません。
しかしDeFiプロトコルをはじめ、ブロックチェーン上には様々な資産が存在している上にスマートコントラクトのコード自体も公開されているため、ハッキングが受けやすい環境にあります。
そのため、なるべくバグをなくすための取り組みは最大限実施した上で、業界全体でハッキングしたら身元が判明するような状態を作り、ハッキングするよりバグはレポートした方が得となるインセンティブが働く世界にしていく必要があるということなのかもしれません。

参考資料

The following two tabs change content below.
Akihiro Tanaka

Akihiro Tanaka

Smart Contract Engineer
Since 2009, I have been a software engineer at Accenture for 9 years, managing, designing, and developing many services, mainly web and mobile apps.
In 2013, I met Bitcoin and started to work on blockchain-related development in 2018, developing an entertainment DApp for underground idols, a blockchain analysis tool, and an STO platform.
Currently, I am working as a Smart Contract Engineer at Secured Finance, developing a DeFi product.

WEB: https://tanakas.org/