背景信息
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://etherscan.io/tx/0x24a3ea75663dfb64beaf18e67965780a1594b7bfaa9aa9193355843dd8b77f97
攻击交易
- AttackContract 调用
LeverageUsingSiloFlashloanWithGeneralSwap.openLeveragePosition()
开仓 - 在参数中将
flashloanTarget
设置为 AttackContract 自身,回调LeverageUsingSiloFlashloanWithGeneralSwap.onFlashLoan()
函数 - 通过恶意构造
_data
参数,解析后得到恶意的swapArgs
参数,将原来本该是进行 swap 的 call 操作篡改为 borrow 操作。 - 利用
LeverageUsingSiloFlashloanWithGeneralSwap
合约的身份,调用bWETH-105
进行借贷 - Mint debtShareToken(bWETH-105) 给
LeverageUsingSiloFlashloanWithGeneralSwap
合约,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”中的授权进行借贷,完成获利。
__EOF__
- 本文作者: ACai's Blog
- 本文链接: https://www.cnblogs.com/ACaiGarden/p/18953036
- 关于博主: 评论和私信会在第一时间回复。或者直接私信我。
- 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
- 声援博主: 如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。