背景資訊
2024 年 7 月 16日,Li.Fi 協議遭受駭客攻擊,漏洞成因是鑽石協議中 diamond 合約新新增的 facet 合約沒有對引數進行檢查,導致 call 函式任意執行。且 diamond 合約擁有使用者的 approve,所以攻擊者可以構造惡意引數對使用者資金進行轉移。
攻擊交易https://app.blocksec.com/explorer/tx/eth/0xd82fe84e63b1aa52e1ce540582ee0895ba4a71ec5e7a632a3faa1aff3e763873
相關合約
- 鑽石協議 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
合約進行代幣授權。這是攻擊發生的第二個條件。