By: 九九@慢霧安全團隊
背景
根據慢霧安全團隊情報,2024 年9 月4 日,去中心化流動性收益計畫 Penpie 遭攻擊,攻擊者獲利近3 千萬美元。慢霧安全團隊對此事件展開分析並將結果分享如下:
(https://x.com/Penpiexyz_io/status/1831058385330118831)
前置知識
Pendle Finance 是一種去中心化金融收益交易協議,總鎖定價值超過45 億美元。該協議成功地與Magpie 整合,旨在優化收益機會並增強其veTokenomics 模型。在此基礎上,Penpie 專案引入了流動性挖礦功能,使Pendle Finance 的市場能夠實現被動收益。
在Pendle Finance 中包含以下幾個重要概念:
-
PT (Principal Token):代表未來某個時間點的本金。持有PT 代表握有本金的擁有權、並於到期後可兌換領回。例如你擁有一張1 年後到期的1 枚PT-stETH 選擇權,那麼在1 年後你將能兌換價值1 ETH 的stETH。
-
YT (Yield Token):代表未來的收益。持有YT 代表你擁有底層資產產生的所有即時收益,並且可以隨時在Pendle 上手動領取所累積的收益。如果你擁有1 個YT-stETH,而stETH 的平均收益率為5%,那麼在一年結束時,你將累積0.05 個stETH。
-
SY (Simple Yield):用於包裝任何生息代幣的合約。其提供了標準化的接口,可以與任何生息代幣的收益產生機制進行互動。
-
LPT (Liquidity Provider Token):代表一個流動性市場,作為提供底層資產流動性的憑證。
-
PRT (Pool Reward Token):代表Penpie 池子中用戶存入LPT 代幣的存款憑證。
根本原因
這次事件的核心在於Penpie 在註冊新的Pendle 市場時,錯誤地假設所有由Pendle Finance 創建的市場都是合法的。然而,Pendle Finance 的市場創建流程是開放式的,允許任何人創建市場,並且其中的關鍵參數如SY 合約地址,可以由用戶自訂。利用這一點,攻擊者創建了一個含有惡意SY 合約的市場合約,並利用Penpie 池子在獲取獎勵時需要對外部SY 合約調用的機制,借助閃電貸為市場和池子添加了大量的流動性,人為放大了獎勵金額,從而獲利。
攻擊步驟分析
攻擊前置準備
交易哈希:0x7e7f9548f301d3dd863eac94e6190cb742ab6aa9d7730549ff743bf84cbd21d1
1. 首先,攻擊者透過PendleYieldContractFactory 合約的createYieldContract 函數創建PT 和YT 收益合約,將SY 設定為攻擊合約位址,並以此調用PendleMarketFactoryV3 合約的createNewMarket 函數創建了對應的市場合約0x5b6c_PENDLE-LPTL。
2. 接著,攻擊者使用PendleMarketRegisterHelper 合約的registerPenpiePool 註冊Penpie 池子,此過程中會建立存款憑證PRT 代幣合約及相關的rewarder 合約,並在Penpie 中登記池子資訊。
3. 隨後,攻擊者調用YT 合約的mintPY 函數,鑄造大量YT 和PT,數量取決於攻擊合約(SY 合約)返回的匯率。
4. 緊跟著,攻擊者將PT 存入市場0x5b6c_PENDLE-LPT 並鑄造LP 代幣。
5. 最後,攻擊者將LP 代幣存入Penpie 池子,換取存款憑證PRT 代幣。
正式攻擊
交易雜湊:0x42b2ec27c732100dd9037c76da415e10329ea41598de453bb0c0c9ea7ce0d8e5
1. 攻擊者先透過閃電貸借出大量agETH 和rswETH 代幣。
2. 呼叫Penpie 池子的batchHarvestMarketRewards 函數,批量收集指定市場的獎勵,此操作觸發了市場合約0x5b6c_PENDLE-LPT 的redeemRewards 函數。
3. 在redeemRewards 函數中,外部調用了SY 合約(攻擊合約)的claimRewards 函數,期間攻擊者使用閃電貸資金為獎勵代幣增加流動性(攻擊合約中特意將獎勵代幣設置為兩種市場代幣0x6010_PENDLE-LPT 和0x038c_PENDLE-LPT),並將獲得的市場代幣存入Penpie 池子,從而獲得相應的存款憑證代幣。
4. 接著,這些新存入Penpie 池子的市場代幣會被當作計算出來的獎勵,隨後透過Rewarder 合約的queueNewRewards 函數將這些代幣轉移至該合約。
由於0x5b6c_PENDLE-LPT 市場中僅攻擊者一人存款,因此可以立即調用MasterPenpie 合約的multiclaim 函數,提取 Rewarder 合約中的這部分LPT 代幣。
5. 最後,攻擊者透過PendleMarketDepositHelper 合約的withdrawMarket 函數燃燒在第三步獲取的存款憑證PRT,贖回市場代幣,並將這些市場代幣連同上一步中提取的獎勵一同移除流動性,最終獲取基礎資產代幣(agETH 和rswETH),實現獲利。
總結
這次安全事件揭露了Penpie 在市場註冊環節存在校驗不足的問題,過度依賴Pendle Finance 的市場創建邏輯,導致攻擊者能夠透過惡意合約控制獎勵分配機制,從而獲得超額獎勵。慢霧安全團隊建議專案方在註冊市場時,增加嚴格的白名單驗證機制,確保只有經過驗證的市場才能被接受。此外,對於涉及外部合約調用的關鍵業務邏輯,應加強審計與安全測試,避免再次發生類似事件。