政策解析跨鏈收...

解析跨鏈收益率提昇平台Popsicle Finance 遭攻擊原因及過程- 鏈聞ChainNews

攻擊者通過Popsicle Finance 在機槍池實現上的漏洞發起攻擊,獲利超過2000 萬美元。

撰文:BlockSec

北京時間2021 年8 月4 日早上6 點(區塊12955063),Popsicle Finance 項目下的多個機槍池被攻擊,損失金額超過兩千萬美元,是迄今為止DeFi 領域發生的損失數額最大的單筆攻擊之一。通過分析 攻擊交易 及項目代碼我們發現,此次攻擊是一個利用項目的記賬漏洞進行多次提取的攻擊(Double-Claiming Rewards)。下面我們通過代碼和攻擊流程分析此次攻擊。

代碼分析

Popsicle Finance 是一個涉及多個鏈的機槍池(Yield Optimization Platform)。

用戶首先調用deposit 函數向機槍池存入一定的流動性,並獲得Popsicle LP Token (以下簡稱PLP Token)作為存款的份額證明。 Popsicle Finance 會將用戶提供的流動性存入Uniswap 等底層池子並獲得收益。

[虚拟印钞机]  Popsicle Finance 雙花攻擊分析

用戶還可以調用withdraw 函數,根據用戶持有的PLP Token 所代表的流動性份額,從機槍池取回流動性。 Popsicle Finance 會將PLP Token 對應的流動性從Uniswap 等底層池子中取回給用戶。

[虚拟印钞机]  Popsicle Finance 雙花攻擊分析

最後,用戶在機槍池中存的流動性會隨著時間產生一定的收益(Yield),會累計在合約的用戶狀態中。用戶可以調用collectFees 函數取回部分存款獎勵。

[虚拟印钞机]  Popsicle Finance 雙花攻擊分析

本次攻擊的核心函數正是collectFees 函數。下面我們逐步分析其代碼。首先獲得存儲在userInfo 中的用戶狀態。其中用戶狀態中的token0Rewards 和token1Rewards 是由於用戶存款而累積的獎勵。

接下來計算該合約中,對應機槍池的Token 對的Balance。如果在合約中有足夠的Balance,就按金額將Reward 支付給用戶;否則會調用pool.burnExactLiquidity 從底層pool 取回流動性返回給用戶。

最後,會將記錄在userInfo 中的Rewards 狀態進行更新。看到這裡,機槍池的代碼實現還是比較符合邏輯的。但是在函數開頭我們發現了updateVault modifier,這個函數會在collectFees 的函數體之前運行,漏洞也許在updateVault 相關的函數中。

[虚拟印钞机]  Popsicle Finance 雙花攻擊分析

以上是updateVault 相關函數的實現。過程如下:

  1. 首先調用_earnFees 向底層pool 獲取積累的Fee;
  2. 隨後調用_tokenPerShare 更新token0PerShareStored 和token1PerShareStored 參數,這兩個參數代表了池子中每個share 代表的token0 和token1 的數量,即機槍池的每個份額計代表的Token 對數量;
  3. 最後調用_fee0Earned 和_fee1Earned 更新對應到這個用戶的存款Rewards (即user.token0Rewards 和user.token1Rewards)。

[虚拟印钞机]  Popsicle Finance 雙花攻擊分析

以上是_fee0Earned 和_fee1Earned 函數的實現,兩個函數實現相同,都實現了這樣一個公式(以_fee0Earned 為例):

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

也就是說,該函數會在原有的user.token0Rewards 基礎上,根據用戶擁有的PLP Token 數量計算應給用戶發放的Fee 的份額。

但我們注意到這個函數是增量的,也就是說即使用戶並沒有持有PLP Token (PLP.balanceOf(account) 為0),該函數仍會返回保存在user.token0Rewards 中記賬的存款獎勵。

因此對於整個合約,我們發現兩個重要的邏輯缺陷:

  1. 用戶的存款獎勵是記錄在user.token0Rewards 和user.token1Rewards 中的,並不與任何PLP Token 或其他東西有任何形式的綁定。
  2. 用於取回存款收益的collectFees 函數僅僅依賴於記賬的user.token0Rewards 和user.token1Rewards 狀態,即使用戶並未持有PLP Token,仍可以取出對應的存款獎勵。

