Paraluni 項目於 3 月 13 日上午(UTC+8 時間)遭到攻擊。攻擊者利用了兩個漏洞來攻擊該協議。第一個漏洞是缺乏對傳入代幣的驗證,第二個則是傳統的重入攻擊(Reentrancy)。攻擊者發起了幾筆攻擊交易。在下文中,我們將以其中一筆交易 0xf2bba649019ce40a67f0fb74e5e800257d359d9094b6ba6faea14ffa4d3446b1 為例,說明整個攻擊過程。
第一步:向 paraRouter 添加 liquidity(流動性)

攻擊者向 BTCB-WBNB 資金池(索引 = 9)調用了 addLiquidity,該資金池會將 LP 代幣鑄造給 UBT(由攻擊者創建的代幣)。在此操作之後,UBT 代幣持有該資金池的 LP 代幣。請注意,BTCB 和 WBNB 是從閃電貸借入的。
第二步:調用 MasterChef 的 depositByAddLiquidity
攻擊者通過提供 _pid 為 9 並使用 UGT 和 UBT 代幣作為參數,調用了 depositByAddLiquidity。然而,該函數並未檢查資金池的儲備代幣是否與傳入的代幣(UGT 和 UBT)相等。

接著,該函數會調用 depositByAddLiquidityInternal,進而調用 paraRouter 的 addLiquidity。此函數將調用 UGT 和 UBT 代幣的 transferFrom 函數。然而,這兩個代幣是由攻擊者控制的。在 UBT 的 transferFrom 函數中,攻擊者調用了 MasterChef 合約的 deposit 函數,將第一步中獲得的 LP 代幣存入 MasterChef 合約。

不幸的是,由於 deposit 函數中的餘額發生了變化,addLiquidity 之後的 newBalance 遠大於 oldBalance。通過這種方式,攻擊者在 MasterChef 合約中獲得了雙倍的額度。

第三步:獲取利潤
攻擊者最終調用了 UBT.withdrawAsset 和 MasterChef.withdraw 來贖回 LP 代幣,從而獲得 BTCB 和 WBNB。由於流動性數量超過了攻擊者應有的份額,攻擊者因此獲利。

教訓
除了重入問題外,未對傳入代幣進行驗證也是根本原因之一。我們曾見過其他具有類似情況的案例,例如 Visor 事件 和 Coin98 事件。
關於 BlockSec
BlockSec 是一家開拓性的區塊鏈安全公司,由一群全球傑出的安全專家於 2021 年創立。公司致力於提升新興 Web3 世界的安全性和可用性,以促進其大規模採用。為此,BlockSec 提供智能合約與 EVM 鏈的安全審計服務、用於安全開發與主動阻斷威脅的 Phalcon 平台、用於資金追蹤與調查的 MetaSleuth 平台,以及協助 Web3 開發者在加密世界中高效運作的 MetaSuites 擴展程式。
迄今為止,公司已為包括 MetaMask、Uniswap Foundation、Compound、Forta 和 PancakeSwap 在內的 300 多家知名客戶提供服務,並獲得了來自 Matrix Partners、Vitalbridge Capital 和複星資本(Fenbushi Capital)等傑出投資者的兩輪數千萬美元融資。
官方 Twitter 帳號:https://twitter.com/BlockSecTeam



