返回部落格

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 函數中,系統會為用戶計算 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/

訂閱最新動態
超越智能合約:Web3中的網域與DNS營運安全
Security Insights

超越智能合約:Web3中的網域與DNS營運安全

合約審計止步於合約本身。我們針對 DefiLlama TVL 前 100 名背後的 100 個網域,執行了八項基於 SEAL 的 DNS 與註冊商檢查——共 800 項檢查,僅有一個網域全數通過。以下是大多數專案缺失的四項關鍵控制,以及它們在用戶入口點的重要性。

Web3攻擊面:滲透測試概覽

Web3攻擊面:滲透測試概覽

加密機構保留所有傳統攻擊面,並疊加資金處理鏈。本文為測試人員提供系統的實用抽象:四組件模型——應用、授權與簽名、區塊鏈互動、基礎設施,說明各組件職責、代表性實現及繼承的攻擊面。並將web3特有範疇分為五大攻擊面:生產與自動化運維、簽名意圖、審批與提款鏈、資金邏輯、鏈上交易與已部署合約。

損失約2,300萬美元:Cosmos EVM、Moonwell 遭利用 | BlockSec Weekly
Security Insights

損失約2,300萬美元:Cosmos EVM、Moonwell 遭利用 | BlockSec Weekly

報告期間(2026/08/22 - 2026/08/30)內,共涵蓋5起區塊鏈安全事件,損失約2,270萬美元;Tectonic遭抽走約7,400萬至1.195億美元,其中大部分因Cronos回滾至攻擊前狀態而消除。重點事件為橫跨六條鏈的Cosmos EVM漏洞系列(實際損失約570萬美元),於TAC Chain追蹤發現,一個共享餘額同步漏洞串聯下溢與上溢攻擊,抽乾質押池。報告亦分析Moonwell的抵押品計算與預言機價格操縱組合攻擊、Tectonic針對低流動性抵押品的預言機價格與憑證代幣匯率操縱組合攻擊、Ajna清算業務邏輯漏洞,以及Solana上的Rain Card合約漏洞系列,涉及Ed25519簽名驗證繞過(Avici、Tria等)。

Web3 最佳安全審計方

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

BlockSec 審計