此次攻擊的關鍵是核心函數的許可權管控功能和流動性代幣的價格計算模型。
作者:九九
據慢霧安全團隊情報,2023 年 7 月 25 日,BSC 鏈上的 Palmswap 專案遭到攻擊,攻擊者獲利超 90 萬美元。 慢霧安全團隊介入分析后將結果分享如下:
相關信息
Palmswap v2 提供了一個高流動性、功能強大且使用者友好的去中心化槓桿交易平臺。 其中 PLP 是 Palmswap 交易平台的流動性提供者代幣,它由用於槓桿交易的 USDT 資產指數組成。 PLP 可以用 USDT 鑄造,然後用 USDT 燒回去。 鑄造和重新燃燒的價格是用指數中資產的總價值(包括未平倉頭寸的損益)除以 PLP 供應量得到。
以下是本次攻擊涉及的相關位址:
攻擊者 EOA 位址:
0xf84efa8a9f7e68855cf17eaac9c2f97a9d131366
攻擊合約位址:
0x55252a6d50bfad0e5f1009541284c783686f7f25
攻擊交易:
被攻擊的合約位址:
0xd990094a611c3de34664dd3664ebf979a1230fc1
0xa68f4b2c69c7f991c3237ba9b678d75368ccff8f
0x806f709558cdbba39699fbf323c8fda4e364ac7a
攻擊核心點
在 Palmswap 交易平臺中,PLP 代幣的價格基於金庫中的 USDT 數量和 PLP 代幣總供應量。
而如果金庫合約沒有開啟管理員模式的話,任何使用者都可以通過直接用 USDT 購買 USDP 代幣的方式來提高金庫中的 USDT 數量,且不改變 PLP 代幣的總供應量,這將導致攻擊者可以利用閃電貸惡意操控 PLP 代幣的價格獲利。
具體細節分析
1. 攻擊者首先通過閃電貸借出 3,000,000 枚 USDT,並用其中 1,000,000 枚 USDT 去添加流動性,鑄造 PLP 代幣。
2. 在添加流動性的函數中,攻擊者先轉入 USDT,並調用金庫合約的 buyUSDP 函數購買 USDP 代幣,之後用通過購買的 USDP 代幣數量計算所需鑄造的 PLP 代幣數量。
此處攻擊者用 1,000,000 枚 USDT 購買了 996,769 枚 USDP,並鑄造出了約 996,324 枚 PLP 代幣。
3. 接著攻擊者調用金庫合約中的 buyUSDP 函數,該函數在通過管理員驗證後可以直接用 USDT 購買 USDP 代幣,同時會增加金庫合約中的 USDT 代幣儲備。
但是由於金庫合約並沒有開啟管理員模式,導致任何使用者都可以直接調用金庫合約的 buyUSDP 函數來購買 USDP 代幣,所以攻擊者直接將閃電貸剩餘的 2,000,000 枚 USDT 轉入金庫合約並購買 USDP 代幣。
4. 緊跟著,攻擊者立馬移除流動性,此時會燃燒掉所有的 PLP 代幣並賣出 USDP 代幣。 但是可以發現,攻擊者燃燒掉 996,311 枚 PLP 代幣卻獲取了 1,962,472 枚 USDP 代幣。
這是由於在上一步購買 USDP 後,金庫中的 USDT 代幣數量突然暴增,而 PLP 代幣的價格基於金庫中 USDT 的餘額進行計算的,因此 PLP 代幣的價格也被拉高,使得攻擊者獲取了超出預期的 USDP 代幣。
5. 最後,攻擊者調用金庫合約的 sellUSDP 函數,賣出第三步中獲取的剩餘 USDP 代幣,換成 USDT 后歸還閃電貸,獲利離場。
總結
本次攻擊事件是由於核心函數的許可權管控功能未開啟,並且流動性代幣的價格計算模型設計得過於簡單,僅取決於金庫中的 USDT 代幣數量和總供應量,導致攻擊者可以利用閃電貸來惡意操控價格以獲取非預期的利潤。 慢霧安全團隊建議專案方設計流動性代幣的價格模型時,加入多方面因素進行限制,例如添加流動性的時間因數等,並且嚴格限制核心函數的許可權。
免責聲明:作為區塊鏈資訊平臺,本站所發佈文章僅代表作者及嘉賓個人觀點,與 Web3Caff 立場無關。 本文內容僅用於資訊分享,均不構成任何投資建議及要約,並請您遵守所在國家或地區的相關法律法規。