使用“扫一扫”即可将网页分享至朋友圈。
千万美元被盗: DeFi 平台MonoX Finance被黑分析
2021 年 11 ⽉ 30 ⽇,据慢雾区消息,DeFi 平台 MonoX Finance 遭遇攻击,本次攻击中约合 1820 万美元的 WETH 和 1050 万美元的 MATIC 被盗,其他被盗 Token 包括 WBTC、LINK、GHST、DUCK、MIM 和 IMX,损失共计约 3100 万美元。慢雾安全团队第⼀时间介⼊分析,并将简要分析结果分享如下。
攻击核心
本次攻击的核⼼在于利⽤ swap 合约中没有对池中传⼊和传出代币是否相同作检查,以此利⽤价格更新机制的缺陷,使得攻击者传⼊和传出代币相同时,价格被二次计算并覆盖,导致代币价格不断被推⾼,并以此代币换出池中的其他代币来获利。
相关信息
MonoX 是⼀种新的 DeFi 协议,使⽤单⼀代币设计⽤于流动性池。这是通过将存⼊的代币与 vCASH 稳定币组合成⼀个虚拟交易对来实现的。其中的单⼀代币流动性池的第⼀个应⽤是⾃动做市商系统 - Monoswap,它在 2021 年 10 ⽉时推出。
攻击者地址 1:
0xecbe385f78041895c311070f344b55bfaa953258
攻击者地址 2:
0x8f6a86f3ab015f4d03ddb13abb02710e6d7ab31b
攻击合约 1:
0xf079d7911c13369e7fd85607970036d2883afcfd
攻击合约 2:
0x119914de3ae03256fd58b66cd6b8c6a12c70cfb2
攻击交易 1:
https://etherscan.io/tx/0x9f14d093a2349de08f02fc0fb018dadb449351d0cdb7d0738ff69cc6fef5f299
攻击交易 2:
https://polygonscan.com/tx/0x5a03b9c03eedcb9ec6e70c6841eaa4976a732d050a6218969e39483bb3004d5d
攻击细节
首先攻击者调用 Monoswap.swapExactTokenForToken:
0.1 个 WETH 换出 79.986094311542621010 个 MONO。
接着攻击者利用漏洞移除池子中其他用户的流动性,并为添加攻击合约的流动性以此来获取最大的利益。
这里移除流动性处的漏洞在 Monoswap.sol 中的 471-510 行,移除池中流动性时通过 removeLiquidity 函数调用 _removeLiquidityHelper 函数,而这两个函数都未做调用者和传入的 to 参数的身份验证,所以可直接移除任意用户在池中的流动性。
移除 0x7b9aa6 的流动性,把 1670.7572297649224 个 MONO 和 6.862171986812230290 个 vCASH 转出给 0x7b9aa6;
移除 cowrie.eth 的流动性,把 152.9745213857155 个 MONO 和 0.628300423692773565 个 vCASH 转出给 cowrie.eth;
移除 0xab5167 的流动性,把 99940.7413658327 个 MONO 和 410.478879590637971405 个 vCASH 转出给 0xab5167;
为攻击合约 1 在 MONO 代币流动池创建流动性。
紧接着攻击者调⽤ 55 次 Monoswap.swapExactTokenForToken 以此来不断堆⾼ MONO 的价格。
这里攻击的核心是在 Monoswap.sol 中的 swapExactTokenForToken 函数,攻击者传入 MONO 代币使得 tokenIn 和 tokenOut 是相同的代币。
跟到 swapIn 函数中:
可以发现在 swapIn 函数中,调用了函数 getAmountOut 来计算价格。接着跟到 getAmountOut 函数中发现是利用了 _getNewPrice 函数来计算 tokenInPrice 和 tokenOutPrice。
跟到 _getNewprice 函数中,发现当计算 tokenInPrice 时候传入的 txType 参数为 TxType.SELL,此时:
当计算 tokenOutPrice 时候传入的 txType 参数为 TxType.BUY,此时:
如果传入和传出为同一种代币时,价格计算式中的四个变量都相同,所以很容易得出 tokenOutPrice 会比 tokenInPrice 要大。
由于 tokenIn 和 tokenOut 是同一个 token,swapIn 函数在计算完价格后会再次调用 _updateTokenInfo 函数,使得 tokenOutPrice 的更新会覆盖 tokenInPrice 的更新,所以导致这个 token 的价格上涨。
最后攻击者调用 swapTokenForExactToken 函数用 MONO 来换出池子中的其他代币。
swapTokenForExactToken 函数中调用了 swapOut 函数,而 swapOut 函数中计算价格是调用的 getAmountIn 函数。
在该函数中由于 tokenInPoolPrice 是取的 MONO 代币在池中的价格,而此价格在之前已被推高,导致 tokenInPrice 变大,计算最后的 amountIn 变小,用更少的 MONO 换出了原来相同数量的 WETH、WBTC、MONO、USDC、USDT、 DUCK、MIM、IMX 等池子中的代币。
攻击者最终把攻击获利转入地址
0x8f6a86f3ab015f4d03ddb13abb02710e6d7ab31b。
以上为以太坊主链上的攻击分析,此外,攻击者除了在以太坊主链上进行攻击外,还在 Polygon 上进行了同样的攻击,攻击手法与以太坊主链上相同,此处不做过多重复的分析。
据慢雾 AML 统计,MonoX Finance 最终损失约 3400 万美元,包括约 2.1K 个 WETH、1.9M 个 WMATIC、36.1 个 WBTC、143.4K 个 MONO、8.2M 个 USDC、 9.1M 个 USDT、1.2K 个 LINK、3.1K 个 GHST、5.1M 个 DUCK、4.1K 个 MIM 以及 274.9 个 IMX。
总结
本次攻击是利用了 swap 合约里没有对池中传入和传出代币作检查,从而利用价格更新机制的问题,由于在 swap 合约中会对池中传入和传出的代币的价格调用同一个函数 _upTokenInfo 来进行更新,而当传入和传出的代币为同一种代币时,第二次调用 _upTokenInfo 函数时,通过价格计算后的更高的 tokenOutPrice 会覆盖掉价格更低的 tokenInPrice,以此来不断推高池中该代币的价格,最后可以换出池中其他的所有代币来获利离场。
By:九九@慢雾安全团队
“广东财经网”的新闻页面文章、图片、音频、视频等稿件均为自媒体人、第三方机构发布或转载。如稿件涉及版权等问题,请与
我们联系删除或处理,客服邮箱1098101642@qq.com,稿件内容仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同
其观点或证实其内容的真实性。
- 声音提醒
- 60秒后自动更新
【民政部回应何时恢复婚姻登记】民政部社会事务司二级巡视员杨宗涛表示,婚姻登记场所是人群聚集场所,部分地区暂停婚姻登记工作是对人民群众安全负责。未停止登记的地方推广用电话、网络、qq群预约登记,控制登记人数,分批分段登记,减少人员聚集和在登记机关停留时间。已停止婚姻登记地方将根据当地疫情控制情况逐渐恢复。
15:54欧洲央行副行长金多斯:欧洲央行还没有达到逆转利率。宽松政策的副作用更明显了。
15:54财经网站Forexlive分析师Justin Low评瑞士1月CPI月率:尽管通胀年率保持稳定,但核心通胀率有所下降,这一点令人更加担忧。这只是进一步巩固了瑞士央行维持现有货币政策不变,并可能在未来寻求更多宽松措施的观点。
15:54【武汉两大批发市场商户开业率超过80%】商务部市场建设司司长朱小良10日称,目前武汉生活必需品供应基本正常,除冷鲜肉、鲜叶菜等少数品种存在结构性短缺外,大部分重要生活物资供应充足,未发生明显抢购或脱销断档情况。当地白沙洲和四季美两大批发市场正常营业,商户开业率超过80%,日交易量上升至3000吨以上。(国是直通车)
15:53【日本2019年经常项目顺差增长4.4%】日本财务省10日发布的国际收支初步统计报告显示,主要受外国人入境游消费扩大影响,2019年日本经常项目顺差增长4.4%。报告显示,2019年日本经常项目顺差为20.06万亿日元(1美元约合109.8日元)。其中,商品贸易方面,由于液化天然气价格下跌等因素,进口下降5.6%至75.56万亿日元;由于汽车部件及钢铁等产品出口减少,出口下降6.3%至76.12万亿日元。货物贸易顺差减少53.8%,为5536亿日元。(新华社)
15:53欧元兑美元EUR/USD短线波动不大,现报1.0952。
15:53瑞士1月CPI年率:0.2%,前值:0.2%,预期:0.1%;瑞士1月CPI月率:-0.2%,前值:0%,预期:-0.2%。
15:52英镑兑美元GBP/USD短线走低13点,现报1.2890。
15:52【宁德时代“供电”国产特斯拉 有望拉低售价20%】全国乘联会秘书长崔东树分析认为,“随着特斯拉国产化率提升和产能爬坡,未来特斯拉国产车型的价格下探空间还是很大的。”他预计今年下半年,国产Model 3车型的售价就有望降至25万元,降幅接近20%。(新京报)
15:51【内蒙古:对不裁员或少裁员企业返还上年度50%失业保险费】据内蒙古新型冠状病毒肺炎疫情防控工作指挥部消息,疫情期间,内蒙古对不裁员或少裁员的企业返还上年度实际缴纳失业保险费的50%,对面临暂时性经营困难的中小企业,返还标准提高到上年度6个月企业及其职工缴纳社会保险费的50%。
15:51【商务部:2019年服务进出口总额54152.9亿元 同比增长2.8%】商务部新闻发言人表示,2019年,在服务贸易创新发展试点等政策的激励下,我国服务贸易总体保持平稳向上态势,逆差明显下降,结构显著优化,高质量发展成效初步显现。全年服务进出口总额54152.9亿元(人民币,下同),同比增长2.8%。其中,出口总额19564.0亿元,同比增长8.9%;进口总额34588.9亿元,同比减少0.4%。(第一财经)
15:51【振华股份:疫情导致下游客户开工推迟 产品库存上升】振华化学公告,公司目前生产经营稳定,所有产能均正常开工,原材料采购能基本满足生产需要,由于疫情导致下游客户开工推迟,公司出货量减少,产品库存有所上升。公司将根据客户需求、疫情及市场变化,适度调整生产经营策略,尽可能保持生产经营的稳定。
15:50环旭电子2月10日晚间公告,公司2020年1月合并营业收入为23.27亿元,较去年同期的合并营业收入减少27.83%,较2019年12月合并营业收入环比减少37.23%。
15:49精测电子:与京东方集团签订了多份销售合同,合同累计金额达到6.96亿元。
17:12华夏银行:银保监会同意本公司在全国银行间债券市场发行不超过100亿元人民币的金融债券,募集资金全部用于绿色信贷。
17:03