背景信息

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

20250626 - SiloFinance 攻击事件: 恶意输入参数导致借款授权额度盗用的更多相关文章

  1. 孟加拉央行SWIFT攻击事件恶意木马分析(转)

    第一章 分析概述 该恶意木马样本为运行于winodws平台上的PE文件(名称:evtdiag.exe).文件大小为64KB,编译时间是2016年2月5日. 经分析,该样本为定制的攻击SWIFT客户端程 ...

  2. 阿里云提示:对输入参数id未进行正确类型转义,导致整型注入的发生

    类似以下提示: XXX.php中,对输入参数id未进行正确类型转义,导致整型注入的发生 解决办法: 找到对应文件:$id = $_GET['id']; 增加以下标红过滤: $id = $_GET['i ...

  3. 新浪微博XSS攻击事件

    http://blog.csdn.net/terryzero/article/details/6575078 6月28日20时14分左右开始,新浪微博出现了一次比较大的XSS攻击事件.大量用户自动发送 ...

  4. 如何获得Webapp的根项目路径 即ServletContext.getRealPath() 的输入参数要以"/"开头

    ServletContext.getRealPath() 的输入参数要以"/"开头 2014-03-26 15:54 5738人阅读 评论(1) 收藏 举报 版权声明:本文为博主原 ...

  5. riot.js教程【三】访问DOM元素、使用jquery、mount输入参数、riotjs标签的生命周期

    前文回顾 riot.js教程[二]组件撰写准则.预处理器.标签样式和装配方法 riot.js教程[一]简介 访问DOM元素 你可以通过this.refs对象访问dom元素 而且还有大量的属性简写方式可 ...

  6. java Servlet+mysql 调用带有输入参数和返回值的存储过程(原创)

    这个数据访问的功能,我在.NET+Mysql .NET+Sqlserver  PHP+Mysql上都实现过,并且都发布在了我博客园里面,因为我觉得这个功能实在是太重要,会让你少写很多SQL语句不说,还 ...

  7. 使用getopts处理shell中的输入参数

    在编写shell脚本中,经常要处理一些输入参数,在使用过程中发现getopts更加方便,能够很好的处理用户输入的参数和参数值.   getopts用于处理用户输入参数,举例说明使用方法: while ...

  8. SQL Server存储过程中使用表值作为输入参数示例

    这篇文章主要介绍了SQL Server存储过程中使用表值作为输入参数示例,使用表值参数,可以不必创建临时表或许多参数,即可向 Transact-SQL 语句或例程(如存储过程或函数)发送多行数据,这样 ...

  9. 输入参数是NSDate,输出结果是星期几的字符串

    给你一个方法,输入参数是NSDate,输出结果是星期几的字符串.+ (NSString*)weekdayStringFromDate:(NSDate*)inputDate { NSArray *wee ...

  10. Shell脚本中判断输入参数个数的方法投稿:junjie 字体:[增加 减小] 类型:转载

    Shell脚本中判断输入参数个数的方法 投稿:junjie 字体:[增加 减小] 类型:转载   这篇文章主要介绍了Shell脚本中判断输入参数个数的方法,使用内置变量$#即可实现判断输入了多少个参数 ...

随机推荐

  1. 使用`forEach`方法前后的代码逐步简化过程

    简化前的完整循环代码 首先,我们使用传统的for-each循环遍历HashMap: import java.util.HashMap; import java.util.Map; public cla ...

  2. 跳转程序控制语句:break、continue 以及死循环、标号

    1.break:结束循环,结束switch语句 . 案例:模拟用户登录密码,一共三次机会,初识密码为123456 我们之前学的方法可以完成这个案例,但是这种写法还存在问题 如图 明明已经输入了正确的密 ...

  3. 【Linux】3.1 远程登录Linux系统

    为什么需要远程登录 Linux 示意图 说明: 公司开发时候, 具体的情况是这样的 linux 服务器是开发小组共享的. 正式上线的项目是运行在公网的. 因此程序员需要远程登录到 centos 进行项 ...

  4. 【SpringMVC】RESTful CRUD

    RESTful CRUD REST:即 Representational State Transfer.(资源)表现层状态转化.是目前最流行的一种互联网软件架构.它结构清晰.符合标准.易于理解.扩展方 ...

  5. 用99元买的服务器搭一套CI/CD系统

    故事的开始是这样的:无聊的时候在阿里云买了一个99/年的服务,上面部署了一个Git服务,用于托管自己无聊时写的一些代码,顺便也拿它做开发服务器.为了方便应用管理,起初用docker来管理和部署应用,后 ...

  6. svelte+vite+ts+melt-ui从0到1完整框架搭建

    框架太"重"了:通常一个小型项目只由少数几个简单页面构成,如果使用 Vue 或者 React 这些框架来研发的话,有点"大材小用"了.构建的产物中包含了不少框架 ...

  7. MySQL 中有哪些锁类型?

    MySQL 中有哪些锁类型? 在 MySQL 中,锁是用于管理并发访问的机制,以保证数据一致性和完整性.MySQL 支持多种类型的锁,按照其粒度和用途可以分为以下几类. 1. 按粒度分类 表锁(Tab ...

  8. 再谈kettle两种循环之--调用http分页接口循环获取数据

    再谈kettle两种循环之 – 调用http分页接口循环获取数据 1.场景介绍: 由于数据量比较大,接口有返回限制,需要用到循环分页获取数据 2.案例适用范围: 循环job可参考,变量运用可参考,调用 ...

  9. K8s Pod 控制器介绍及应用示例

    Kubernetes 官方文档:Pod 控制器 Pod控制器介绍 Pod是kubernetes的最小管理单元,在kubernetes中,按照pod的创建方式可以将其分为两类: 自主式pod:kuber ...

  10. 拆解 Cursor Pro 自动化工具,看看它是怎么实现的?

    深入解析Cursor Pro自动化工具的核心实现 ‍ 从源码角度剖析关键技术 完整解读:注册.认证.机器码重置的自动化方案 项目概述 大家好,我是松哥.这篇文章将为大家详细解析一个Cursor自动化管 ...