概要
Platypus Financeは、Avalancheブロックチェーン上のAMMプロトコルです。これまでに以下のように3回攻撃を受けています。
- 2023年2月17日、誤ったソルベンシーチェックによりハッキングされ、合計約905万ドルの損失が発生しました。このうち、240万ドルはBlockSecの支援により救出されました。約38万トークンがAaveコントラクトに滞留していましたが、その後返還されました。
- 2023年7月12日、ステーブルコイン間の価格差を無視したことにより、約5万ドルの損失を伴うハッキングが発生しました。
- 2023年10月12日、価格操作攻撃を受け、約220万ドルの損失が発生しました。攻撃者との交渉の結果、盗まれた資金の90%が返還されました。
このプロジェクトがこれらすべての攻撃を生き延びたのは幸運と言えます。これら3件のエクスプロイトの分析から、綿密な監査やより積極的なセキュリティ対策が講じられていれば、論理的な欠陥を回避できた可能性があることが示されています。
攻撃1
このセキュリティインシデントを理解するには、いくつかのスマートコントラクトのワークフローを理解する必要があります。おおまかなプロセスは以下の通りです。
- ユーザーはトークンをプールにデポジットしてLPとなり、LPトークンを受け取ることができます。
- LPトークンはMasterPlatypusにステークして報酬を受け取ることができます。このプロセス中、LPトークンはMasterPlatypusコントラクトに転送されます。
- LPトークンは担保として使用され、資産効率を向上させるために他の資産を借り入れることができます。
以下の図はその相互作用を示しています。

脆弱性分析
この脆弱性は、MasterPlatypusコントラクト内のemergencyWithdrawという名前の関数に存在します。緊急時には、この関数を使用してMasterPlatypusコントラクトにステークされたLPトークンを引き出す必要があります。この関数では、コントラクトはユーザーがSolvent(支払い能力がある)かどうかをチェックし、引き出しを許可します。このロジックは、ユーザーに不良債権があるかどうか(つまり、担保が負債を返済するために使用できるかどうか)をチェックします。もしなければ、ユーザーはステークされたLPトークンを引き出すことができます。
しかし、このロジックには欠陥があります。ユーザーがSolventであるということは、ユーザーの担保がその負債を返済できることを意味するにすぎません。しかし、これはステークされたトークンを緊急引き出しした後もユーザーがSolventのままであるかどうかをチェックしません。攻撃者はこの欠陥を利用して資産を借り入れ、その後(負債を返済することなく)ステークされたLPトークンも緊急引き出しすることができます。Immunefiのブログでの詳細な分析を参照してください。


攻撃分析
ここでは1つの攻撃トランザクションを例に、攻撃の全プロセスを示します。
ステップ1:AAVEから4400万USDCのフラッシュローンを借り入れ

ステップ2:4400万USDCをプールにデポジットしてLP-USDCを取得

ステップ3:LP-USDCをMasterPlatypusにデポジット

ステップ4:LP-USDCを担保としてUSPを借り入れ

ステップ5:emergencyWithdraw関数を実行して攻撃を開始
攻撃者はUSPの負債を返済せずにLP-USDCを取得します。

ステップ6:プールからLP-USDCを引き出してUSDCを取得

ステップ7:USPを売却して利益を得る

しかし、利益は攻撃コントラクト内に残されたままでした。実際には、攻撃者はスワップのために新しい受取アドレスを設定して利益を得ることができます。
BlockSecによる救出
攻撃者が利益を攻撃コントラクト内に残していたことが判明しました。さらに、攻撃コントラクト内には資産を引き出すロジックがありませんでした。しかし、私たちは攻撃コントラクト内に脆弱性を発見し、それを利用してハックバックし、コントラクト内の資産の一部を引き出すことができました。
具体的には、フラッシュローンのコールバック関数にアクセス制御があり、これは誰でもこのコールバック関数を呼び出せることを意味します。これは多くのMEVボットが攻撃を受ける根本原因でもあります。
さらに、コールバック関数内で、攻撃者コントラクトはUSDCトークンをPlatypus financeのプールコントラクトに承認します。そして、このプールコントラクトはアップグレード可能です!

前述の2点を組み合わせることで、以下の手順で攻撃コントラクト内のUSDCを救出することができます。
- Platypus financeのプールコントラクトをアップグレードし、コントラクト内のUSDCを引き出すロジックを含めます
- 攻撃コントラクトのコールバックを呼び出して、USDCをプールコントラクトに承認させます
- プールコントラクトは(攻撃コントラクトによって実行される)任意の関数を置き換えて、攻撃コントラクトからUSDCを転送できます(攻撃コントラクトがUSDCをプールコントラクトに承認しているため)。
こちらが240万USDCを救出したトランザクションです。

その他2件の攻撃
その他2件の攻撃の詳細については、以下のリンクを参照してください。
-
攻撃-II:2023年7月11日、プロトコルはUSDCとUSDTの比率が1:1であると想定しており、これは市場変動から乖離しているため、欠陥のある引き出しロジックにつながりました。1つの攻撃トランザクションへのリンクです。他にもいくつかあります。
-
攻撃-III:2023年10月12日、操作された
cashとliabilityがスワップ価格に影響を与えたことによるものです。[最初の攻撃トランザクション | 2番目の攻撃トランザクション]
まとめ
3件の攻撃はいずれもプロトコルの異なる脆弱性を悪用したものでした。他の一部のベンダーがプロトコルを監査していたにもかかわらず、攻撃者は依然として抜け穴を見つけ、プロトコルの攻撃に成功しました。幸いにも一部の資産は救出されましたが、常に幸運に恵まれると期待することはできません。プロトコルとユーザー資産を保護するために、攻撃の監視と自動対応を含む、より多くのセキュリティ対策を採用すべきです。
このシリーズの他の記事を読む:
- 導入編:2023年トップ10「素晴らしい」セキュリティインシデント
- #1: Flashbots Relayの脆弱性を悪用したMEVボットの収穫
- #2: Euler Financeインシデント:2023年最大のハック
- #3: KyberSwapインシデント:極めて巧妙な計算による丸め誤差の見事な悪用
- #4: Curveインシデント:コンパイラのエラーが無害なソースコードから欠陥のあるバイトコードを生成
- #6: Hundred Financeインシデント:脆弱なフォークプロトコルにおける精度関連エクスプロイトの波を触発
- #7: ParaSpaceインシデント:業界最も重大な攻撃を阻止するための時間との闘い
- #8: SushiSwapインシデント:不手際な救出の試みが一連の模倣攻撃を招く
- #9: MEVボット0xd61492:巧妙なエクスプロイトで捕食者から獲物へ
- #10: ThirdWebインシデント:信頼されたモジュール間の非互換性が脆弱性を露呈