我們假想一個攻擊流程:

  1. 攻擊者向機槍池中存入一定的流動性,獲得一部分PLP Token。
  2. 攻擊者調用collectFees(0, 0),後者會更新攻擊者的存款獎勵,即狀態變量user.token0Rewards 的值,但並沒有真正取回存款獎勵。
  3. 攻擊者將PLP Token 轉給自己控制的其他合約,再調用collectFees(0, 0) 更新狀態變量user.token0Rewards。也就是說通過不斷地流轉PLP Token 並調用collectFees(0, 0),攻擊者複製了這些PLP Token 對應的存款獎勵。
  4. 最後,攻擊者從以上各個地址調用collectFees 函數,取回真正的獎勵。此時雖然這些賬戶中並沒有PLP Token,但由於記賬在user.token0Rewards 沒有更新,攻擊者因此得以取出多份獎勵。

用現實生活中的例子來描述這個攻擊,相當於我向銀行存錢,銀行給了我一張存款憑證,但這張憑證沒有防偽措施也沒有和我綁定,我把憑證複印了幾份發給不同的人,他們每個人都憑藉這個憑證向銀行取回了利息。

攻擊流程分析

通過以上的代碼分析,我們發現了Popsicle Finance 在機槍池實現上的漏洞。下面我們對攻擊交易進行深入分析,看攻擊者是怎樣利用這個漏洞的。

攻擊者的總體流程如下:

  1. 攻擊者創建了三個交易合約。其中一個用於發起攻擊交易,另外兩個用於接收PLP Token 並調用Popsicle Finance 機槍池的collectFees 函數取回存款獎勵。
  2. 通過閃電貸從AAVE 借出大量流動性。攻擊者選擇了Popsicle Finance 項目下的多個機槍池,向AAVE 借出了對應這些機槍池的六種流動性。
  3. 進行 Deposit-Withdraw-CollectFees 循環。攻擊者一共進行了 8 次循環,分別攻擊了Popsicle Finance 項目下的多個機槍池,取出了大量流動性。
  4. 向AAVE 歸還閃電貸,並將獲利通過Tornado Cash 洗錢。

[虚拟印钞机]  Popsicle Finance 雙花攻擊分析

本次攻擊交易主要由數個Deposit-Withdraw-CollectFees 循環構成,每一個循環的示意圖如上圖所示。根據我們的分析,邏輯如下:

  1. 攻擊者首先將閃電貸借來的流動性存入機槍池中,獲得一定量的PLP Token。
  2. 攻擊者將PLP Token 轉給攻擊合約2。
  3. 攻擊合約2 調用機槍池的collectFees(0, 0) 函數,設置合約2 對應的user.token0Rewards 和user.token1Rewards 狀態。
  4. 攻擊合約2 將PLP Token 轉給攻擊合約3。
  5. 和攻擊合約2 的操作類似,攻擊合約3 調用機槍池的collectFees(0, 0) 函數,設置合約2 對應的user.token0Rewards 和user.token1Rewards 狀態。
  6. 攻擊合約2 將PLP Token 轉回攻擊合約,後者調用機槍池的withdraw 函數Burn 掉PLP Token,取回流動性。
  7. 攻擊合約2 和攻擊合約3 調用collectFees 函數,用虛假的tokenRewards 狀態取回了存款獎勵。

根據我們的以太坊交易 追踪可視化系統 給出的交易調用圖如下,其中部分重要交易用紅字進行標註:

[虚拟印钞机]  Popsicle Finance 雙花攻擊分析

利潤分析

本次攻擊一共獲利:2.56k WETH,96.2 WBTC,160k DAI,5.39m USDC,4.98m USDT,10.5k UNI,獲利共計超過20,000,000 美元。

在此次攻擊之後攻擊者通過首先通過Uniswap 和WETH 將攻擊獲得的其他token 全部換成ETH,然後通過多次使用Tornado.Cash 將ETH 洗白。

免責聲明:作為區塊鏈信息平台,本站所發布文章僅代表作者個人觀點,與鏈聞ChainNews 立場無關。文章內的信息、意見等均僅供參考,並非作為或被視為實際投資建議。

.

最受歡迎

繼續閱讀

長期持有者持有的比特幣(BTC)供應量達到最高水平

根據Glassnode 的估計,比特幣的長期持有者(LTH)目前擁有1452 萬枚BTC,創歷史新高,只剩下25% 留給短期持...

抓住Web3 遊戲的先發優勢:成功策略

