2023年3月13日、当社のシステムはEuler Financeのレンディングプールがフラッシュローン攻撃を受け、1億9700万ドルの損失が発生したことを検知しました。私たちはまずコミュニティに警告を発し、その後根本原因の特定を助けるための分析を提供しました。
1/ @eulerfinance is attacked. The root cause is due to the lack of liquidity check in the function donateToReserves()https://t.co/stWtPWK900
— BlockSec (@BlockSecTeam) March 13, 2023
See the detailed attack steps below. https://t.co/bm10OJHiXu pic.twitter.com/TDbYuzVWHe
このインシデントの根本原因は、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)
攻撃の手順は以下の通りです(最初の攻撃トランザクションを例として):
- 攻撃者はAAVEでフラッシュローンを使用して3000万DAIを借り入れました。
- 攻撃者は2000万DAIを預け入れ、2000万eDAIを受け取りました。
- Euler Financeがレバレッジ借入機能を提供しているため、攻撃者は1億9500万eDAIと2億dDAIを発行することができました。この時点で攻撃者は2億1500万eDAIと2億dDAIを保有しています。
- 上記の続き。1000万の負債が返済され、攻撃者はさらに多くのeDAIを発行できるようになりました。この時点で攻撃者は2億1500万eDAIと1億9000万dDAIを保有しています。
- ステップ3が繰り返されました。この時点で攻撃者は4億1000万eDAIと3億9000万dDAIを保有しています。
- 攻撃者は
donateToReserve関数を呼び出して1億eDAIを寄付しました。しかしこのプロセス中、攻撃者のヘルスファクターはチェックされませんでした。この結果、ポジションは清算可能な状態となり(3億1000万eDAI対3億9000万dDAI)、利益を得る機会が生まれました。 - 攻撃者は別のアドレスのコントラクトを清算者(0xa0b3...)として使用してポジションを清算しました。清算者(0xa0b3...)は3億1000万eDAIと2億5900万dDAIを受け取りました。
- 攻撃者は清算者のポジション(0xa0b3...)において3890万eDAIをバーンして3890万DAIを引き出しました(支払い不能チェックのためそれ以上は引き出せません)。
- 攻撃者はフラッシュローンを返済しました。
主要な攻撃ステップ2〜7はトランザクショントレースにラベル付けされています。

まとめ
これは2023年最大のハッキング事件であり、フェデリコ・ハイメという名の20歳のアルゼンチン人によって記録破りの1億9700万ドルが盗まれました。彼はメディアに対して「複雑で、時に混乱を招き、さらには矛盾さえある」語りを提供しました。それでも、「回収可能な資金のすべて」は後にEuler Financeの財務アドレスに返還されました。しかし、少額(約20万ドル)が「意図せず」ラザルスグループ—米国財務省から制裁を受けた北朝鮮の国家支援サイバー犯罪組織と言われている—に送られてしまいました。詳細で興味深い話については、link2 および link2 をご参照ください。
このインシデントの根本原因は支払い不能チェックの欠如であり、これは重要な教訓となります。実際、レンディングプロトコルにおいては、ユーザーのポジションに影響を与える可能性のあるあらゆる処理に対してポジションのヘルスチェックを実装すべきかどうかを評価することが重要です。また、プロジェクトチームはレンディングプロトコルにおける大規模な清算を積極的に監視し、このような事態を迅速に検知して対応するための効果的なアラートシステムを構築する必要があります。
このシリーズの他の記事を読む:
- 導入:2023年のトップ10「驚異的な」セキュリティインシデント
- #1: Flashbotsリレーの脆弱性を悪用したMEVボットの収奪
- #3: KyberSwapインシデント:極めて巧妙な計算による丸め誤差の卓越した悪用
- #4: Curveインシデント:コンパイラエラーが無害なソースコードから欠陥バイトコードを生成
- #5: Platypus Finance:幸運に助けられた3度の攻撃からの生き残り
- #6: Hundred Financeインシデント:脆弱なフォークプロトコルにおける精度関連エクスプロイトの波を触媒
- #7: ParaSpaceインシデント:業界で最も重大な攻撃を阻止するための時間との競争
- #8: SushiSwapインシデント:不手際な救出試みが一連のコピーキャット攻撃を招く
- #9: MEVボット0xd61492:巧妙なエクスプロイトにより捕食者から獲物へ
- #10: ThirdWebインシデント:信頼されたモジュール間の非互換性が脆弱性を露呈



