Back to Blog

#2: Eulerファイナンス事件:2023年最大のハッキング

Code Auditing
February 9, 2024
7 min read

2023年3月13日、当社のシステムはEuler Financeのレンディングプールがフラッシュローン攻撃を受け、1億9700万ドルの損失が発生したことを検知しました。私たちはまずコミュニティに警告を発し、その後根本原因の特定を助けるための分析を提供しました。

このインシデントの根本原因は、donateToReserves() 関数における支払い不能チェックの欠如にあります。具体的には、脆弱なコントラクトがユーザーの担保をプロトコルに寄付する機能を提供しているにもかかわらず、ユーザーのポジションが健全であるかどうかを確認していませんでした。さらに悪いことに、この不良ポジションを解消するために、プロトコルは清算者に対して少ない負債額でポジションを清算できる大幅な割引を提供していました。攻撃者はこの機能を悪用して大きなポジションを作り出し、そのポジションを支払い不能状態にしました。その後、攻撃者は割引価格で自身の担保を購入することで利益を得ることができました。

背景

Euler Financeの概要

Euler FinanceはEthereum上のレンディングプロトコルであり、ユーザーが指定されたトークンを貸し借りすることができます。レンダーがEulerの流動性プールに預け入れを行うと、対応する量のEToken(利息を生む ERC20トークン)が発行されてレンダーに送られます。これらのETokenは預け入れた原資産と交換することができます。

一方、流動性を受け取った借り手にはDTokenが発行されます。これらのDTokenはERC20準拠であり、保有者が独自にバーンすることを防ぐ仕組みになっています。具体的には、トークンを誰にでも送ることを許可するのではなく、誰でも受け取ることができますが、受け取るには承認が必要です。原資産の観点から、借り手はローンの利息を支払う責任があり、その利息の一部はプロトコル上の不良債権をカバーするために使用されます。

Euler Financeのレバレッジ借入(別名:セルフボロー)とソフト清算メカニズムは、この攻撃の原因をより深く理解するための2つの重要な概念です。

レバレッジ借入

Euler Financeはレバレッジ借入機能を提供しており、ユーザーが再帰的な借入戦略をシミュレートできます。簡単に言えば、ユーザーは担保を預け入れてETokenを発行し、そのETokenをさらに担保としてより多くのETokenを借り入れることができます。コントラクトは対応する量のdTokenを負債トークンとして発行します。ユーザーのポジションの健全性は、ETokenとdTokenの値に基づいて計算されます。Euler Financeのドキュメントによると、ユーザーは最大19倍のレバレッジをかけることができます。レバレッジ借入機能はこのインシデントにおいて重要な役割を果たしました。この機能の助けがなければ、攻撃者は利益を得ることができなかったでしょう。レバレッジ借入を通じて、攻撃者はフラッシュローンで得た初期資金の約11倍にまでポジションサイズを拡大しました。

ソフト清算

Euler Financeのホワイトペーパーに概説されているように、ソフト清算メカニズムにより、清算者は被清算者の負債を柔軟に返済することができます。CompoundやAaveなどのプロトコルが採用しているような固定係数による清算に縛られることはありません。ソフト清算とは、ポジションの健全性が低いほど、清算対象となる担保の割合が高くなるというもので、このインシデントのデータによると、不良債権の場合は最大75%まで清算可能です。大幅に割引された担保の清算により、攻撃者はフラッシュローンを返済し、利益を確保することができました。

脆弱性分析

主な脆弱性、すなわち支払い不能チェックの欠如は、donateToReserves() 関数内に存在します。この関数は、ユーザーが自分のポジションからETokenをプロトコルのリザーブに寄付として転送するために使用されます。通常のユーザーにとって、このような操作を行うインセンティブや動機は基本的にありません。実際、脆弱性は donateToReserves() 関数がユーザーポジションからETokenを転送する際にヘルスチェックを実行しないという事実にあります。これにより、攻撃者はレバレッジ借入によって作成された大きなポジションから直接ETokenを寄付し、ポジションの健全性を100%以下に低下させて不良債権を生じさせることができます。

設計上、Euler Financeはダイナミッククローズファクターを使用してポジションを「ソフト清算」します。簡単に言えば、ポジションの健全性が低いほど、そのポジション内の担保のうち清算可能な割合が高くなります。不良債権の場合、清算割合はポジション内の担保の最大75%に達することがあります(実際の攻撃トランザクションに基づいて計算)。その結果、大幅に割引された大量の担保が清算されることで、攻撃者はフラッシュローンを返済して利益を得ることができます。

攻撃分析

異なるプールを標的とした複数の攻撃トランザクションが存在します:

  • 0xc310a0affe2169d1f6feec1c63dbc7f7c62a887fa48795d327d4d2da2d6b111d (DAI)
  • 0x71a908be0bef6174bccc3d493becdfd28395d8898e355d451cb52f7bac38617 (WBTC)
  • 0x62bd3d31a7b75c098ccf28bc4d4af8c4a191b4b9e451fab4232258079e8b18c4 (wstETH)
  • 0x465a6780145f1efe3ab52f94c006065575712d2003d83d85481f3d110ed13d9 (USDC)
  • 0x3097830e9921e4063d334acb82f6a79374f76f0b1a8f857e89b89bc58df1f311 (stETH)
  • 0x47ac3527d02e6b9631c77fad1cdee7bfa77a8a7bfd4880dccbda5146ace4088f (WETH)

