Back to Blog

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

Code Auditing
2024年2月9日
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
安全な保管を超えて、第2部:ウォレットの暗号技術を安全に実装する
Security Insights

安全な保管を超えて、第2部:ウォレットの暗号技術を安全に実装する

攻撃者は、保護された秘密鍵のコピーを読み取らずに、その秘密鍵を復元できるのでしょうか。『Beyond Secure Storage』の第2部では、乱数の品質不足、エントロピーの損失、署名用ノンスの不備によって鍵の予測や復元が可能になった6件の事例を検証します。そこから鍵生成と署名に関する実装要件を導き出し、決済機関がコードレビューと導入済みシステムのテストを通じて、それらをどう評価できるかを説明します。

安全な保管を超えて、第1部:安全な決済・署名ワークフローの設計
Security Insights

安全な保管を超えて、第1部:安全な決済・署名ワークフローの設計

攻撃者が秘密鍵を盗まずに、認可されていない操作が有効な署名を得ることは、なぜ可能なのでしょうか。「安全な保管の先へ」第1回では、Bitget、Bybit、Binanceなどの事例を通じて、支払い要求、トランザクションの構築、署名、実行、決済の各段階における認可の不備を検討します。そのうえで、認可されていない操作を防ぎ、損失を抑えるための設計原則を導き出し、レビュー、監査、ペネトレーションテスト、演習によって、それらの防御策をどう検証できるかを説明します。

NEAR Intentsの悪用:返金処理の欠陥とセキュリティ上の教訓
Security Insights

NEAR Intentsの悪用:返金処理の欠陥とセキュリティ上の教訓

NEAR Intentsへの攻撃では、過大な払い戻しイベントを利用し、預け入れた資産が返還された後も内部残高を維持しました。本分析では、レシートの処理の流れと、合計3,865,021 USDTに上るBNB Chainでの7件の出金を再構成します。また、これらの資金流出とプロジェクトが報告した全額回収を区別し、NEARスマートコントラクトの開発と監査におけるセキュリティ上の考慮事項を示します。

Best Security Auditor for Web3

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

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