背景介紹
2025年6⽉25⽇,我們監控到Ethereum 上針對SiloFinance的攻擊事件:
https://etherscan.io/address/0xcbee4617abf667830fe3ee7dc8d6f46380829df9
攻擊共造成54.6k USD的損失。
攻擊及事件分析
⾸先,攻擊者調⽤了合約的openLeveragePostion ,該函數是⼀個⽤於開啟槓桿頭⼨的函數,它透過閃電貸(flashloan)機制來實現槓桿交易。接著在onFlashLoan 回檔中執⾏ _openLeverage 完成將閃電貸資⾦透過_fillQuote 轉換為抵押品等操作。

我們可以看到相關程式碼:

其中_flashArgs.flashloadTarget 為攻擊者設定的攻擊合約,所以函數調⽤了攻擊和約的flashloan 。

隨後,攻擊合約調⽤了onFlashLoan ,我們可以看到相關代碼如下:

由於_txAction 在函數openLeveragePostion 已經被設定成為了LeverageAction.Open ,所以接下來會調⽤ _openLerverage 。

接著會調⽤ _fillQuote ,這個函數的作⽤是將debt token 兌換為collateral token ,問題就出在這裡⾥。我們看⼀下_fillQuote 的實作⽅式:
struct SwapArgs {
address exchangeProxy; //0x160287e2d3fdcde9e91317982fc1cc01c1f94085
address sellToken; //0x79c5c002410a67ac7a0cde2c2217c3f560859c7e
address buyToken; //0x79c5c002410a67ac7a0cde2c2217c3f560859c7e
address allowanceTarget;//0x79c5c002410a67ac7a0cde2c2217c3f560859c7e
bytes swapCallData; //0xd516418400000000000000000000000000000000000000000000000c249fdd327780000000000000000000000000000004377cfaf4b4a44bb84042218cdda4cebcf8fd6200000000000000000000000060baf994f44dd10c19c0c47cbfe6048a4ffe4860}
我們將input data 也就是swapCallData 解碼後得到:
0xd5164184 // borrow(uint256,address,address)
0x00000000000000000000000c249fdd3277800000 //uint256 _assets
0x04377cfaf4b4a44bb84042218cdda4cebcf8fd62 //address _recviver
0x60baf994f44dd10c19c0c47cbfe6048a4ffe4860 //address _borrower
也意味著攻擊者調⽤了borrow 函數。隨後,攻擊者透過borrow 獲得了224個WETH 完成攻擊。

總結
本次漏洞的成因是Silo 合約的flashloan callback 函數沒有驗證傳入的數據,導致攻擊者傳入惡意數據,最終完成對Silo 的攻擊。建議項⽬⽅在設計經濟模型及程式碼運⾏邏輯時要多⽅驗證,合約上線前審計時盡量選擇多個審計公司交叉審計。
