前言
11月30日,知道创宇区块链安全实验室?监测到自动做市商协议MonoX.Finance遭黑客攻击,损失超3100万美元。实验室第一时间跟踪本次事件并分析。
攻击涉及信息
此次安全事件共有两次攻击分别发生在以太坊和polygon上。
简述攻击流程
本次攻击分析选用以太坊交攻击交易:0x9f14d093a2349de08f02fc0fb018dadb449351d0cdb7d0738ff69cc6fef5f299
1、黑客首先通过swapExactTokenForToken函数将0.1WETH兑换为79.9MONO
2、重复利用函数removeLiquidity移除Monoswap合约中的流动性,直至全部移除
青岛首笔数字人民币缴税业务落地:金色财经报道,国家电网青岛公司财务人员在国家税务总局青岛市市南区税务局工作人员辅导下,使用数字人民币缴纳了个人所得税,标志着青岛市首笔数字人民币缴税业务成功办理,实现了国家电网“税收+数字人民币”场景应用零的突破。[2023/5/6 14:47:22]
3、通过函数addLiquidity添加自己操控的流动性
4、重复调用函数swapExactTokenForToken实现MONO->MONO的不合理兑换
5、最终利用被以上操作抬高价格的MONO兑换了WETH、WBTC、MONO、USDC、USDT、DUCK、MIM、IMX等从而获利。
漏洞成因分析
分析攻击流程可以发现两个不合理的地方:
区块链公司R3预计在第一季度完成1.5亿美元的融资:金色财经报道,总部位于纽约的成立四年的区块链初创公司 R3 的创始人兼首席执行官 David Rutter 今日证实了早先有关 R3 正在筹资 1.5 亿美元的报道,称其“尚未结束”但 R3“取得了非常好的进展”并且“将在早期结束”新年的一部分。” Rutter 还详细介绍了 R3 的区块链平台 Corda,该平台由该公司的 CTO Richard Gendal Brown 开发,他曾是 IBM 的行业创新和业务发展执行架构师。
R3 目前的成员包括摩根大通、德意志银行和汤森路透。最初的 42 家银行成员中有超过 90% 的人表示有兴趣投资,但两家最初的参与者——高盛集团和桑坦德银行——决定退出该财团,不参与本轮融资。[2023/3/18 13:11:27]
攻击者可以通过函数removeLiquidity移除了其他人添加的流动性攻击者通过函数swapExactTokenForToken不断重复MONO兑换MONO的操作
购物平台CryptoRefills推出欧元稳定币EUROC支付选项:6月30日消息,总部位于荷兰的购物平台CryptoRefills为其客户推出了欧元稳定币Euro Coin(EUROC)支付选项。
此前消息,USDC发行商Circle宣布将于6月30日在以太坊上发行由欧元支持的、受监管的稳定币Euro Coin(EUROC),今年晚些时候支持其他区块链。(The Paypers)[2022/6/30 1:42:41]
检查源码
对函数removeLiquidity源码进行分析
可以看到函数removeLiquidity和它包含的内部函数_removeLiquidityHelper都没有对调用者进行权限限制,以及对需要被移除流动性的传参地址to进行验证,这导致了任意地址都能进行对该pool内所有流动性进行移除。
说唱歌手 Kanye West 提交 NFT 相关商标申请:金色财经报道,美国商标律师 Josh Gerben 表示,知名说唱歌手侃爷( Kanye West )最近提交了 17 份商标申请,围绕他的个人品牌 Yeezus 申请商标专利,这些文件暗示侃爷有意推出 YEEZUS 品牌的虚拟游乐园、基于区块链的NFT、以数字艺术为特色的在线零售店服务、玩具等等。
这位说唱歌手曾于 2 月 1 日在 Instagram 上发布了一封手写信,声称他对 NFT 项目不感兴趣,他写道:“我的重点是在现实世界中制造真正的产品、真正的食物、真正的衣服、真正的住所”,该帖子随后被删除。[2022/6/2 3:57:33]
对函数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合约在设计时没考虑到特殊情况下的价格覆盖问题,而可任意移除流动性的缺陷则更加方便黑客对于价格的操纵。
知道创宇区块链实验室官网
www.knownseclab.com
创宇存证平台|知道创宇唯一指定存证平台
创宇存证-可信数据,价值流转
联系我们
blockchain@knownsec.com
知道创宇区块链安全实验室导航
微信公众号
@创宇区块链安全实验室
官方网站
@知道创宇区块链安全实验室
微博
@知道创宇区块链实验室
https://weibo.com/BlockchainLab
知乎
@知道创宇区块链安全实验室
https://www.zhihu.com/org/zhi-dao-chuang-yu-qu-kuai-lian-an-quan-shi-yan-shi
@KS_Blockchain
https://twitter.com/KSBlockchain
郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。