返回部落格

#5:Platypus Finance:三次攻擊中憑一絲運氣倖存

Code Auditing
2024年2月15日
閱讀約 6 分鐘

摘要

Platypus Finance 是 Avalanche 區塊鏈上的一個 AMM 協議。它已遭受過三次攻擊,如下所示:

  • 2023年2月17日,由於錯誤的償付能力檢查,該協議遭到駭客攻擊,總損失約為 905 萬美元。其中,在 BlockSec 的幫助下追回了 240 萬美元。約 38 萬個代幣卡在 Aave 合約中,隨後被歸還。
  • 2023年7月12日,該協議遭到駭客攻擊,由於忽略了穩定幣之間的價格差異,損失約 5 萬美元。
  • 2023年10月12日,它遭受了價格操縱攻擊,損失約 220 萬美元。在與攻擊者協商後,90% 的被盜資金已被歸還。

該項目能夠在這些攻擊中倖存下來實屬幸運。我們對這三次漏洞利用的分析表明,如果採用嚴謹的審計或更積極的安全措施,這些邏輯缺陷本可以避免。

攻擊一

要理解這起安全事件,必須先了解幾個智能合約的工作流程。大致流程如下:

  • 用戶可以將代幣存入資金池成為 LP,並獲得 LP 代幣。
  • LP 代幣可以質押到 MasterPlatypus 中以獲取獎勵。在此過程中,LP 代幣將被轉入 MasterPlatypus 合約。
  • LP 代幣可以用作抵押品來借入其他資產,以提高資產使用效率。

下圖展示了這些交互過程。

漏洞分析

該漏洞存在於 MasterPlatypus 合約內名為 emergencyWithdraw 的函數中。在緊急情況下,該函數應被用於提取質押在 MasterPlatypus 合約中的 LP 代幣。在該函數中,合約會檢查用戶是否 Solvent(具有償付能力),以允許提款。其邏輯是檢查用戶是否存在壞帳(即抵押品是否足以償還債務)。如果沒有,用戶便可以提取質押的 LP 代幣。

然而,這個邏輯存在缺陷。用戶 Solvent 只是意味著用戶的抵押品可以償還其債務。但是,它並沒有檢查用戶在緊急提取質押代幣之後是否仍然保持償付能力。攻擊者可以利用這一缺陷借入資產,然後緊急提取質押的 LP 代幣(而無需償還債務)。詳見 Immunefi 部落格中的詳細分析。

攻擊分析

我們以一筆攻擊交易為例,展示整個攻擊過程。

步驟 1:從 AAVE 借入 4400 萬 USDC 閃電貸

步驟 2:將 4400 萬 USDC 存入資金池以獲得 LP-USDC

步驟 3:將 LP-USDC 存入 MasterPlatypus

步驟 4:使用 LP-USDC 作為抵押品借入 USP

步驟 5:執行 emergencyWithdraw 函數以發動攻擊

攻擊者在未償還 USP 債務的情況下獲得了 LP-USDC。

步驟 6:從資金池提取 LP-USDC 以獲得 USDC

步驟 7:賣出 USP 以獲利

然而,這些利潤留在了攻擊合約內部。事實上,攻擊者本可以設置一個新的接收地址進行交換以獲取利潤。

BlockSec 的救援行動

我們發現攻擊者將利潤留在了攻擊合約內。此外,攻擊合約內部沒有提取資產的邏輯。然而,我們在攻擊合約中發現了一個漏洞,可以利用該漏洞進行反制,以提取合約內部分資產。

具體來說,閃電貸回調函數存在訪問控制問題,這意味著任何人都可以調用這個回調函數。這也是許多 MEV 機器人遭受攻擊的根本原因。

此外,在回調函數內部,攻擊者合約將 USDC 代幣批准(approve)給了 Platypus finance 資金池合約。而這個資金池合約是可升級的!

結合以上兩點,我們可以通過以下方式救回攻擊合約內部的 USDC:

  • 升級 Platypus finance 資金池合約,加入從合約中提取 USDC 的邏輯
  • 調用攻擊合約的回調函數,將 USDC 批准給資金池合約
  • 資金池合約可以替換任何函數(該函數將由攻擊合約執行),從攻擊合約轉出 USDC(因為攻擊合約已將 USDC 批准給資金池合約)。

以下是追回 240 萬 USDC 的交易。

其他兩次攻擊

有關其他兩次攻擊的更多詳情,請參閱以下連結。

  • 攻擊二:2023年7月11日,協議假設 USDC 和 USDT 之間的比率為 1:1,這偏離了市場波動,導致提款邏輯存在缺陷。一筆攻擊交易的連結。還有若干筆類似交易。

  • 攻擊三:2023年10月12日,由於 cash 和 liability 被操縱,從而影響了交換價格。[第一筆攻擊交易 | 第二筆攻擊交易]

總結

這三次攻擊利用了協議中不同的漏洞。儘管一些其他供應商已經對該協議進行了審計,攻擊者仍然找到了漏洞並成功利用了該協議。幸運的是,部分資產得以追回,但我們不能總是指望運氣。應當採用包括攻擊監控和自動響應在內的更多安全措施,以保護協議和用戶資產的安全。

閱讀本系列的其他文章:

訂閱最新動態
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 審計