摘要
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 批准給資金池合約)。

其他兩次攻擊
有關其他兩次攻擊的更多詳情,請參閱以下連結。
-
攻擊二:2023年7月11日,協議假設 USDC 和 USDT 之間的比率為 1:1,這偏離了市場波動,導致提款邏輯存在缺陷。一筆攻擊交易的連結。還有若干筆類似交易。
-
攻擊三:2023年10月12日,由於
cash和liability被操縱,從而影響了交換價格。[第一筆攻擊交易 | 第二筆攻擊交易]
總結
這三次攻擊利用了協議中不同的漏洞。儘管一些其他供應商已經對該協議進行了審計,攻擊者仍然找到了漏洞並成功利用了該協議。幸運的是,部分資產得以追回,但我們不能總是指望運氣。應當採用包括攻擊監控和自動響應在內的更多安全措施,以保護協議和用戶資產的安全。
閱讀本系列的其他文章:
- 引言:2023年十大「精彩」安全事件
- 第一篇:利用 Flashbots Relay 漏洞收割 MEV 機器人
- 第二篇:Euler Finance 事件:2023年最大規模的駭客攻擊
- 第三篇:KyberSwap 事件:以極其精妙的計算巧妙利用捨入誤差
- 第四篇:Curve 事件:編譯器錯誤從無辜的原始碼中產生了有缺陷的位元組碼
- 第六篇:Hundred Finance 事件:催化了針對脆弱分叉協議的精度相關漏洞利用浪潮
- 第七篇:ParaSpace 事件:一場與時間賽跑以阻止業界迄今最嚴重攻擊的行動
- 第八篇:SushiSwap 事件:一次笨拙的救援嘗試引發了一系列模仿攻擊
- 第九篇:MEV 機器人 0xd61492:在一次巧妙的漏洞利用中從掠食者變為獵物
- 第十篇:ThirdWeb 事件:受信任模塊之間的不兼容性暴露了漏洞



