Back to Blog

Popsicle Finance 安全事件分析

Code Auditing
August 4, 2021
4 min read

2021 年 8 月 4 日,Popsicle Finance 因遭受攻擊而損失慘重(超過 2,000 萬美元)[1]。 經過人工分析,我們確認這是一次「重複領取(double-claiming)」攻擊,即其獎勵系統存在一個漏洞,允許攻擊者重複領取獎勵。 在下文中,我們將使用一筆攻擊交易來說明攻擊過程以及漏洞的根本原因。

背景

Popsicle Finance 是一個收益優化平台,支援多個針對不同鏈(例如以太坊和 BSC)的金庫。

具體而言,用戶首先調用 deposit 函數提供流動性,並獲得 Popsicle LP 代幣(簡稱 PLP)。之後,Popsicle Finance 將為用戶管理流動性(與 Uniswap 等平台互動)以賺取利潤。 用戶可以調用 withdraw 函數從 Popsicle Finance 取回流動性,該平台會根據 PLP 代幣計算金額。 激勵獎勵來自於流動性,並隨時間推移而不斷累積。 用戶可以調用 collectFees 函數領取獎勵,這正是本次攻擊的關鍵。

漏洞分析

collectFees 函數中,系統會為用戶計算 token0Rewardtoken1Reward(對應 LP 代幣對的獎勵)。整個計算邏輯相當直觀。然而,該函數使用了一個名為 updateVault 的修飾器(modifier),用於相應地更新獎勵。

簡而言之,updateVault 會:

  1. 首先調用 _earnFees 函數以獲取池中累積的費用;
  2. 然後調用 _tokenPerShare 函數來更新 token0PerShareStoredtoken1PerShareStored,它們代表池中每個份額的 token0 和 token1 數量;
  3. 最後調用 _fee0Earned_fee1Earned 函數來更新用戶的獎勵(即分別為 token0Rewardstoken1Rewards)。

_fee0Earned_fee1Earn2 函數共用相同的邏輯,即實現以下公式(以 token0 為例):

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

請注意,該計算是增量式的,這意味著即使是用戶未持有 PLP 代幣,計算出的獎勵仍會保留在 token0Rewards 中儲存的值。

因此,我們可以得出以下兩個觀察結果:

  1. 用戶的獎勵儲存在 token0Rewardstoken1Rewards 中,它們與任何 PLP 代幣無關聯
  2. collectFees 函數僅依賴於 token0Rewardstoken1Rewards 的狀態,這意味著無需持有 PLP 代幣即可提取獎勵

在現實世界中,這相當於用戶在銀行存錢,銀行給她一張存款證明。不幸的是,這張證書既沒有防偽功能,也不與用戶本人綁定。 在這種情況下,就有可能進行複製並分發給他人,從而從銀行獲利。

攻擊流程

簡單來說,攻擊者採取了以下步驟發動攻擊:

  1. 創建了三個合約。其中一個用於發動攻擊,另外兩個用於調用 collectFees 函數以領取獎勵;
  2. 利用閃電貸(Flash Loan),即從 AAVE 借入大量流動性;
  3. 發動「存入-提取-領取獎勵(Deposit-Withdraw-CollectFees)」循環來執行攻擊(總共進行了 8 次循環,並從 Popsicle Finance 的多個金庫中提取了大量流動性);
  4. 將閃電貸歸還給 AAVE,並通過 Tornado.Cash 清洗利潤。

具體而言,「存入-提取-領取獎勵」循環由多個步驟組成,可以通過我們的線上工具輕鬆標記並清晰地總結起來 [2]:

利潤分析

總體而言,攻擊者從 Popsicle Finance 獲取了價值 2,000 萬美元的資產,包括 2,560 個 WETH、96.2 個 WBTC、16 萬個 DAI、539 萬個 USDC、498 萬個 USDT 以及 1.05 萬個 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/

Best Security Auditor for Web3

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

BlockSec Audit