背景介绍

2025年6⽉25⽇,我们监控到 Ethereum 上针对SiloFinance的攻击事件:

https://etherscan.io/address/0xcbee4617abf667830fe3ee7dc8d6f46380829df9

攻击共造成54.6k USD 的损失。

攻击及事件分析

⾸先,攻击者调⽤了合约的 openLeveragePostion ,该函数是⼀个⽤于开启杠杆头⼨的函数,它通过闪电贷(flashloan)机制来实现杠杆交易。随后在 onFlashLoan 回调中执⾏ _openLeverage 完成将闪电贷资⾦通过 _fillQuote 转换为抵押品等操作。

零时科技 || SiloFinance 攻击事件分析

我们可以看到相关代码:

零时科技 || SiloFinance 攻击事件分析

其中 _flashArgs.flashloadTarget 为攻击者设置的攻击合约,所以该函数调⽤了攻击和约的 flashloan 。

零时科技 || SiloFinance 攻击事件分析

随后,攻击合约调⽤了 onFlashLoan ,我们可以看到相关代码如下:

零时科技 || SiloFinance 攻击事件分析

由于 _txAction 在函数 openLeveragePostion 已经被设置成为了 LeverageAction.Open ,所以接下来会调⽤ _openLerverage 。

零时科技 || SiloFinance 攻击事件分析

随后会调⽤ _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 完成攻击。

零时科技 || SiloFinance 攻击事件分析

总结

本次漏洞的成因是 Silo 合约的 flashloan callback 函数没有验证传入的数据,导致攻击者传入恶意数据,最终完成对 Silo 的攻击。建议项⽬⽅在设计经济模型和代码运⾏逻辑时要多⽅验证,合约上线前审计时尽量选择多个审计公司交叉审计。