Back to Blog

#5: Platypus Finance:3度の攻撃を幸運で乗り切る

Code Auditing
2024年2月15日
6 min read

概要

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件の攻撃の詳細については、以下のリンクを参照してください。

まとめ

3件の攻撃はいずれもプロトコルの異なる脆弱性を悪用したものでした。他の一部のベンダーがプロトコルを監査していたにもかかわらず、攻撃者は依然として抜け穴を見つけ、プロトコルの攻撃に成功しました。幸いにも一部の資産は救出されましたが、常に幸運に恵まれると期待することはできません。プロトコルとユーザー資産を保護するために、攻撃の監視と自動対応を含む、より多くのセキュリティ対策を採用すべきです

このシリーズの他の記事を読む:

Sign up for the latest updates
約940万ドルの損失:Injective、Aquiferのエクスプロイト | BlockSec Weekly
Security Insights

約940万ドルの損失:Injective、Aquiferのエクスプロイト | BlockSec Weekly

先週(2026/08/31~09/06)、Injective、Solana、Ethereum、Flow EVMで4件の攻撃が発生し損失は約940万ドル。Injectiveは保険基金IDとオプション市場IDの衝突で約480万ドル、SolanaのAquiferは未検証Token Programで約247万ドル、EthereumのNotional Finance V1は`uint128`キャスト不備で約173万ドル、Flow EVMのAnkr FLOWは一時停止回避と古い比率発行で約41万ドルを失った。

スマートコントラクトを超えて:Web3におけるドメインとDNSの運用セキュリティ
Security Insights

スマートコントラクトを超えて:Web3におけるドメインとDNSの運用セキュリティ

コントラクト監査は契約書止まり。DefiLlama TVL上位100件のドメインにSEAL基準のDNS・レジストラ検査を8項目、計800回実施した結果、全通過は1件のみ。多くのプロジェクトに欠けている4つの管理策と、ユーザーの入口での重要性を解説。

Web3攻撃対象領域:ペネトレーションテストの概要

Web3攻撃対象領域:ペネトレーションテストの概要

暗号資産機関は従来の攻撃対象領域に加え、資金処理チェーンも抱えます。本記事は稼働システムをアプリケーション、認可・署名、ブロックチェーン連携、インフラの4要素で整理し、各要素の責務・実装例・継承される攻撃対象を示します。さらにweb3固有の範囲を、運用・署名意図・承認出金チェーン・資金ロジック・オンチェーン取引と契約という5領域に構造化します。

Best Security Auditor for Web3

Validate design, code, and business logic before launch. Aligned with the highest industry security standards.

BlockSec Audit