IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 区块链 -> “我杀我自己?”—— MonoX.Finance安全事件分析 -> 正文阅读

[区块链]“我杀我自己?”—— MonoX.Finance安全事件分析

前言

11 月 30 日,知道创宇区块链安全实验室 监测到自动做市商协议 MonoX.Finance 遭黑客攻击,损失超 3100 万美元。实验室第一时间跟踪本次事件并分析。

攻击涉及信息

此次安全事件共有两次攻击分别发生在以太坊和 polygon 上。

以太坊攻击交易信息

交易哈希 :
0x9f14d093a2349de08f02fc0fb018dadb449351d0cdb7d0738ff69cc6fef5f299

黑客地址:
0x8f6a86f3ab015f4d03ddb13abb02710e6d7ab31b

攻击合约地址:
0xf079d7911c13369e7fd85607970036d2883afcfd

polygon攻击交易信息

交易哈希 :
0x5a03b9c03eedcb9ec6e70c6841eaa4976a732d050a6218969e39483bb3004d5d

黑客地址:
0xecbe385f78041895c311070f344b55bfaa953258

攻击合约地址:
0x119914de3ae03256fd58b66cd6b8c6a12c70cfb2

简述攻击流程

本次攻击分析选用以太坊交攻击交易:
0x9f14d093a2349de08f02fc0fb018dadb449351d0cdb7d0738ff69cc6fef5f299

1、黑客首先通过 swapExactTokenForToken 函数将 0.1WETH 兑换为 79.9MONO

在这里插入图片描述

2、重复利用函数 removeLiquidity 移除 Monoswap 合约中的流动性,直至全部移除

在这里插入图片描述

在这里插入图片描述

3、通过函数 addLiquidity 添加自己操控的流动性

在这里插入图片描述

4、重复调用函数 swapExactTokenForToken(55次)实现 MONO->MONO 的不合理兑换

在这里插入图片描述

5、最终利用被以上操作抬高价格的 MONO 兑换了 WETH、WBTC、MONO、USDC、USDT、 DUCK、MIM、IMX 等从而获利。

在这里插入图片描述

漏洞成因分析

分析攻击流程可以发现两个不合理的地方:

  • 攻击者可以通过函数 removeLiquidity 移除了其他人添加的流动性
  • 攻击者通过函数 swapExactTokenForToken 不断重复 MONO 兑换 MONO 的操作

检查源码

对函数 removeLiquidity 源码进行分析

在这里插入图片描述

可以看到函数 removeLiquidity 和它包含的内部函数 _removeLiquidityHelper 都没有对调用者进行权限限制,以及对需要被移除流动性的传参地址 to 进行验证,这导致了任意地址都能进行对该 pool 内所有流动性进行移除

对函数 swapExactTokenForToken 源码进行分析

在这里插入图片描述

1、发现函数 swapExactTokenForToken 主要功能由函数 swapIn 实现,对函数 swapIn 进行跟进分析

在这里插入图片描述

2、发现获取 token 信息的函数 getAmountOut,对函数 getAmountOut 进行跟进分析

在这里插入图片描述

3、发现 tokenInPrice 与 tokenOutPrice 的计算规则相同都是通过函数 _getNewPrice 计算,跟进到函数 _getNewPrice

在这里插入图片描述

4、发现 price 的获取对应两种状态

  • SELL 状态:价格 = 代币初始价格*代币存储量 / (代币存储量+费用)
  • BUY 状态:价格 = 代币初始价格*代币存储量 / (代币存储量-费用)

很明显相同 token 在 BUY 状态下获取到的价格大于 SELL 状态

在这里插入图片描述

在这里插入图片描述

5.回到 swapIn 函数,当传入 token 价格被获取到后会按照 token 种类通过 _updateTokenInfo 进行 token 信息更新。

由于传入的 token 都为 MONO 所以:

  • 当通过 if(tokenIn==address(vCash)) 判断时,MONO 获取到的价格是 SELL 状态下计算的价格;
  • 当通过 if(tokenOut==address(vCash)) 判断时,MONO 获取到的 SELL 状态下的价格会被 BUY 状态下获取的价格覆盖;

因此当发生 MONO 兑换 MONO 操作时,MONO 的价格会上升。

重新梳理攻击过程

第一步:黑客将 0.1WETH 兑换为 79.9MONO 作为启动资金

第二步:黑客移除了 pool 内全部流动性,防止攻击受到影响或者价格波动被检测到

第三步:黑客添加了自己控制的流动性,便于兑换操作

第四步:黑客通过重复 MONO 兑换 MONO 的操作,不断抬高 MONO 价格

第五步:利用已经被抬高的 MONO 兑换 pool 内其他资产达到获利目的

总结

本次安全事件问题其实并不复杂,主要原因在于 monoswap 合约在设计时没考虑到特殊情况下的价格覆盖问题,而可任意移除流动性的缺陷则更加方便黑客对于价格的操纵。

  区块链 最新文章
盘点具备盈利潜力的几大加密板块,以及潜在
阅读笔记|让区块空间成为商品,打造Web3云
区块链1.0-比特币的数据结构
Team Finance被黑分析|黑客自建Token“瞒天
区块链≠绿色?波卡或成 Web3“生态环保”标
期货从入门到高深之手动交易系列D1课
以太坊基础---区块验证
进入以太坊合并的五个数字
经典同态加密算法Paillier解读 - 原理、实现
IPFS/Filecoin学习知识科普(四)
上一篇文章      下一篇文章      查看所有文章
加:2021-12-05 12:05:57  更:2021-12-05 12:05:59 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 22:47:26-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码