Back to Blog

ポプシクル・ファイナンスのセキュリティインシデント分析

Code Auditing
2021年8月4日
4 min read

2021年8月4日、Popsicle Financeは攻撃により巨額の損失(2,000万ドル以上)を被りました[1]。 手動分析の結果、これは「ダブルクレイム」攻撃、すなわち報酬システムの脆弱性により、攻撃者が繰り返し報酬を請求できたことが確認されました。 以下では、攻撃トランザクションを用いて、攻撃プロセスと脆弱性の根本原因を説明します。

背景

Popsicle Financeは、複数のチェーン(例:Ethereum、BSC)に対応したイールド最適化プラットフォームです。

具体的には、ユーザーはまずdeposit関数を呼び出して流動性を提供し、Popsicle LPトークン(略称PLP)を取得します。その後、Popsicle Financeがユーザーに代わって流動性を管理し(Uniswapなどのプラットフォームと連携)、利益を生み出します。 ユーザーはwithdraw関数を呼び出してPopsicle Financeから流動性を取り戻すことができ、その量はPLPトークンに基づいて計算されます。 インセンティブ報酬は流動性に由来し、時間とともに蓄積されます。 ユーザーはcollectFees関数を呼び出して報酬を請求できますが、これがこの攻撃の鍵となります。

脆弱性分析

collectFees関数では、token0Rewardとtoken1Reward(対応するLPトークンペアの報酬)がユーザーのために計算されます。計算ロジック全体は単純です。しかし、この関数はupdateVaultというモディファイアを使用しており、これは報酬を適切に更新するために使用されます。

要するに、updateVaultは以下の処理を行います。

  1. まず_earnFees関数を呼び出し、プールから蓄積された手数料を取得します。
  2. 次に_tokenPerShare関数を呼び出し、token0PerShareStoredとtoken1PerShareStoredを更新します。これらは、シェアあたりのトークン0およびトークン1のプール内の量を示します。
  3. 最後に_fee0Earnedと_fee1Earned関数を呼び出し、ユーザーの報酬(それぞれtoken0Rewardsとtoken1Rewards)を更新します。

_fee0Earnedと_fee1Earned関数は同じロジックを共有しており、以下の数式を実装しています(トークン0を例とします)。

user.token0Rewards += PLP.balanceOf(account) * (fee0PerShare - user.token0PerSharePaid) / 1e18

この計算は累積的であることに注意してください。つまり、ユーザーがPLPトークンを保有していなくても、計算された報酬はtoken0Rewardsに格納されている値のままです。

したがって、以下の2つの観察結果が得られます。

  1. ユーザーの報酬はtoken0Rewardsとtoken1Rewardsに格納され、これらはPLPトークンとは関連付けられていません。
  2. collectFees関数はtoken0Rewardsとtoken1Rewardsの状態のみに依存するため、PLPトークンを保有せずに報酬を引き出すことができます。

現実世界では、これはユーザーが銀行にお金を預け、銀行が預金証書を発行するようなものです。残念ながら、この証書は偽造防止機能がなく、ユーザーとも関連付けられていません。 このような場合、複製を作成して他人に配布し、銀行から利益を得ることが可能です。

攻撃フロー

簡潔に言うと、攻撃者は以下の手順で攻撃を実行しました。

  1. 3つのコントラクトを作成しました。1つは攻撃に使用され、他の2つは報酬を取得するためにcollectFees関数を呼び出すために使用されました。
  2. AAVEから大量の流動性を借り入れるフラッシュローンを利用しました。
  3. デポジット-ウィズドロー-コレクトFeesサイクルを実行して攻撃を仕掛けました(合計8サイクル実行され、Popsicle Financeの複数のボルトから大量の流動性が引き出されました)。
  4. フラッシュローンをAAVEに返却し、Tornado.Cashを通じて利益をマネーロンダリングしました。

具体的には、デポジット-ウィズドロー-コレクトFeesサイクルはいくつかのステップで構成されており、当社のオンラインツール [2]を使用することで、簡単にラベル付けして明確に要約できます。

利益分析

合計で、攻撃者はPopsicle Financeから2,000万ドルを収穫しました。これには、2.56K WETH、96.2 WBTC、160K DAI、5.39M USDC、4.98M USDT、10.5K UNIが含まれます。 この搾取の後、攻撃者はまずUniswapとWETHを通じて他のすべてのトークンをETHに交換し、その後Tornado.Cashを使用してマネーロンダリングを行いました。

功労者

Yufeng Hu、Ziling Lin、Junjie Fei、Lei Wu、Yajin Zhou @BlockSec (姓のアルファベット順)

https://www.blocksecteam.com

Medium: https://blocksecteam.medium.com/

Twitter: https://twitter.com/BlockSecTeam

連絡先: [email protected]

参考文献

[1] https://twitter.com/defiprime/status/1422708265423556611

[2] https://tx.blocksecteam.com/

Sign up for the latest updates
損失約557万 USD:X100 FreezerとNEMへの攻撃 | BlockSec Weekly
Security Insights

損失約557万 USD:X100 FreezerとNEMへの攻撃 | BlockSec Weekly

本週次レポートでは、2026年10月19日–2026年10月25日にEthereumとBNB Chainで発生した2件のセキュリティインシデントを取り上げます。フラッシュローンを資金源としたX100 Freezerのガバナンス乗っ取りと、BNB Chain上のNEMトークンの流動性プールに影響を及ぼした税の精算処理の欠陥を検証します。本レポートの対象範囲における推定損失額は合計で約557万 USDです。内訳は、代表例として取り上げるX100のトランザクションによる損失が約475万 USD、NEMプールのインシデントによる損失が約82.0万 USDです。この合計には、別途報告された、その後のX100からの資金奪取は含まれません。

約387万 USDの損失:Autheo NetworkとUNCXへのハッキング | BlockSecウィークリー
Security Insights

約387万 USDの損失:Autheo NetworkとUNCXへのハッキング | BlockSecウィークリー

この週次レポートでは、2026年10月12日–2026年10月18日に発生した3件のセキュリティインシデントを取り上げます。推定損失額の合計は約387万 USDです。Autheo Networkでは秘密鍵の侵害により約176万 USD、Qubic Walletでは脆弱なシード生成により約130万 USDの損失が発生しました。また、Ethereum、BNB Chain、Base、Robinhood Chain上のUNCX NetworkのSmart Token Vesting V2コントラクトでは、会計処理上の誤りにより約80.7万 USDの損失が発生しました。重点的に取り上げるUNCXの分析では、シェア総数の計算に欠陥があり、異なるトークン対シェア比率で作成されたベスティングのトランシェが混同された結果、共通プールからの過剰な引き出しが可能になった仕組みを説明します。

約54万2,000ドルの損失:MakerDaoBotへの攻撃 | BlockSec週間ニュース
Security Insights

約54万2,000ドルの損失:MakerDaoBotへの攻撃 | BlockSec週間ニュース

本レポートは2026/10/05~10/11にEthereumで発生したセキュリティ事故1件を扱う。推定損失は約54.2万ドル。攻撃コントラクトは悪意あるアダプターを展開し、アクセス制御のないMakerDaoBot関数に渡して、ボット内部のMakerDAO残高への操作権限を付与させた。アダプターは旧ETH-Aオークション4件を決済し、ETH-A担保200単位をWETHに変換。攻撃コントラクトがWETHをETHに戻し、攻撃者へ200 ETHを送金した。

Best Security Auditor for Web3

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

BlockSec Audit