2021年8月4日、Popsicle Financeは攻撃により巨額の金銭的損失(2000万ドル超)を被りました[1]。 手動分析の結果、これは「ダブルクレイム」攻撃、つまり報酬システムの抜け穴により、攻撃者が報酬を繰り返し請求できるものであることを確認しました。 以下では、攻撃プロセスと脆弱性の根本原因を説明するために、攻撃トランザクションを使用します。
背景
Popsicle Financeは、複数のチェーン(例:EthereumおよびBSC)に対応するイールド最適化プラットフォームです。
具体的には、ユーザーはまずdeposit関数を呼び出して流動性を提供し、Popsicle LPトークン(略称:PLP)を取得します。その後、Popsicle Financeはユーザーのために流動性(Uniswapなどのプラットフォームと連携)を管理して利益を上げます。
ユーザーはwithdraw関数を呼び出してPopsicle Financeから流動性を取り戻すことができます。その際、PLPトークンに基づいて金額が計算されます。
インセンティブ報酬は流動性に由来し、時間とともに蓄積されます。
ユーザーはcollectFees関数を呼び出して報酬を請求できます。これがこの攻撃の鍵となります。
脆弱性分析
collectFees関数では、token0Rewardとtoken1Reward(対応するLPトークンペアの報酬)がユーザーのために計算されます。計算ロジック全体は単純です。しかし、この関数はupdateVaultというモディファイアを使用しており、これにより報酬が適切に更新されます。


要するに、updateVaultは以下のことを行います。
- まず、
_earnFees関数を呼び出して、プールから蓄積された手数料を取得します。 - 次に、
_tokenPerShare関数を呼び出して、token0PerShareStoredとtoken1PerShareStoredを更新します。これらは、各シェアあたりのプール内のトークン0とトークン1の金額を表します。 - 最後に、
_fee0Earnedと_fee1Earned関数を呼び出して、ユーザーの報酬(それぞれtoken0Rewardsとtoken1Rewards)を更新します。

_fee0Earned関数と_fee1Earned関数は同じロジックを共有します。つまり、以下の式を実装します(トークン0を例に取ります)。
user.token0Rewards += PLP.balanceOf(account) * (fee0PerShare - user.token0PerSharePaid) / 1e18
この計算は累積的であることに注意してください。つまり、ユーザーがPLPトークンを保有していなくても、計算された報酬はtoken0Rewardsに格納された値のままです。
したがって、以下の2つの観察結果を導き出すことができます。
- ユーザーの報酬は
token0Rewardsとtoken1Rewardsに保存されており、これはPLPトークンとは関連付けられていません。 collectFees関数はtoken0Rewardsとtoken1Rewardsの状態のみに依存しているため、PLPトークンを保有せずに報酬を引き出すことができます。
現実世界では、これはユーザーがお金を通帳に預け、銀行が預金証明書を発行するようなものです。残念ながら、この証明書は偽造防止機能がなく、ユーザーとも関連付けられていません。 この場合、複製を作成して他人に配布し、銀行から利益を得ることが可能です。
攻撃フロー
簡単に言うと、攻撃者は以下の手順で攻撃を実行しました。
- 3つのコントラクトを作成しました。1つは攻撃に使用され、他の2つは
collectFees関数を呼び出して報酬を取得するために使用されました。 - AAVEから大量の流動性を借り入れるフラッシュローンを利用しました。
- 攻撃を実行するためにデポジット-ウィズドロー-コレクトフィーズサイクルを起動しました(合計8サイクルあり、Popsicle Financeの複数のボルトから大量の流動性が引き出されました)。
- フラッシュローンをAAVEに返却し、Tornado.Cashを通じて利益をマネーロンダリングしました。

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

利益分析
合計で、攻撃者はPopsicle Financeから2000万ドルを不正に取得しました。これには、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
(姓のアルファベット順)
Medium: https://blocksecteam.medium.com/
Twitter: https://twitter.com/BlockSecTeam
連絡先: [email protected]
参考文献
[1] https://twitter.com/defiprime/status/1422708265423556611



