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

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


攻撃分析
攻撃トランザクションを例として、攻撃プロセス全体を示します。
ステップ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ボットが攻撃される根本原因でもあります。
さらに、コールバック関数内で、攻撃コントラクトはPlatypus financeプールコントラクトにUSDCトークンを承認します。そして、このプールコントラクトはアップグレード可能です!

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

その他の2回の攻撃
その他の2回の攻撃に関する詳細は、以下のリンクを参照してください。
-
Attack-II:2023年7月11日、プロトコルはUSDCとUSDTの比率を1:1と想定していましたが、市場の変動から乖離しており、その結果、引き出しロジックに欠陥が生じました。攻撃トランザクションへのリンク。いくつかあります。
-
Attack-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 Bot 0xd61492:捕食者から獲物へ、巧妙なエクスプロイト
- 第10回:ThirdWebインシデント:信頼されたモジュールの間の非互換性が脆弱性を露呈