Web3和區塊鏈技術的出現徹底改變了遊戲行業,為開發者和企業家提供了前所未有的機遇。 Web3 遊戲的去中心化性質為創新遊戲貨幣化模式、玩家所有權和社區參與打...

現在讀

$COOKIE, the Cookie3 Mark...

Tallinn, Estonia, March 26th, 2024...

長期持有者持有的比特幣(BTC)供應量達到最高水平...

根據Glassnode 的估計,比特幣的長期持有者(LTH)目前擁有1452 萬枚BTC,創歷史新高,只剩下25% 留給短期持有者和投機者。 儘管BTC 的價格在過去一個月中保持相對平穩,範圍在約29,000 美元至31,000 美元之間,但人們還是開始瘋狂囤積。 ...

Caldera 宣布與Espresso Syste...

Caldera 開發人員可以利用Espresso Sequence...

抓住Web3 遊戲的先發優勢:成功策略

Web3和區塊鏈技術的出現徹底改變了遊戲行業,為開發者和企業家提供了前所未有的機遇。 Web3 遊戲的去中心化性質為創新遊戲貨幣化模式、玩家所有權和社區參與打開了大門。對於那些尋求利用Web3 遊戲巨大潛力的人來說,確保先發優勢至關重要。 了解Web3 遊戲生態系統在深入研究Web3 遊戲之前,有...

Taapsee Pannu 推出NFT 平台,介紹...

企業家貢獻者表達的意見是他們自己的。 您正在閱讀《企業家印度》,這是企業家媒體的國際特許經營刊物。 女演員Taapsee Pannu 最近推出了“taapseeclub.com”,這是她自己的非同質代...

比特幣(BTC) 地址休眠超過11 年,轉移310...

經過11 年多的閒置之後,一個包含3100 萬美元BTC 的休眠比特幣地址最近突然活躍起來。 2023年7月22日,地址 轉入 將其全部餘額轉移到新地址。 早期BTC 地址復活 比特幣自2009 年以來就已經存在,因此存在多年來不活躍的休眠地址,其中包含大量BTC。這種加密貨幣的一些早期採用者能夠...

加密貨幣死了嗎?當今加密貨幣的現狀

您之前可能聽說過加密貨幣正在消亡(或比特幣已消亡)。在這篇文章中,我們將研究加密貨幣的狀態,並嘗試回答這個問題:加密貨幣現在已經死了嗎? 在我們開始之前,我們想澄清一下,本文指的是最廣泛意義上的“加密貨幣行業”; 在裡面 網絡3 感覺。該定義包括加密資產市場; 但它還包括其他非財務用例。 隨著近來加...

Chancer 可能成為體育和社交博彩領域的下一個...

加密貨幣 隨著企業財報季節的繼續,本週股市表現好壞參半。在Ne...

以太坊(ETH) 創下兩個月來CEX 流入最高紀錄...

過去一周,以太坊(ETH)流入中心化交易所(CEX)的資金量創下了過去兩個月來的最高水平。這些重大的資產變動表明ETH 的價格可能會下跌。 CoinGecko 數據顯示,第二大加密貨幣的價格一直在小幅下跌,過去一周價值下跌了2.5%。截至撰寫本文時,以太幣易手價格為1,892.65 美元,過去24...

新的DeFi 法案有“不可行的義務”

加密貨幣創新委員會表示,新的反洗錢法案沒有為DeFi 中的非法金融...

幣安大幅削減成本,瑞波幣為美國銀行和加密貨幣風險投...

美國證券交易委員會(SEC)對加密貨幣公司的打擊似乎嚴重影響了幣安的業務。據報導,在過去幾週內,該加密貨幣交易所解雇了1,000 多名員工,並削減了一些福利。 幣安表示,“當前的市場環境和監管環境”導致利潤下降,這表明可能正在進行更多削減。一位發言人告訴Cointelegraph,該公司將考慮縮減“...

Automata 雙週更新:第48 期| 通過自動...

迎接新的季度意味著設定我們的意圖並為團隊規劃下一步的行動。幕後醞釀的一切——合作、產品功能和營銷發布——很難抑制我們的興奮。我們一開始就在1RPC(2 個備受期待的第2 層主網)上添加了對Linea 和Base 的支持。科技載體更新頁腳以顯示界面版本平滑的用戶體驗 USDC CCTP 支持 關於仲裁...