TOKE:“我杀我自己?”—— MonoX.Finance安全事件分析

前言

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

简述攻击流程

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

0x9f14d093a2349de08f02fc0fb018dadb449351d0cdb7d0738ff69cc6fef5f299

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

20702ETH从未知钱包转至Coinbase:金色财经报道,数据显示,北京时间18:28,20,702枚ETH(约合36,005,039美元)从未知钱包转至Coinbase。[2023/6/10 21:28:40]

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

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

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

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

Web3钱包Zerion称其App已从AppStore中暂时下架:5月23日消息,Web3 钱包 Zerion 表示其 App 已被 App Store 暂时下架,团队正在努力解决该问题,将实时发布更多进展更新。[2023/5/23 15:21:06]

漏洞成因分析

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

攻击者可以通过函数removeLiquidity移除了其他人添加的流动性

攻击者通过函数swapExactTokenForToken不断重复MONO兑换MONO的操作

前NBA球员Baron Davis:名人将更多地关注“实用”代币:金色财经报道,前NBA球员Baron Davis在周四表示,名人现在可能会专注于可以给用户带来真正效用和回报的项目。他说“展望未来,你会看到更多来自名人和运动员的创意项目。”Davis曾在NBA的七支球队效力13年,他正在转向区块链技术,因为他创建了自己的基于NFT的平台SLiC Images,该平台将为体育摄影师管理数字版权和数据库。该项目仍在开发中,将在NFT平台Mintbase上运行。

Davis说,通过使用区块链技术,该平台正在“构建一个核心数据库和一个发布后端,使这些摄影师能够在社交媒体网站和杂志上授权他们的照片”。Davis说,缺乏教育和对细节的关注可能是一些名人过去未能在加密货币领域找到自己位置的部分原因。去年10月,真人秀明星Kim Kardashian同意向美国证券交易委员会(SEC)支付126万美元,以解决她未能披露为推广\"Ethereum Max的EMAX代币而收到的报酬的指控。[2023/3/3 12:39:48]

检查源码

Revolut确认受到了一次高度针对性的网络攻击:金色财经报道,加密货币投资服务银行Revolut已经证实,它受到了一次高度针对性的网络攻击,黑客可以访问数万名客户的个人详细信息。Revolut 发言人Michael Bodansky表示,未经授权的第三方在短时间内获得了一小部分 (0.16%) 客户的详细信息。Revolut 在 9 月 10 日晚些时候发现了恶意访问,并在第二天早上隔离了攻击。我们立即识别并隔离了这次攻击,以有效限制其影响,并联系了受影响的客户,没有收到电子邮件的客户没有受到影响。[2022/9/20 7:09:03]

对函数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合约在设计时没考虑到特殊情况下的价格覆盖问题,而可任意移除流动性的缺陷则更加方便黑客对于价格的操纵。

来源:金色财经

郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。

地球链

[0:31ms0-0:916ms