背景信息

本次攻击涉及 Bonding 和 LBM 两种代币,用户可以通过 Bonding.buy() 用 USDC 购买 Bonding,当 Bonding 合约中的 USDC 累积超过一定阈值时会触发回购机制将 USDC 兑换成 LBM,随后向 [Bonding, LBM] pool 添加流动性。

造成本次攻击的原因是添加流动性所采用的 pool 并未提前创建(代码逻辑是第一次触发时不存在则创建),攻击者先创建了比例失衡的恶意 [Bonding, LBM] pool。然后通过闪电贷大量的 USDC 来购买 Bonding 触发回购机制,当协议将大量的 LBM 添加到 pool 中后,攻击者将手上的 Bonding 兑换成 USDC 完成获利(Bonding -> LBM -> WETH -> USDC 完成获利)。损失金额 4884 USDC。

攻击交易:https://app.blocksec.com/explorer/tx/base/0x9d724db325de76b3d88368ed9948acd85e6b67b464eb0aac9f5d2bc3fdebf190

漏洞合约:https://basescan.org/address/0xffa1ed9c565a4e635543123b29889e96bcafa184#code

Trace 分析

  1. 闪电贷获得 100000 USDC

  2. 攻击者创建了Bonding 的价格极高的 [Bonding, LBM] pool

  3. 攻击者通过 Bonding.buy() 用 11949 USDC 换取 1194.9 Bonding

  4. 触发 Bonding 的回购机制

  5. 用 17100 USDC 换取 332874 LBM

  6. 将 332874 LBM 和 0 Bonding 作为流动性添加到攻击者创建的 pool 中

  7. 攻击者在恶意构造的 pool 中用 0.01 Bonding 换出 332874 LBM,随后按照 Bonding -> LBM -> WETH -> USDC 这个路径获得 16833 USDC

  8. 归还闪电贷 100000 USDC,获利 4884 USDC。

    代码分析

    Bonding 和 LBM 组成一个双代币协议,LBM 作为 Bonding 的 feeToken。本次漏洞产生的原因主要在 Bonding 代币中。攻击者通过购入大量的 Bonding 代币触发回购机制。

    https://vscode.blockscan.com/8453/0x8D2Eb55F429aC689134ee547C74720BC41219F39

_finalizeSale() 函数中,首先将 USDC 换成 LBM

随后检查需要添加流动性的 [Bonding, LBM] pool ,通过注释可以看出,项目方是故意先不部署池子的,等到实际触发回购机制的时候再创建,这就给了攻击者可乘之机。

由于攻击者已经创建好了 [Bonding, LBM] pool ,所以这里 pool 地址为非零地址。最终使得协议按照攻击者设置的 LBM 价格极高的比例向 pool 添加流动性,攻击者可以用极少的 Bonding 套取大量的 LBM,转而出售成 USDC 完成获利。

