20250626 - SiloFinance 攻击事件: 恶意输入参数导致借款授权额度盗用

背景信息

SiloFinance 是一个借贷协议,用户可以进行抵押借贷,也可以授权其他用户使用其借贷额度。本次攻击的原因是 LeverageUsingSiloFlashloanWithGeneralSwap 合约没有对输入参数进行检查,使得攻击者可以通过传入构造恶意参数,盗用对该合约进行授权的用户借贷额度,并将借出的 WETH 发送给攻击者。损失高达 545K 美元。

Trace 分析

前置交易

  1. 攻击者先提前创建了攻击合约 AttackContract:https://etherscan.io/tx/0xbbedbc0c13ed2acb7987a9c87dd870e08273999cb2b500ad9a7cb716ae60a873
  2. 被攻击用户向 LeverageUsingSiloFlashloanWithGeneralSwap 合约授权最大的借出金额:https://etherscan.io/tx/0x24a3ea75663dfb64beaf18e67965780a1594b7bfaa9aa9193355843dd8b77f97

攻击交易

  1. AttackContract 调用 LeverageUsingSiloFlashloanWithGeneralSwap.openLeveragePosition() 开仓
  2. 在参数中将 flashloanTarget 设置为 AttackContract 自身,回调 LeverageUsingSiloFlashloanWithGeneralSwap.onFlashLoan() 函数
  3. 通过恶意构造 _data 参数,解析后得到恶意的 swapArgs 参数,将原来本该是进行 swap 的 call 操作篡改为 borrow 操作。
  4. 利用 LeverageUsingSiloFlashloanWithGeneralSwap 合约的身份,调用 bWETH-105 进行借贷
  5. Mint debtShareToken(bWETH-105) 给 LeverageUsingSiloFlashloanWithGeneralSwap 合约,transfer WETH 给 Hacker。(完成获利)
  6. 把 AttackContract 设为 collateralAsset ,从而将后续的 transferFromapprovedepositborrow 的操作都略过。

代码分析

首先调用 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”中的授权进行借贷,完成获利。


__EOF__

原创作者: ACaiGarden 转载于: https://www.cnblogs.com/ACaiGarden/p/18953036
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值