DeFiを狙った「フラッシュローン攻撃」とは?Euler Finance(オイラーファイナンス)から263億円もの資金が流出した事件について詳しく解説

2023年3月12日、DeFi(分散型金融)を取り扱うEuler Finance(オイラーファイナンス)が攻撃を受け、1億9,700万ドル(約263億円)もの多額の資金が流出する事件が発生しました。

ここで用いられた攻撃手法は「フラッシュローン攻撃」と呼ばれ、過去にはアバランチ(AVAX)上のDeFiステーキングプラットフォームである「Nereus Finance」が同じ手法で攻撃を受けるなど、DeFiを標的にしたサイバー犯罪に多用されています。

そこでこの記事では、フラッシュローン攻撃の仕組みについてわかりやすく解説した上で、今回起こったEuler Financeへの攻撃や今後の展望について詳細にまとめています。

この記事でわかること

 

寄稿者Levine

 

I am a researcher and Investment associate at Coincheck Labs. I founded a crypto venture and worked as a trader and researcher at Coincheck. On my days off, I study poker.

Twitter: @levine_777  

Euler Finance(オイラーファイナンス)とは?

hoge
出典:Euler Finance

Euler Finance(オイラーファイナンス)とは、イーサリアム(ETH)チェーン上で開発されたDeFiレンディングプロトコルです。

Euler Financeでは、分散型取引所(DEX)であるUniswap(ユニスワップ)(V3)上においてWETH(Wrapped Ethereum)との流動性ペアをもつ全てのトークンを上場させることができ、そこでユーザーは暗号資産の借入と貸付を行うことができます。

Euler Financeの特徴

hoge
出典:Euler Finance

Euler Financeの最も大きな特徴は、担保評価の仕組みとして「階層分け」を行っているという点です。

通常のレンディングプロトコルで採用されている共通プールでは、複数のトークンが担保として扱え、トークンの貸し借りを行うことができます。この仕組みは、複数の通貨を担保にすることで、単独の価値に依存することなく価格変動リスクの軽減が期待できるというメリットがあります。その一方で、悪意のあるユーザーが流動性の低いトークンの価格を操作して価格を吊り上げた後に、そのトークンを担保として扱い、他のトークンを借り入れて持ち逃げするといった問題も度々発生しています。

そのためEuler Financeでは、このような問題に対処するため、上場するトークンが持つリスク特性に応じて、以下の3階層に分類する仕組みが備わっています。

hoge

  1. Isolation Tier
  2. Cross Tier
  3. Collateral Tier

この3階層について、以下で詳しく解説していきます。

階層①:Isolation Tier

hoge

1つ目の階層は「Isolation Tier」です。
この階層に分類されたトークンは、基本的に3つの階層のうち最もリスクが高いとみなされています。

Isolation Tierに分類されたトークンは、そのトークンを担保として使用することができません。また、他のトークンと一緒に同じアカウントから借り入れることもできません。

階層②:Cross Tier

hoge

2つ目の階層は「Cross Tier」です。
この階層に分類されたトークンは、基本的に3つの階層のうち2番目にリスクが高いとみなされています。

Cross Tierに分類されたトークンはIsolation Tierに分類されたトークンと同じく、そのトークンを担保として使用することはできません。一方で、他のトークンと一緒に同じアカウントから借り入れることができます。

階層③:Collateral Tier

hoge

3つ目の階層は「Collateral Tier」です。
この階層に分類されたトークンは、基本的に3つの階層のうち最もリスクが低いとみなされています。

Collateral Tierに分類されたトークンは、そのトークンを担保として使用することや他のトークンと一緒に同じアカウントから借り入れることができます。

以上のように、Euler Financeでは階層分けによってリスクの高いトークンを担保として使用することを制限し、悪意のあるユーザーによる不正を防止する仕組みが備わっています。

フラッシュローン攻撃とは?

hoge

