【漏洞分析】Li.Fi攻擊事件分析:缺乏關鍵參數檢查的鉆石協議
背景信息
2024 年 7 月 16日,Li.Fi 協議遭受黑客攻擊,漏洞成因是鉆石協議中 diamond 合約新添加的 facet 合約沒有對參數進行檢查,導致 call 函數任意執行。且 diamond 合約擁有用戶的 approve,所以攻擊者可以構造惡意參數對用戶資金進行轉移。
相關合約
- 鉆石協議 LiFiDiamond:https://etherscan.io/address/0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae#code
- 邏輯合約 GasZipFacet:https://etherscan.io/address/0xf28a352377663ca134bd27b582b1a9a4dad7e534#code
鉆石協議
鉆石協議的提案是 EIP-2535 :https://eips.ethereum.org/EIPS/eip-2535 ,想詳細了解的讀者可以閱讀提案的具體內容。簡單理解一下就是變種的 proxy 形式,根據不同的函數調用不同的 implement 合約。

Trace 分析
攻擊者調用 LiFiDiamond.depositToGasZipERC20 函數,Diamond 合約 delegatecall Facet 合約

GasZipFacet.depositToGasZipERC20

LibSwap.swap 函數

在 _swap.callTo.call{value: nativeValue}(_swap.callData)函數中,攻擊者構造惡意參數,導致實際上調用的是 USDT.transferFrom() 函數。

ERC20 授權
由于在 LibAsset 中需要用到 transferFrom 函數轉移用戶的 ERC20 代幣,所以需要用戶對 LiFiDiamond 合約進行代幣授權。這是攻擊發生的第二個條件。


浙公網安備 33010602011771號