返回部落格

Popsicle Finance 安全事件分析

Code Auditing
2021年8月4日
閱讀約 4 分鐘

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 函數中,系統會為用戶計算 token0Reward 和 token1Reward(對應 LP 代幣對的獎勵)。整個計算邏輯相當直觀。然而,該函數使用了一個名為 updateVault 的修飾器(modifier),用於相應地更新獎勵。

簡而言之,updateVault 會:

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

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

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

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

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

  1. 用戶的獎勵儲存在 token0Rewards 和 token1Rewards 中,它們與任何 PLP 代幣無關聯;
  2. collectFees 函數僅依賴於 token0Rewards 和 token1Rewards 的狀態,這意味著無需持有 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/

訂閱最新動態
Bitget 3.875億美元鏈下違規事件:超越金鑰與合約的範疇
Security Insights

Bitget 3.875億美元鏈下違規事件:超越金鑰與合約的範疇

2026年9月24日,攻擊者利用第三方安全產品漏洞,獲取內部憑證並偽造提款指令,導致約3.875億美元從Bitget部分營運錢包(涵蓋Ethereum、其他EVM網絡、XRP Ledger、Zcash及TRON)轉出;私鑰及冷錢包未受影響。本文深入梳理事件路徑與資金流向,分析快速轉換為原生資產及生態恢復應對,提出機構縱深防禦框架,並說明授權區塊鏈滲透測試如何驗證跨層假設。

約1130萬美元損失:Multicall Router、Nostra|BlockSec Weekly
Security Insights

約1130萬美元損失:Multicall Router、Nostra|BlockSec Weekly

本報告涵蓋2026/09/14至2026/09/20期間,探討以太坊與Starknet上兩起合計損失約1130萬美元的安全事件。較大一起中,多重呼叫路由器將自身位址接受為分派目標,導致巢狀呼叫以路由器自身已授權身分而非外部呼叫者身分進入Safe錢包的Gateway模組,約2900枚`aEthrsETH`被轉出至攻擊者建立的Uniswap v4池。在Starknet上,Nostra預言機整合僅要求最少一個聚合來源,當三個設定價格來源中僅兩個達成聚合時,操縱的薄池報價與正常報價平均後將`NSTR`估值約49.52美元,支撐約350萬美元以高估抵押品借貸。

损失約3.2億美元:Liquid Network與Symbiosis遭攻擊事件 | BlockSec
Security Insights

损失約3.2億美元:Liquid Network與Symbiosis遭攻擊事件 | BlockSec

本報告涵蓋2026/09/07至2026/09/13,探討兩起造成約3.2億美元損失的安全事件,包括前份報告未提及、發生於2026/09/06的Liquid Network漏洞事件。較大者為該Liquid Network漏洞:Elements中的rangeproof驗證快取藉由雜湊四個欄位(其中兩個長度可變)串接而成金鑰,且未標示欄位邊界,導致某輸出的驗證結果被錯誤套用至另一個未經檢驗證明的輸出,使攻擊者得以憑空創造4,000枚無擔保L-BTC,並將幾乎全數兌回比特幣。在橫跨BNB Smart Chain、Ethereum與Rootstock的Symbiosis跨鏈橋比特幣路徑中,讀取比特幣存款的鏈下程式碼從存款人可自行控制的欄位取得其身份,並在未檢查手續費是否為負值的情況下自存款中扣除,使330聰的存款鑄造出`46,116,860,184.27388234 syBTC`;其須賣出所經之資金池僅有11.26 syBTC,致使流動性提供者與用戶損失約9.97 BTC(約77萬美元)。

Web3 最佳安全審計方

在上線之前驗證設計、程式碼與業務邏輯,對標業內最高安全標準。

BlockSec 審計