2023年3月12日、DeFi(分散型金融)を取り扱うEuler Finance(オイラーファイナンス)が攻撃を受け、1億9,700万ドル(約263億円)もの多額の資金が流出する事件が発生しました。

ここで用いられた攻撃手法は「フラッシュローン攻撃」と呼ばれ、過去にはアバランチ(AVAX)上のDeFiステーキングプラットフォームである「Nereus Finance」が同じ手法で攻撃を受けるなど、DeFiを標的にしたサイバー犯罪に多用されています。

そもそも「フラッシュローン」とはDeFi特有の仕組みであり、1つのトランザクションの中で借り手が貸し手から無担保で融資を受け、その資金を好きなことに使うことができる仕組みのことを指します。

借り手は融資で調達した資金を通常「裁定取引(アービトラージ)」に使い、利益を得ようとします。暗号資産におけるアービトラージとは、ある暗号資産を価格が低い取引所で買い、価格が高い取引所で売ることで、利益を得ようとする行為のことをいいます。

フラッシュローンでは、融資を受けてから返済するまでの時間は通常数秒程度です。このようなフラッシュローンの仕組みを悪用し、暗号資産の価格を不正に操作して利益を得ようとする行為のことを「フラッシュローン攻撃」といいます。

Euler Financeはどのように攻撃を受け、約263億円もの資金を流出させたのか

hoge

では、Euler Financeはどのようにフラッシュローン攻撃を受け、1億9,700万ドル(約263億円)もの資金を流出させてしまったのでしょうか。実際の攻撃内容を11ステップで解説します。

ステップ①:他のDeFiから資金を借入する

まず攻撃者は、実際に攻撃を行うアカウントとは別に借入を行うアカウントを用意し、AaveやBalancerなどのDeFiのフラッシュローン機能を活用し、資金の借入を行いました。ここでの借入額は3,000万DAIとされています。

ステップ②:借入した資金を別アカウントに送金する

次に攻撃者は、借入した3,000万DAIを、実際に攻撃を行う「攻撃者役のアカウント」に送金を行いました。ここから先の操作は、この攻撃者役のアカウントで行われています。

ステップ③:Euler FinanceにDAIを預け入れ、担保トークンを受け取る

次に攻撃者は、借入れたDAIの一部(2,000万DAI)をEuler Financeに預け入れ、担保トークンであるeDAIを1,950万eDAI分受け取りました。Euler Financeでは、担保や借入の通貨ごとに異なる掛け目が適用されるので、eDAIの数量が50万eDAI目減りしています。

この時点で攻撃者のアカウントには以下のトークンが預けられています。

トークンの種類 残高
トークン(DAI) 1,000万DAI
担保トークン(eDAI) 1,950万eDAI

また、この時点でEuler Financeには2,000万DAIが預けられています。

ステップ④:Euler Financeでレバレッジ10倍のロングポジションを形成する

次に攻撃者はEuler Financeに預け入れた2,000万DAIにレバレッジを10倍かけ、ロング(買い)ポジションを形成しました。これにより攻撃者は、担保トークンを1億9,560万eDAI、負債トークン(dDAI)を2億dDAI分受け取りました。

この時点で攻撃者のアカウントには以下のトークンが預けられています。

トークンの種類 残高
トークン(DAI) 1,000万DAI
担保トークン(eDAI) 2億1,510万eDAI
負債トークン(dDAI) 2億dDAI

また、この時点でEuler Financeには2,000万DAIが預けられています。

ステップ⑤:残していた資産で一部返済する

次に攻撃者は、残していた1,000万DAIで負債トークン1,000万dDAIの返済を行いました。
この時点で攻撃者のアカウントには以下のトークンが預けられています。

トークンの種類 残高
トークン(DAI) 0DAI
担保トークン(eDAI) 2億1,510万eDAI
負債トークン(dDAI) 1億9,000万dDAI

また、この時点でEuler Financeには2,000万DAIが預けられています。

