20250626 - SiloFinance 攻击事件: 恶意输入参数导致借款授权额度盗用
背景信息
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”中的授权进行借贷,完成获利。

20250626 - SiloFinance 攻击事件: 恶意输入参数导致借款授权额度盗用的更多相关文章
- 孟加拉央行SWIFT攻击事件恶意木马分析(转)
第一章 分析概述 该恶意木马样本为运行于winodws平台上的PE文件(名称:evtdiag.exe).文件大小为64KB,编译时间是2016年2月5日. 经分析,该样本为定制的攻击SWIFT客户端程 ...
- 阿里云提示:对输入参数id未进行正确类型转义,导致整型注入的发生
类似以下提示: XXX.php中,对输入参数id未进行正确类型转义,导致整型注入的发生 解决办法: 找到对应文件:$id = $_GET['id']; 增加以下标红过滤: $id = $_GET['i ...
- 新浪微博XSS攻击事件
http://blog.csdn.net/terryzero/article/details/6575078 6月28日20时14分左右开始,新浪微博出现了一次比较大的XSS攻击事件.大量用户自动发送 ...
- 如何获得Webapp的根项目路径 即ServletContext.getRealPath() 的输入参数要以"/"开头
ServletContext.getRealPath() 的输入参数要以"/"开头 2014-03-26 15:54 5738人阅读 评论(1) 收藏 举报 版权声明:本文为博主原 ...
- riot.js教程【三】访问DOM元素、使用jquery、mount输入参数、riotjs标签的生命周期
前文回顾 riot.js教程[二]组件撰写准则.预处理器.标签样式和装配方法 riot.js教程[一]简介 访问DOM元素 你可以通过this.refs对象访问dom元素 而且还有大量的属性简写方式可 ...
- java Servlet+mysql 调用带有输入参数和返回值的存储过程(原创)
这个数据访问的功能,我在.NET+Mysql .NET+Sqlserver PHP+Mysql上都实现过,并且都发布在了我博客园里面,因为我觉得这个功能实在是太重要,会让你少写很多SQL语句不说,还 ...
- 使用getopts处理shell中的输入参数
在编写shell脚本中,经常要处理一些输入参数,在使用过程中发现getopts更加方便,能够很好的处理用户输入的参数和参数值. getopts用于处理用户输入参数,举例说明使用方法: while ...
- SQL Server存储过程中使用表值作为输入参数示例
这篇文章主要介绍了SQL Server存储过程中使用表值作为输入参数示例,使用表值参数,可以不必创建临时表或许多参数,即可向 Transact-SQL 语句或例程(如存储过程或函数)发送多行数据,这样 ...
- 输入参数是NSDate,输出结果是星期几的字符串
给你一个方法,输入参数是NSDate,输出结果是星期几的字符串.+ (NSString*)weekdayStringFromDate:(NSDate*)inputDate { NSArray *wee ...
- Shell脚本中判断输入参数个数的方法投稿:junjie 字体:[增加 减小] 类型:转载
Shell脚本中判断输入参数个数的方法 投稿:junjie 字体:[增加 减小] 类型:转载 这篇文章主要介绍了Shell脚本中判断输入参数个数的方法,使用内置变量$#即可实现判断输入了多少个参数 ...
随机推荐
- 【单片机】滑稽AT89C52表情实现
[单片机]滑稽AT89C52表情实现 零.原因 在群里看到了这样一个表情: 这是用51做的,刚好开发板上有8个小灯,想实现一下. 一.代码 新建工程,写入如下代码: #include<reg52 ...
- dxSpreadSheet的报表demo-关于设计报表模板的Datagroup问题
看随机的报表DEMO,主从表也好,数据分组也好.呈现的非常到位. 问题:可是自己在实现数据分组时,一旦设定分组字段就出现了混乱的数据记录. 问题的原因: 看一下一个报表页面设计时需要理清的概念. 页头 ...
- FireDAC开发DataSnap应用系统【1】-快储功能
FireDAC是吧DataSnap服务器当成API来调用,而dbExpress使用IAppServer接口. 关键点: 1.客户端调用API要回传数据,那么FireDAC把数据已Stream的格式传递 ...
- Redis 分布式锁的正确实现原理演化历程与 Redission的源码
当线程A,加锁并设置过期时间-->执行业务-->判断锁id完成后,但这时CPU线程调度其它工作了在这里卡住了, 而且也到了锁的过期时间了被动被删除,当线程B,加锁并设置过期时间--> ...
- 🎀GitHub Pages静态文件发布
简介 GitHub Pages是GitHub提供的一项服务,允许用户和组织从存储库中的静态文件创建和托管网站.这些静态文件可以是HTML.CSS.JavaScript文件或任何其他可以在浏览器中直接渲 ...
- SVN统计时间段内代码修改行数
1.本地安装svn客户端(方法自行百度) 注:安装时记得勾选命令行工具 若原安装未勾选,可再次启动安装文件: 选中Next即可: 环境变量记得配置svn路径(bin)(方法自行百度) cmd运行命令 ...
- .net core分布式锁的实现(基于redis)
一.单个redis节点 实现原理:核心采用StackExchange.Redis的LockTake方法实现.支持同步获取锁,或者等待直到超时获取锁. 基于SENTX命令. copy一下文档的demo ...
- centos安装npm和 nodejs
NPM安装 00X01:创建目录 mkdir /usr/local/node/ cd /usr/local/node/ 00x02:下载安装包 wget https://npm.taobao.org/ ...
- Spring基于注解的事务管理
Spring基于注解的事务管理 源码 代码测试 pom.xml <?xml version="1.0" encoding="UTF-8"?> < ...
- ServletContext相关
简介 如何得到对象 有什么作用 1.获取全局配置参数 2.获取web工程中的资源 3.存取数据,servlet间共享数据 域对象 ServlerContext的生命周期 ServletContext ...