20250626 - SiloFinance 攻擊事件: 惡意輸入參數導致借款授權額度盜用
背景信息
SiloFinance 是一個借貸協議,用戶可以進行抵押借貸,也可以授權其他用戶使用其借貸額度。本次攻擊的原因是 LeverageUsingSiloFlashloanWithGeneralSwap 合約沒有對輸入參數進行檢查,使得攻擊者可以通過傳入構造惡意參數,盜用對該合約進行授權的用戶借貸額度,并將借出的 WETH 發送給攻擊者。損失高達 545K 美元。
- 攻擊者地址: https://etherscan.io/address/0x04377cfaf4b4a44bb84042218cdda4cebcf8fd62
- 其中一筆攻擊交易: https://app.blocksec.com/explorer/tx/eth/0x1f15a193db3f44713d56c4be6679b194f78c2bcdd2ced5b0c7495b7406f5e87a
- 漏洞合約:https://etherscan.io/address/0xcbee4617abf667830fe3ee7dc8d6f46380829df9#code
Trace 分析

前置交易
- 攻擊者先提前創建了攻擊合約 AttackContract:https://etherscan.io/tx/0xbbedbc0c13ed2acb7987a9c87dd870e08273999cb2b500ad9a7cb716ae60a873
- 被攻擊用戶向
LeverageUsingSiloFlashloanWithGeneralSwap合約授權最大的借出金額:https://app.blocksec.com/explorer/tx/eth/0x24a3ea75663dfb64beaf18e67965780a1594b7bfaa9aa9193355843dd8b77f97
攻擊交易
- AttackContract 調用
LeverageUsingSiloFlashloanWithGeneralSwap.openLeveragePosition()開倉 - 在參數中將
flashloanTarget設置為 AttackContract 自身,回調LeverageUsingSiloFlashloanWithGeneralSwap.onFlashLoan()函數 - 通過惡意構造
_data參數,解析后得到惡意的swapArgs參數,將原來本該是進行 swap 的 call 操作篡改為 borrow 操作。 - 利用
LeverageUsingSiloFlashloanWithGeneralSwap合約的身份,調用bWETH-105進行借貸 - Mint debtShareToken(bWETH-105) 給被攻擊用戶,transfer WETH 給 Hacker。(完成獲利)
- 把 AttackContract 設為
collateralAsset,從而將后續的transferFrom,approve,deposit和borrow的操作都略過。
代碼分析
首先調用 LeverageUsingSiloFlashloanWithGeneralSwap.openLeveragePosition() 函數,所傳入的參數均為攻擊者定制,沒有經過檢查。其中 flashloanTarget 的值為 AttackContract,使得后續 AttackContract 可以回調 LeverageUsingSiloFlashloanWithGeneralSwap.onFlashLoan() 函數。

在 LeverageUsingSiloFlashloanWithGeneralSwap 合約中,經過 onFlashLoan() -> _openLeverage() -> _fillQuote() 調用,在 _fillQuote() 函數中對傳入的惡意參數進行解析。函數原本設計的功能是進行 swap 操作,但是攻擊者通過構造惡意參數,使得 LeverageUsingSiloFlashloanWithGeneralSwap 合約調用了 bWETH-105.borrow() 函數。

為什么要通過
LeverageUsingSiloFlashloanWithGeneralSwap合約調用了bWETH-105.borrow()函數?
因為在“前置交易2”中,被攻擊合約向LeverageUsingSiloFlashloanWithGeneralSwap合約授權了bWETH-105的最大的借出金額,LeverageUsingSiloFlashloanWithGeneralSwap合約可以從bWETH-105中借出 WETH。
調用 Silo.boorow() 函數,將 debtToken(dWETH-105) 記錄在 LeverageUsingSiloFlashloanWithGeneralSwap 合約賬上,借出 WETH 發送給 Hacker。

dWETH-105.mint() 函數中使用被攻擊合約在“前置交易2”中的授權進行借貸,完成獲利。


浙公網安備 33010602011771號