ステップ⑥:追加でレバレッジ10倍のロングポジションを形成する

次に攻撃者は、もう一度Euler Financeに預け入れた2,000万DAIにレバレッジを10倍かけ、ロング(買い)ポジションを形成しました。これにより攻撃者は、担保トークンを1億9,560万eDAI、負債トークン(dDAI)を2億dDAI分受け取りました。

この時点で攻撃者のアカウントには以下のトークンが預けられています。

トークンの種類 残高
トークン(DAI) 0DAI
担保トークン(eDAI) 4億1,070万eDAI
負債トークン(dDAI) 3億9,000万dDAI

また、この時点でEuler Financeには2,000万DAIが預けられています。

ステップ⑦:コントラクトに一部の担保を寄付

次に攻撃者は、コントラクトに一部の担保トークン(1億eDAI)の寄付を行いました。

この時点で攻撃者のアカウントには以下のトークンが預けられています。

トークンの種類 残高
トークン(DAI) 0DAI
担保トークン(eDAI) 3億1,070万eDAI
負債トークン(dDAI) 3億9,000万dDAI

また、この時点でEuler Financeには2,000万DAIが預けられています。

ステップ⑧:アカウントが債務超過状態に陥り、清算が実行される

ステップ⑦で1億eDAIを寄付したことにより、攻撃者のアカウントでは負債トークンの額が担保トークンの額を上回りました。これにより、強制的に清算が実行される状態になります。

なおDeFiにおいては、通常は寄付によって恣意的に自らを債務超過に陥らせる行為は制限されていますが、Euler Financeでは寄付を行うアカウントの財務状況をチェックする機能がついていませんでした。攻撃者はこの脆弱性を狙い、攻撃を行ったのです。

ステップ⑨:別のアカウントで攻撃者役の債務を引き取り、清算を実行する

ここで、さらに別の清算人役のアカウントを用意し、攻撃者役のアカウントの債務を引き取って清算を実行しました。このとき、受け取った担保トークン(eDAI)に対して負債トークンは25%以上多いです。そのため負債額は手数料分含め、約35%割り引かれて評価され、清算が実行されます。

清算実行直前の時点で、清算人役のアカウントには以下のトークンが預けられています。

トークンの種類 残高
担保トークン(eDAI) 3億1,070万eDAI
負債トークン(dDAI) 2億5.900万dDAI

ステップ⑩:清算人役のアカウントに報酬が付与される

Euler Financeでは、清算を実行した清算人には報酬として生産した担保額を割り増し評価した数量のDAIが付与される仕組みになっています。そして今回の攻撃では、大幅に債務超過したアカウントを清算したため、報酬として最大の20%割増が行われる予定でした。

しかしそれに加え、借入枚数が大きすぎたことにより報酬の計算レートが歪み、結果として約30%以上もの割増評価が行われ、3,890万DAIが付与されることとなりました。

ステップ⑪:借入れた資金の返済を行う

最後に攻撃者は、ステップ①で借入れた資金である3,000万DAIと手数料である2.7万DAIをAaveなどのDeFiに支払いました。

その結果、攻撃者の手元には約887.8万DAIが手元に残り、今回Euler Financeから攻撃者が奪い取った利益となります。

実際の攻撃内容をトランザクション履歴を使って解説

以上のように攻撃者たちは、Euler Financeから多額のDAIを奪い取りましたが、その他にも攻撃者は同様の手法でWETH、WBTC、wstETH、USDC、stETHなど、合計1億9,700万ドル(約263億円)もの資金を流出させました。

ここでは、攻撃者とEuler Financeのトランザクション履歴を使って、実際の攻撃内容を確認してみましょう。

※Euler Financeから清算人として、割増で付与された報酬から借入額を引くと被害額になります。

3月13日17時50分、8.9M DAI($8.8M)の差益発生

hoge

割増で付与された報酬 借入額 被害額
38.905M(DAI) 30.027M(DAI) 8.878M(DAI)

