我们监控到 Ethereum 上针对 SiloFinance 的攻击事件,攻击共造成 54.6k USD 的损失。
<!--StartFragment-->
2025年6⽉25⽇,我们监控到 Ethereum 上针对 SiloFinance 的攻击事件:
https\://etherscan.io/address/0xcbee4617abf667830fe3ee7dc8d6f46380829df9
攻击共造成 54.6k USD 的损失。
<!--EndFragment-->
<!--StartFragment-->
⾸先,攻击者调⽤了合约的 openLeveragePostion ,该函数是⼀个⽤于开启杠杆头⼨的函数,它通过闪电贷(flashloan)机制来实现杠杆交易。随后在 onFlashLoan 回调中执⾏ _openLeverage 完成将闪电贷资⾦通过 _fillQuote 转换为抵押品等操作。
<!--EndFragment-->
<!--StartFragment-->
我们可以看到相关代码:
<!--EndFragment-->
<!--StartFragment-->
其中 _flashArgs.flashloadTarget 为攻击者设置的攻击合约,所以该函数调⽤了攻击和约的 flashloan 。
<!--EndFragment-->
<!--StartFragment-->
随后,攻击合约调⽤了 onFlashLoan ,我们可以看到相关代码如下:
<!--EndFragment-->
<!--StartFragment-->
由于 _txAction 在函数 openLeveragePostion 已经被设置成为了 LeverageAction.Open ,所以接下来会调⽤ _openLerverage 。
<!--EndFragment-->
<!--StartFragment-->
随后会调⽤ _fillQuote ,这个函数的作⽤是将 debt token 兑换为 collateral token ,问题就出在这⾥。我们看⼀下_fillQuote 的实现⽅式:
<!--EndFragment-->
<!--StartFragment-->
我们可以看到, contract addr 为 swapArgs.exchageProxy , input data 为 swapArgs.swapCallData 。这两个参数均为 SwapArgs 结构体中的成员,来⾃ onFlashLoan 的 _data ,可以被攻击者控制。
<!--EndFragment-->
struct SwapArgs {
address exchangeProxy; //0x160287e2d3fdcde9e91317982fc1cc01c1f94085
address sellToken; //0x79c5c002410a67ac7a0cde2c2217c3f560859c7e
address buyToken; //0x79c5c002410a67ac7a0cde2c2217c3f560859c7e
address allowanceTarget;//0x79c5c002410a67ac7a0cde2c2217c3f560859c7e
bytes swapCallData; //0xd516418400000000000000000000000000000000000000000000000c249fdd327780000000000000000000000000000004377cfaf4b4a44bb84042218cdda4cebcf8fd6200000000000000000000000060baf994f44dd10c19c0c47cbfe6048a4ffe4860}
<!--StartFragment-->
我们将 input data 也就是 swapCallData 解码后得到:
<!--EndFragment-->
0xd5164184 // borrow(uint256,address,address)
0x00000000000000000000000c249fdd3277800000 //uint256 _assets
0x04377cfaf4b4a44bb84042218cdda4cebcf8fd62 //address _recviver
0x60baf994f44dd10c19c0c47cbfe6048a4ffe4860 //address _borrower
<!--StartFragment-->
也就意味着攻击者调⽤了 borrow 函数。随后,攻击者通过 borrow 获得了 224个WETH 完成攻击。
<!--EndFragment-->
<!--StartFragment-->
本次漏洞的成因是 Silo 合约的 flashloan callback 函数没有验证传入的数据,导致攻击者传入恶意数据,最终完成对 Silo 的攻击。建议项⽬⽅在设计经济模型和代码运⾏逻辑时要多⽅验证,合约上线前审计时尽量选择多个审计公司交叉审计。
<!--EndFragment-->
<!--StartFragment-->
官网:https\://noneage.com/
邮箱:support\@noneage.com
电话:15029229543
<!--EndFragment-->
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!