20250620 - Bonding 攻击事件: 项目方不创建的池子由我攻击者来创建的更多相关文章

  1. 项目方说性能达到百万TPS,如何测试它的可信度?

    项目方说性能达到百万TPS,如何测试它的可信度? 应用系统性能提升的关键在于运维端的接入管理模型(AAA,认证 Authentication.授权 Authorization.计费 Accountin ...

  2. 新浪微博XSS攻击事件

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

  3. UE4编程之C++创建一个FPS工程(一)创建模式&角色&处理输入

    转自:http://blog.csdn.net/u011707076/article/details/44180951 从今天开始,我们一起来学习一下,如何使用C++将一个不带有任何初学者内容的空模板 ...

  4. Spark2.2+ES6.4.2(三十二):ES API之index的create/update/delete/open/close(创建index时设置setting,并创建index后根据avro模板动态设置index的mapping)

    要想通过ES API对es的操作,必须获取到TransportClient对象,让后根据TransportClient获取到IndicesAdminClient对象后,方可以根据IndicesAdmi ...

  5. C# 直接创建多个类和使用反射创建类的性能

    原文:C# 直接创建多个类和使用反射创建类的性能 本文告诉大家我对比的使用直接创建多个类和使用反射创建多个类的性能 在上一篇 C# 程序内的类数量对程序启动的影响 的基础上,继续做实验 现在创建 10 ...

  6. 2019-11-29-C#-直接创建多个类和使用反射创建类的性能

    原文:2019-11-29-C#-直接创建多个类和使用反射创建类的性能 title author date CreateTime categories C# 直接创建多个类和使用反射创建类的性能 li ...

  7. 2019-8-31-C#-直接创建多个类和使用反射创建类的性能

    title author date CreateTime categories C# 直接创建多个类和使用反射创建类的性能 lindexi 2019-08-31 16:55:58 +0800 2018 ...

  8. Android(java)学习笔记66:实现Runnable接口创建线程 和 使用Callable和Future创建线程

    1. 前面说的线程的实现是新写一个子类继承Thread: 是将类声明为 Thread 的子类.该子类应重写 Thread 类的 run 方法.接下来可以分配并启动该子类的实例 2. 这里说的方案2是指 ...

  9. shell脚本操作mysql数据库—创建数据库,在该数据库中创建表(插入,查询,更新,删除操作也可以做)

    #!/bin/bash HOSTNAME="192.168.1.224"                                           #数据库Server信 ...

  10. 【百度地图API】如何快速创建带有标注的地图?——快速创建地图工具+如何标注商家

    原文:[百度地图API]如何快速创建带有标注的地图?--快速创建地图工具+如何标注商家 摘要: 如果你不会程序,如果你不想写代码. 如果你想拥有一张自己的地图,如果你想在该地图上标注出你商店的位置. ...

随机推荐

  1. 面试题-计算机网络-HTTP部分

    前言 计算机网络2-HTTP部分的题目,是我根据Java Guide的面试突击版本V3.0再整理出来的,其中,我选择了一些比较重要的问题,并重新做出相应回答,并添加了一些比较重要的问题,希望对大家起到 ...

  2. 【Linux】5.10 输入输出重定向

    Shell 输入/输出重定向 大多数 UNIX 系统命令从你的终端接受输入并将所产生的输出发送回​​到您的终端.一个命令通常从一个叫标准输入的地方读取输入,默认情况下,这恰好是你的终端.同样,一个命令 ...

  3. 【Docker】镜像

    Docker 镜像 是什么 UnionFS(联合文件系统) UnionFS(联合文件系统):Union文件系统(UnionFS)是一种分层(layer).轻量级并且高性能的文件系统,它支持对文件系统的 ...

  4. 【Ubuntu】Ubuntu 24.04 配置镜像源

    [Ubuntu]Ubuntu 24.04 配置镜像源 零.起因 最近在虚拟机中安装了个ubuntu-24.04-desktop-amd64,默认是国外的软件源,很慢,故替换到国内. 壹.替换 源地址( ...

  5. 【Python】解决“Tk_GetPixmap: Error from CreateDIBSection”闪退问题

    解决Python使用Tkinter的Notebook切换标签时出现的"Tk_GetPixmap: Error from CreateDIBSection 操作成功完成"闪退问题 零 ...

  6. REST API从木愣到够呆

    目前准备写一个API服务,遵循REST规范,因为自己也是第一次接触这玩意,所以就以自我的认知和理解过程来记录,留爪. ##在REST里什么叫资源? 拿数据表为例: 现在有三张表:(此表非彼婊) sch ...

  7. CH182F7与LAN8720A对比

    1.CH182F7简介 CH182F7是一款支持Auto-MDIX的工业级10/100M以太网PHY收发器.内部包括物理编码子层(PCS).物理介质接入层(PMA).双绞线物理介质相关子层(TP-PM ...

  8. java基础之Stream流

    一.使用Stream的目的:用于解决已有集合类库既有的弊端,只求关注[目的],不关注[方式],且其数据源:可以是集合,数组等 例子: public class NormalFilter { publi ...

  9. app自动化的特殊操作

    一.截屏 File srcfile=driver.getScreenshotAs(OutputType.FILE); //得到截图源文件对象 File dstfile=new File("C ...

  10. 利用Edge浏览器扩展获取账号密码等敏感性信息

    免责声明:本文所涉及的技术仅供学习和参考,严禁使用本文内容从事违法行为和未授权行为,如因个人原因造成不良后果,均由使用者本人负责,作者及本博客不承担任何责任. 前言 edge扩展作为edge浏览器丰富 ...