2023年3月13日、私たちのシステムは、Euler Financeのレンディングプールがフラッシュローン攻撃を受け、1億9,700万ドルの損失が発生したことを検知しました。私たちはまずコミュニティに警告を発し、その後、根本原因の特定に役立つ分析を提供しました。
1/ @eulerfinance が攻撃を受けました。根本原因は関数 donateToReserves() における流動性チェックの欠如です。https://t.co/stWtPWK900
— BlockSec (@BlockSecTeam) 2023年3月13日
詳細な攻撃手順は以下を参照してください。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を追加で借り入れることができます。コントラクトは、対応する量のdTokenを負債トークンとして鋳造します。ユーザーのポジションの健全性は、ETokenとdTokenの値に基づいて計算されます。Euler Financeのドキュメントによると、ユーザーは最大19倍までレバレッジをかけることが可能です。このレバレッジ借入機能は、本件において極めて重要な役割を果たしました。この機能がなければ、攻撃者は利益を上げることができなかったでしょう。レバレッジ借入を通じて、攻撃者はフラッシュローンから得た初期資金の約11倍までポジションサイズを拡大させました。
ソフト清算
Euler Financeのホワイトペーパーで概説されているように、ソフト清算メカニズムにより、清算人はCompoundやAaveのようなプロトコルが採用している固定係数による強制清算ではなく、柔軟に債務を返済できるよう支援することが可能です。ソフト清算とは、ポジションの健全性が低いほど、より多くの担保が清算対象となることを意味します。今回のインシデントのデータによれば、不良債権が発生した場合、最大75%までの担保が清算対象となります。したがって、大幅に割引された担保の清算により、攻撃者はフラッシュローンを返済し、利益を確保することが可能となりました。
脆弱性分析
主な脆弱性、すなわち支払能力チェックの欠如は、donateToReserves() 関数内に存在します。この関数は、ユーザーが自身のポジションからETokenを寄付としてプロトコルの準備金に送金するために使用されます。通常のユーザーにとって、このような行為を行うインセンティブや動機は通常ありません。実際、この脆弱性は、ユーザーのポジションからETokenを転送する際に donateToReserves() 関数が健全性チェックを行っていないという事実に起因します。これにより、攻撃者はレバレッジ借入によって作成された巨大なポジションから直接ETokenを寄付することが可能となり、ポジションの健全性を100%未満に低下させ、不良債権を引き起こすことができました。

設計によると、Euler Financeは動的なクローズ係数を使用してポジションを「ソフト清算」します。端的に言えば、ポジションの健全性が低いほど、そのポジション内の担保のうち清算可能な割合が高くなります。不良債権の場合、清算される割合は(実際の攻撃トランザクションに基づいて計算すると)ポジション内の担保の最大75%に達する可能性があります。その結果、大幅に割引された相当量の担保が清算されることで、攻撃者はフラッシュローンの返済のみならず、利益を得ることができたのです。
攻撃分析
異なるプールを標的とした複数の攻撃トランザクションが存在します:
- 0xc310a0affe2169d1f6feec1c63dbc7f7c62a887fa48795d327d4d2da2d6b111d (DAI)
- 0x71a908be0bef6174bccc3d493becdfd28395d8898e355d451cb52f7bac38617 (WBTC)
- 0x62bd3d31a7b75c098ccf28bc4d4af8c4a191b4b9e451fab4232258079e8b18c4 (wstETH)
- 0x465a6780145f1efe3ab52f94c006065575712d2003d83d85481f3d110ed13d9 (USDC)
- 0x3097830e9921e4063d334acb82f6a79374f76f0b1a8f857e89b89bc58df1f311 (stETH)
- 0x47ac3527d02e6b9631c77fad1cdee7bfa77a8a7bfd4880dccbda5146ace4088f (WETH)
攻撃手順は以下の通りです(最初の攻撃トランザクションを例にします):
- 攻撃者はAAVEにてフラッシュローンで3,000万DAIを借り入れました。
- 攻撃者は2,000万DAIを預け入れ、2,000万eDAIを受け取りました。
- Euler Financeはレバレッジ借入機能を提供しているため、攻撃者は1億9,500万eDAIと2億dDAIを鋳造できました。この時点で攻撃者は2億1,500万eDAIと2億dDAIを保有しています。
- 上記を継続。攻撃者がより多くのeDAIを鋳造できるよう、1,000万の負債を返済しました。現在攻撃者は2億1,500万eDAIと1億9,000万dDAIを保有しています。
- 手順3を繰り返しました。現在攻撃者は4億1,000万eDAIと3億9,000万dDAIを保有しています。
- 攻撃者は donateToReserve 関数を呼び出し、1億eDAIを寄付しました。しかし、このプロセス中に攻撃者のヘルスファクターはチェックされませんでした。この結果、ポジションは清算可能となり(eDAI 3億1,000万 vs dDAI 3億9,000万)、利益を得る機会が生まれました。
- 攻撃者は清算人として別のアドレスコントラクト (0xa0b3...) を使用してポジションを清算しました。清算人 (0xa0b3...) は3億1,000万eDAIと2億5,900万dDAIを受け取りました。
- 攻撃者は清算人のポジション (0xa0b3...) 内で3,890万eDAIをバーンし、3,890万DAIを引き出しました(支払能力チェックにより、それ以上は引き出せませんでした)。
- 攻撃者はフラッシュローンを返済しました。
主要な攻撃ステップ2~7がトランザクション履歴に記録されています。

まとめ
これは2023年最大のハッキング事件であり、当時20歳のアルゼンチン人Federico Jaimeによって、記録的な1億9,700万ドルが盗まれました。彼はメディアに対し「複雑で、時に支離滅裂で、矛盾すら含む語り」を披露しました。それにもかかわらず、「回収可能な資金のすべて」は後にEuler Financeのトレジャリーアドレスに返却されました。しかし、わずかな一部(約20万ドル)が「意図せず」米国財務省から制裁を受けている北朝鮮の関与が疑われる犯罪組織ラザログループに送金されました。詳細で興味深いストーリーについては、これらのリンク(link1 および link2)を参照してください。
本インシデントの根本原因は支払能力チェックの欠如にあり、これは私たちに教訓を与えてくれます。実際、レンディングプロトコルにおいて、ユーザーのポジションに影響を与える可能性のあるあらゆる手順に対して、ポジションの健全性チェックを実装すべきかどうかを検証することは極めて重要です。さらに、プロジェクトチームはプロトコル内の大規模な清算を能動的に監視し、そのような事象を迅速に検知して対応するための効果的な警報システムを構築する必要があります。
このシリーズの他の記事を読む:
- 導入: 2023年の「注目すべき」セキュリティインシデント・トップ10
- #1: Flashbots Relayの脆弱性を悪用し、MEVボットから収穫
- #3: KyberSwapインシデント: 非常に微細な計算を伴う丸め誤差の巧みな悪用
- #4: Curveインシデント: コンパイラエラーにより、正常なソースコードから欠陥のあるバイトコードが生成される
- #5: Platypus Finance: 幸運にも3度の攻撃から生還
- #6: Hundred Financeインシデント: 脆弱なフォークプロトコルにおける精度関連の悪用が連鎖
- #7: ParaSpaceインシデント: 業界で最も重大な攻撃を阻止するための時間との戦い
- #8: SushiSwapインシデント: 不手際な救出計画が連鎖的な模倣攻撃の引き金に
- #9: MEVボット 0xd61492: 巧妙な悪用によって捕食者から被食者へ
- #10: ThirdWebインシデント: 信頼済みモジュール間の互換性不備が脆弱性を露呈



