Back to Blog

第5回:Platypus Finance:幸運に救われた3度の攻撃からの生還

Code Auditing
February 15, 2024
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つのエクスプロイト(脆弱性攻撃)を分析すると、綿密な監査やより積極的なセキュリティ対策を講じていれば、論理的な欠陥は回避できたはずです。

最初の攻撃

このセキュリティインシデントを理解するには、いくつかのスマートコントラクトのワークフローを把握する必要があります。大まかなプロセスは以下の通りです。

  • ユーザーはプールにトークンを預け入れてLP(流動性提供者)となり、LPトークンを受け取ることができます。
  • LPトークンは「MasterPlatypus」にステーキングして報酬を受け取ることができます。このプロセス中、LPトークンはMasterPlatypusコントラクトへ転送されます。
  • LPトークンは、資産効率を向上させるために他の資産を借りる際の担保として使用できます。

以下の図は、その相互作用を示しています。

脆弱性分析

この脆弱性は、MasterPlatypusコントラクト内のemergencyWithdrawという関数に存在していました。緊急時には、この関数を使用してMasterPlatypusコントラクトにステーキングされたLPトークンを引き出す必要があります。この関数では、コントラクトはユーザーの「Solvent(支払い能力がある)」状態を確認してから引き出しを許可します。このロジックは、ユーザーに不良債権がないか(つまり、担保を使って負債を支払えるか)をチェックするものです。もし問題なければ、ユーザーはステーキングされたLPトークンを引き出すことができます。

しかし、このロジックには欠陥がありました。ユーザーが「Solvent」であるということは、単に担保で負債を支払えることを意味するに過ぎません。しかし、緊急引き出しによってステーキングされたトークンを引き出した後もユーザーが「Solvent」な状態を維持できるかどうかはチェックされていませんでした。攻撃者はこの欠陥を悪用して資産を借り入れ、さらに(負債を返済することなく)ステーキングされたLPトークンを緊急引き出しすることができました。詳しくはImmunefiブログの詳細分析を参照してください。

攻撃分析

攻撃トランザクションの例を使って、攻撃プロセス全体を確認します。

ステップ 1: AAVEから4,400万USDCをフラッシュローンで借り入れる

ステップ 2: プールに4,400万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トークンの承認(approve)を行っていました。そして、このプールコントラクトはアップグレード可能でした。

以上の2点を組み合わせることで、私たちは以下の手順で攻撃用コントラクト内のUSDCを救出することができました。

  • Platypus Financeプールコントラクトをアップグレードし、コントラクト内のUSDCを引き出すロジックを追加する。
  • 攻撃用コントラクトのコールバックを呼び出し、プールコントラクトへUSDCを承認させる。
  • プールコントラクト(攻撃用コントラクトによって実行される関数)を任意のロジックに置き換え、攻撃用コントラクトからプールへUSDCを転送させる。

240万USDCを救出したトランザクションはこちらです

その他の2つの攻撃

その他の2つの攻撃の詳細については、以下のリンクを参照してください。

まとめ

これら3つの攻撃は、それぞれプロトコルの異なる脆弱性を突いたものでした。他のベンダーによる監査を受けていたにもかかわらず、攻撃者は依然として抜け穴を見つけ出し、プロトコルを攻略しました。幸いにも資産の一部は救出されましたが、常に幸運であるとは限りません。プロトコルとユーザーの資産を守るためには、攻撃監視や自動応答などのより高度なセキュリティ対策を導入すべきです。

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

Sign up for the latest updates
ニュースレター - 2026年6月
Security Insights

ニュースレター - 2026年6月

本月報は2026年6月の主要セキュリティインシデント3件を対象とし、確認済み損失総額は約2,200万ドルです。高度なハニーポット攻撃がトークン許可の未検証を悪用し、JaredFromSubwayのMEVボットから約1,500万ドルを流出。旧型Aztecロールアップ2件はプルーフ決済の境界ギャップにより約435万ドルを損失。SecondFiのEd25519実装欠陥により374ウォレットの秘密鍵が露出し約240万ドルが流出。3件に共通するのは、表面上は保たれているように見えたセキュリティ保証が実際には機能していなかった点です。

約400万ドルの損失:TaikoとSecondFiのエクスプロイト|BlockSec週次レポート
Security Insights

約400万ドルの損失:TaikoとSecondFiのエクスプロイト|BlockSec週次レポート

2026年6月22〜28日のブロックチェーンセキュリティ報告:EthereumとCardanoで約410万ドルの損失を確認。Taikoブリッジ攻撃はSGX署名鍵の露出と不完全なアテステーションポリシーを悪用し、悪意のあるプルーバー登録とL2状態証明の偽造を可能にした。SecondFiはEd25519ナンス導出の欠陥により、公開Cardanoトランザクションから秘密鍵の復元が可能となった。

〜1800万ドルの損失:jaredFromSubway、Aztecなど|BlockSecウィークリー
Security Insights

〜1800万ドルの損失:jaredFromSubway、Aztecなど|BlockSecウィークリー

ブロックチェーンセキュリティ週次レポート(2026年6月15日〜21日):EthereumとBNB Chainで3件の重大インシデントが発生し、総損失約1830万ドル。注目のjaredFromSubway事件では、MEVボットが裁定取引のために自身の資産を未検証の第三者コントラクトに承認するという逆承認攻撃が判明。攻撃者は実イベントを発行しながら承認を消費しない偽トークンとプールを構築し、損失は約1500万ドル。またAztecでは3日間で2度目の攻撃が発生、エスケープハッチZK回路でold_data_rootの等価制約欠如を悪用し、偽マークルツリーに対するノート所有権の証明が可能となった。

Best Security Auditor for Web3

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

BlockSec Audit