攻撃の手順は以下の通りです(最初の攻撃トランザクションを例として):

  1. 攻撃者はAAVEでフラッシュローンを使用して3000万DAIを借り入れました。
  2. 攻撃者は2000万DAIを預け入れ、2000万eDAIを受け取りました。
  3. Euler Financeがレバレッジ借入機能を提供しているため、攻撃者は1億9500万eDAIと2億dDAIを発行することができました。この時点で攻撃者は2億1500万eDAIと2億dDAIを保有しています。
  4. 上記の続き。1000万の負債が返済され、攻撃者はさらに多くのeDAIを発行できるようになりました。この時点で攻撃者は2億1500万eDAIと1億9000万dDAIを保有しています。
  5. ステップ3が繰り返されました。この時点で攻撃者は4億1000万eDAIと3億9000万dDAIを保有しています。
  6. 攻撃者は donateToReserve 関数を呼び出して1億eDAIを寄付しました。しかしこのプロセス中、攻撃者のヘルスファクターはチェックされませんでした。この結果、ポジションは清算可能な状態となり(3億1000万eDAI対3億9000万dDAI)、利益を得る機会が生まれました。
  7. 攻撃者は別のアドレスのコントラクトを清算者(0xa0b3...)として使用してポジションを清算しました。清算者(0xa0b3...)は3億1000万eDAIと2億5900万dDAIを受け取りました。
  8. 攻撃者は清算者のポジション(0xa0b3...)において3890万eDAIをバーンして3890万DAIを引き出しました(支払い不能チェックのためそれ以上は引き出せません)。
  9. 攻撃者はフラッシュローンを返済しました。

主要な攻撃ステップ2〜7はトランザクショントレースにラベル付けされています。

まとめ

これは2023年最大のハッキング事件であり、フェデリコ・ハイメという名の20歳のアルゼンチン人によって記録破りの1億9700万ドルが盗まれました。彼はメディアに対して「複雑で、時に混乱を招き、さらには矛盾さえある」語りを提供しました。それでも、「回収可能な資金のすべて」は後にEuler Financeの財務アドレスに返還されました。しかし、少額(約20万ドル)が「意図せず」ラザルスグループ—米国財務省から制裁を受けた北朝鮮の国家支援サイバー犯罪組織と言われている—に送られてしまいました。詳細で興味深い話については、link2 および link2 をご参照ください。

このインシデントの根本原因は支払い不能チェックの欠如であり、これは重要な教訓となります。実際、レンディングプロトコルにおいては、ユーザーのポジションに影響を与える可能性のあるあらゆる処理に対してポジションのヘルスチェックを実装すべきかどうかを評価することが重要です。また、プロジェクトチームはレンディングプロトコルにおける大規模な清算を積極的に監視し、このような事態を迅速に検知して対応するための効果的なアラートシステムを構築する必要があります。

このシリーズの他の記事を読む:

Sign up for the latest updates
〜80万ドルの損失:HinkalのDouble-Spend攻撃 | BlockSec週次レポート
Security Insights

〜80万ドルの損失:HinkalのDouble-Spend攻撃 | BlockSec週次レポート

2026年6月29日〜7月5日の週次セキュリティレポートでは、Ethereumで約80万ドルの損失をもたらした1件の重大インシデントを取り上げます。Hinkalのシールドプールプロトコルが二重支払い攻撃により流出。旧ノート形式の欠陥を悪用し、単一デポジットから複数のnullifierを導出したと見られます。回路レベルの脆弱性、攻撃フロー、nullifierベースのプライバシープロトコルへの影響を分析します。

ニュースレター - 2026年6月
Security Insights

ニュースレター - 2026年6月

本月報は2026年6月の主要セキュリティインシデント3件を対象とし、確認済み損失総額は約2,200万ドルです。高度なハニーポット攻撃がトークン許可の未検証を悪用し、JaredFromSubwayのMEVボットから約1,500万ドルを流出。旧型Aztecロールアップ2件はプルーフ決済の境界ギャップにより約435万ドルを損失。SecondFiのEd25519実装欠陥により374ウォレットの秘密鍵が露出し約240万ドルが流出。3件に共通するのは、表面上は保たれているように見えたセキュリティ保証が実際には機能していなかった点です。

約400万ドルの損失:TaikoとSecondFiのエクスプロイト|BlockSec週次レポート
Security Insights

約400万ドルの損失:TaikoとSecondFiのエクスプロイト|BlockSec週次レポート

2026年6月22〜28日のブロックチェーンセキュリティ報告:EthereumとCardanoで約410万ドルの損失を確認。Taikoブリッジ攻撃はSGX署名鍵の露出と不完全なアテステーションポリシーを悪用し、悪意のあるプルーバー登録とL2状態証明の偽造を可能にした。SecondFiはEd25519ナンス導出の欠陥により、公開Cardanoトランザクションから秘密鍵の復元が可能となった。

Best Security Auditor for Web3

Validate design, code, and business logic before launch. Aligned with the highest industry security standards.

BlockSec Audit