17時56分、8K WETH($14.1M)の差益発生

hoge

割増で付与された報酬 借入額 被害額
28.994K(WETH) 20.895K(WETH) 8.099K(WETH)

18時3分 849 WBTC($18.6M)の差益発生

hoge

割増で付与された報酬 借入額 被害額
3.849K(WBTC) 3K(WBTC) 0.849K(WBTC)

18時4分、66K wstETH($116.7M)の差益発生

hoge

割増で付与された報酬 借入額 被害額
264.271K(wstETH) 198K(wstETH) 66.271K(wstETH)

18時4分、34M USDC($34M)の差益発生

hoge

割増で付与された報酬 借入額 被害額
244.41M(USDC) 210M(USDC) 34.41M(USDC)

18時8分 3.8K stETH($6.7M)の差益発生

hoge

割増で付与された報酬 借入額 被害額
24.79K(stETH) 20.895K(stETH) 3.895K(stETH)

Euler Financeはなぜ攻撃を受けてしまったのか

hoge

ここではEuler Financeがフラッシュローン攻撃を受けてしまった理由について解説します。今回のEuler Financeへの攻撃は「寄付を行うアカウントの財務状況をチェックする機能がついていない」という脆弱性が放置されていたことが原因でした。

なぜこのような脆弱性が放置されていたかというと、大きく分けて次の2つの理由が考えられます。

  • Euler Financeチームによる見落とし

  • コード監査企業による見落とし
  • 以下で詳しく解説します。

    理由①:Euler Financeチームによる見落とし

    脆弱性が放置されていた1つ目の理由は「Euler Financeチームによる見落とし」です。

    今回のフラッシュローン攻撃を受ける直接的な原因となった寄付機能(donate ToReseves)は、2022年7月のeIP-14(コントラクトアップグレード)にて導入されました。

    この際、もしEuler Financeの開発チームが、「寄付を行うユーザーが寄付を行うことで債務超過に陥るかどうか」をチェックするタスク(ヘルスチェック)を導入できていれば、今回の資金流出は阻止できたのかもしれません。

    理由②:コード監査企業による見落とし

    脆弱性が放置されていた2つ目の理由は「コード監査企業による見落とし」です。

    Euler FinanceにeIP-14が導入された月に、コード監査会社であるSHERLOCK社はEuler Financeの監査を行っていました。しかし、その際SHERLOCK社は寄付を行うユーザーへのヘルスチェック(財務状況確認)がないことを見つけられませんでした。

    そのため、この脆弱性はeIP-14の導入から攻撃を受けるまでの約8ヶ月間放置されていたことになります。

    また今回の事件を受け、SHERLOCK社はEuler Financeの脆弱性を見つけられなかったとして、330万ドルもの賠償金をEuler Financeへ支払いました。なお、コード監査企業が賠償金を支払ったのは、暗号資産業界の歴史で初の事例となります。

    連鎖的被害を受けたプロトコルの一覧

    hoge

    今回のフラッシュローン攻撃により、Euler Finance以外にも数々のプロトコルが連鎖的被害を受けています。以下の表では、連鎖的被害を受けた代表的なプロトコルとその被害額、そして被害を受けた理由をまとめています。

    プロトコル名 被害額 被害の詳細
    Angle Protocol 1,730万(agEUR) 攻撃者たちによって1,730万agEURがCoreモジュールを通じて発行された。
    Balancer 1,190万(bbeUSD) 攻撃を受けた際、bbeUSD(Euler Boosted USD)プールからEulerに1,190万ドルが送金された。
    Temple DAO 500万(TEMPLE) 攻撃の後、Temple DAOから500万TEMPLEが流出したことが発覚した。またこの影響により、TEMPLEの価格が30%下がった。
    Idle DAO 5,000ドル以内 -
    SwissBorg 2,600万(ETH),1,700万(USDT) Euler Financeへの攻撃により、SwissBorgのSmart Yeild Programの一部が影響を受けた。その結果、2,600万(ETH)と1,700万(USDT)の損失を計上した。
    Yeild Protocol 150万ドル未満 攻撃によって、Yeild Protocolのメインネットの流動性プールに影響があった。利回り流動性プールには、Euler eToken と Yield fyToken の 2 つの資産があり、攻撃前に保持されていた Euler eToken合計金額は 150 万米ドル未満であると考えられている。
    Yearn 138万ドル Euler Financeへの攻撃の影響を間接的に受け、その被害額はyvUSDTとyvUSDCで合計138万ドルに上った。なお、開発者たちは影響を受けたプロトコルに対処しており、残っている不良債権はYearn Treasuryによってカバーされる予定。
    Inverse Finance 86万ドル 今回の攻撃によってBalancerのDOLA-bb-e-USDプールが被害に遭い、その影響でInverse Financeは86万ドルの損失を計上した。

    なお、上記に記した以外にもその他7つのプロトコルでも被害が確認されています。

    多くの著名なプロトコルやユーザーから信頼を得ていた

    ここまで被害が大きくなった原因は、Euler Financeが多くの著名なプロトコルやユーザーから信頼を得ていたことも一因となっています。では、なぜEuler Financeはここまで信頼を得ていたのでしょうか。

    その一つの理由は「過去に何度も監査を受けていた」ことが挙げられます。Euler Financeは、2021年12月にメインローンチをする前から2022年12月にかけて、6社のコード監査企業から10回以上の監査を受けていました。しかし結果的には、監査企業による脆弱性の見落としによって今回のフラッシュローン攻撃を受けてしまったのも事実です。

    また、EulerFinanceはバグを見つけた人へ最大100万ドルの報奨金を用意していたことも、Euler Financeに信頼が置かれるきっかけになったのかもしれません。

    運営の交渉により、返還に動いた攻撃者

    hoge

    Euler Financeは攻撃を受けたあと、すぐに攻撃者とコンタクトをとりました。その結果、運営の交渉により、攻撃者は奪った資金の返還へと動きます。ここでは、Euler Financeが攻撃を受けたあとから攻撃者が返還へと動くまでの流れを時系列順に解説します

    被害直後、運営は攻撃者のアドレスへ交渉に応じるかのメッセージを送信

    Euler Financeは攻撃を受けたあと、すぐに攻撃者のアドレスに交渉に応じるようメッセージを送信します。以下は実際のメッセージです。

    【原文】

    We understand that you are responsible for this morning's attack on the Euler platform. We are writing to see whether you would be open to speaking with us about any potential next steps.

    【編集部訳】

    今朝のEulerのプラットフォームへの攻撃は、あなたの責任であると理解しています。私たちは、あなたが次のステップの可能性について、私たちと話すことに前向きであるかどうかを確認するために書いています。

    3月13日19時、攻撃者は資金の一部を分割してTornadcashへ

    3月13日19時、攻撃者は資金の一部(1,100ETH)を11回に分けて追跡を困難にすることができるTornadcashへ送金を行いました。

    3月16日10時、100ETHを被害者である個人(Solidyの開発者)に返還

    3月16日10時、攻撃者たちは100ETHを被害者である個人(アルゼンチンに住むSolidy開発者)に返還しました。この個人は、前日に犯人のアドレスへ資金を返還することをお願いするメッセージを送っています。

    【原文】

    Please consider returning 90%/80%. I’m just a user that only had 78 wstETH as my life savings deposited into Euler. I'm not [a] whale or millionaire.

    You can’t imagine the mess I’m into right now, completely destroyed. I’m pretty sure 20M is already life changing for you and you’ll bring back joy to a lot of affected people.

    【編集部訳】

    90%/80%の返却をご検討ください。私はEulerに生涯貯金をたった78wstETHだけ預けた、ただのユーザーで、クジラでも大富豪でもないんですから。

    今私が陥っている混乱は想像もつかないでしょう、完全に破壊されていますよ。2,000万ドルはもうあなたにとって人生を変えたものだと確信していますし、影響を受けた多くの人々に喜びを取り戻させることでしょう。

    3月17日12時、100ETHをRonin Bridge攻撃の犯人アドレスに送金

    3月17日12時、攻撃者は100ETHを北朝鮮のラザルスグループが行なったとされるRonin Bridge攻撃の犯人アドレスへ送金を行いました。攻撃者がラザルスグループの犯行と見せかけたいのか、それとも攻撃者が本当にラザルスグループの一員なのかはわかっていません。

    3月18日15時、3,000ETHを3回に分けてEuler Financeへ返還

    3月18日15時、攻撃者はEuler Financeに対し、3,000ETHを3回に分けて返還を行いました。同時に犯人は、イーサリアムネットワークに謝罪文を投稿しています。

    3月25日12時、51,000ETHをEuler Financeへ返還

    3月25日12時、攻撃者は51,000ETHをEuler Financeへ返還しました。ここで変換されたETHは、被害額全体の43%に当たります。

    3月26日0時、ETHとDAIの一部を分割してEuler Financeへ返還

    3月26日0時、攻撃者は30,952ETHを4回、4,300万DAIを4回にそれぞれ分けてEuler Financeへ返還を行いました。

    3月28日10時、攻撃者が謝罪のメッセージをEuler Financeのアドレスへ送信

    3月28日10時、攻撃者はEuler Financeのアドレスへ謝罪のメッセージを送信しました。以下は、攻撃者が送信した謝罪文です。

    【原文】

    Jacob here. I don’t think what I say will help me in any way but I still want to say it. I fucked up. I didn’t want to, but I messed with others’ money, others’ jobs, others’ lives. I really fucked up. I’m sorry. I didn’t mean all that. I really didn’t fucking mean all that. Forgive me.

    【編集部訳】

    Jacobです。私が何を言っても何の役にも立たないだろうけど、それでも言いたい。俺はしくじった。他人の金、仕事、人生を台無しにしてしまった。本当にしくじったんだ。ごめんよ。そんなつもりじゃなかったんだ。本当にそんなつもりじゃなかったんだ。許してくれ。

    4月3日19時、残っていた10,580ETHを2回に分けてEuler Financeへ返還

    4月3日19時、攻撃者は残っていた10,580ETHを2回に分けてEuler Financeへ返還しました。これで、合計9万5,000ETHと4,300万DAI(金額にして2億2,200万ドル)の資産が変換されました。

    なお、ドルベースで流出額を上回っているのは、返還までにETHの価格が17%上昇したのに対して犯人の手元には1%以下の資産(1,100ETH)しか残っていないからです。

    4月5日0時 Euler Financeから資金回収完了のお知らせが発表

    hoge
    引用:@eulerfinance(Twitter)

    4月5日0時、Euler Financeから資金回収完了のお知らせが発表されました。

    4月6日5時 Euler Financeが、今後のユーザーへの返還計画を公表する

    hoge

    引用:@eulerfinance(Twitter)

    4月6日5時、Euler Financeが、今後のユーザーへの返還計画を公表しました。この返済計画によると、返還はETH、DAI、USDCの3つの資産で請求が可能であり、返還後余剰となった資産は公平に分配されるとのことです。

    Euler Financeの今後の展開は?

    今回の攻撃者が、最終的に得た利益は流出させた金額の1%未満であり、ユーザーやEuler Financeとしては返還までの期間にETH価格が上昇した事により、資産は割増で帰ってきて一件落着となりそうです。

    しかし、攻撃者は捜査拡散目的に行なったであろう北朝鮮のハッカー集団ラザルスグループのアドレスに一部の送金を行なってしまったことで、国際的な北朝鮮制裁に違反したと見られ、今後も捜査当局によって追跡は継続されるであろうといった話も浮上しています。