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

前言

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

简述攻击流程

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

0x9f14d093a2349de08f02fc0fb018dadb449351d0cdb7d0738ff69cc6fef5f299

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

教育部:鼓励使用区块链技术推进高校校际学分互认:1月27日,教育部官方网站发布《关于政协十三届全国委员会第三次会议第1241号(教育类109号)提案答复的函》,其中提到运用互联网等现代信息技术进行教与学互动的新型教育方式已经成为教育服务的重要组成部分,教育部将加强大容量智能教学资源建设,加快建设在线智能教室、智能实验室、虚拟工厂(医院)等智能学习空间,积极探索基于区块链等新技术的智能学习效果记录、转移、交换、认证等有效方式,形成泛在化、智能化学习体系,推进信息技术和智能技术深度融入教学全过程,打造教育发展国际竞争新增长极。鼓励高校校际学分互认,积极推进线上学分互认,引导学生在疫情防控期间积极选修线上优质课程,制定在线课程学习学分互认与转化政策。[2021/1/27 13:38:33]

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

南昌市大数据发展管理局局长:推动区块链与前沿信息技术深度融合:南昌市大数据发展管理局局长李鑫表示,充分运用南昌在区块链发展上建设起步早、扶持力度大、融合应用广等特点,推动区块链与前沿信息技术深度融合,加强与优质企业对接,加快推广创新应用,不断加大政产学研用合作力度,实现区块链产业高质量、高速度发展。(江西日报)[2020/9/30]

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

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

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

中国银行法学研究会理事表示:褪去被“神化”的外衣,区块链就是一种新型技术的应用:中国银行法学研究会理事肖飒表示:“区块链技术确实是个有大前景的好技术,但是从现下的实践来看,这个好技术却是被许多打着区块链幌子的项目“坏了名声”,甚至还有不少“假项目”直接损害了广大社会群众的合法权益。褪去被“神化”的外衣,区块链就是一种新型技术的应用,由于其分布式记账的方式被社会广泛认同,在此基础上,各种场景、创新纷繁复杂,我们相信一定有伟大的企业诞生,我们也相信一定有不法分子从中渔利。”[2018/3/1]

漏洞成因分析

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

以太坊Layer2总锁仓量跌至36.1亿美元 7日跌幅5.64%:7月14日消息,据L2BEAT数据显示,当前以太坊Layer2总锁仓量跌至36.1亿美元,7日跌幅5.64%。其中,锁仓量前五分别为Arbitrum(18.8亿美元,7日跌幅3.93%)、Optimism(6.67亿美元,7日跌幅10.95%)、dYdX(5.8亿美元,7日跌幅5.62%)、Loopring(1.62亿美元,7日跌幅7.58%)、MetisAndromeda(0.89亿美元,7日跌幅0.34%)。[2022/7/14 2:12:13]

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

来源:金色财经

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

链链资讯

[0:15ms0-8:808ms