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

脆弱性分析
脆弱性は、MasterPlatypusコントラクト内の emergencyWithdraw という名前の関数に存在します。緊急時には、この関数はMasterPlatypusコントラクトにステーキングされたLPトークンを引き出すために使用されるはずです。この関数では、コントラクトは引き出しを許可するために、ユーザーが Solvent( solvble、返済能力がある)かどうかをチェックします。このロジックは、ユーザーに不良債務(つまり、担保が負債の支払いに使用できるかどうか)があるかどうかをチェックします。ない場合、ユーザーはステーキングされた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回の攻撃に関する詳細は、以下のリンクを参照してください。
-
攻撃II:2023年7月11日、プロトコルはUSDCとUSDTの比率が1:1であると仮定しましたが、これは市場の変動から乖離しており、不適切な引き出しロジックにつながりました。攻撃トランザクションのリンク。いくつかあります。
-
攻撃III:2023年10月12日、操作された
cash(現金)とliability(負債)がスワップ価格に影響を与えたことが原因です。最初の攻撃トランザクション | 2番目の攻撃トランザクション]
要約
3回の攻撃は、プロトコルの異なる脆弱性を悪用しました。他のベンダーがプロトコルを監査していたにもかかわらず、攻撃者は抜け穴を見つけ、プロトコルを正常に悪用しました。幸いにも一部の資産は回収されましたが、常に運が味方するとは期待できません。プロトコルとユーザー資産を保護するためには、攻撃監視や自動応答を含む、より多くのセキュリティ対策を採用する必要があります。
このシリーズの他の記事を読む:
- リードイン:2023年のトップ10「驚くべき」セキュリティインシデント
- 第1号:Flashbotsリレーの脆弱性を悪用したMEVボットの収穫
- 第2号:Euler Financeインシデント:2023年最大のハッキング
- 第3号:KyberSwapインシデント:極めて巧妙な計算による丸め誤差の巧みな悪用
- 第4号:Curveインシデント:コンパイラエラーにより、無害なソースコードから不正なバイトコードが生成される
- 第6号:Hundred Financeインシデント:脆弱なフォークされたプロトコルにおける精度関連の不正利用の波を触発
- 第7号:ParaSpaceインシデント:業界で最も重大な攻撃を阻止するための時間との戦い
- 第8号:SushiSwapインシデント:不器用な救出の試みが一連の模倣攻撃につながる
- 第9号:MEVボット 0xd61492:巧妙な不正利用における捕食者から獲物へ
- 第10号:ThirdWebインシデント:信頼されたモジュール間の非互換性が脆弱性を露呈



