时间:2023-07-05|浏览:215
根据慢雾区情报,MDEX的XSquid和HT在代币池中HT代币没有进行swap经常抽取。慢雾安全团队介入分析,简要分析如下。
攻击核心: 这次攻击的核心是使用XSquid映射通缩代币模型,转账后会发生通缩。攻击者通过自己的合同获得balanceOf与通过Mdexpair从游泳池获得的reserve不匹配的问题,从而可以抽取池中的HT代币。
攻击细节: 从链上的分析工具可以看出,在这笔交易中Mdexpair池最终将0转移给攻击者0.003枚WHT代币。链上的交易记录显示有很多这样的交易。
接下来,我们仔细观察这笔交易的细节。这是XSquid和HT的MdexPair池。在XSquid进行swap转账前,pair合同通过getReserves接口所获取到的池子中_reserve0为1010.50564080917497232。但是,通过XSquid合约的balanceOf获取pair余额后,我们发现结果是1010.506077394782,数量有明显差异。
我们发现,最后一次更新reserve之后,没有用户将其转移到合同中。所以我们可以定位在balanceOf获取时造成的误差。于是我们开始查XSquid合同,并定位为balanceOf函数合约715行。通过函数逐步跟踪balanceOf。
其中,balanceOf调用了tokenFromReflection获取tokenFromReflection映射传入函数rAmount.div(currentRate)。currentRate又是由_getRate函数决定。通过_getRate然后我们跟_getCurrentSupply函数。
根据一步一步的定位,我们发现代币在合同中_tTotal总量不会改变,最终会影响_getCurrentSupply输出结果为_rTotal值的变化。从合同中发现,XSquid是映射通缩代币,每次转账时计算_rTotal都会由_reflectFee产生通缩使_rTotal导致currentRate减少,而rAmount.div(currentRate)增加,最终导致获得balanceOf大于getReserves获得的值。
这就造成了一种错觉,让池子觉得外面又进了XSquid进来。此时攻击者只需调用MdexPair合约的swap函数根据上诉计算的差额提取代币或调用skim函数直接转移代币。因此,这一小部分多余可以从池中抽出,而不是属于他的HT。在这方面,我们可以在每次转账结束时调用sync函数强制准备金与余额匹配同步更新,避免上述不匹配问题。
总结: 抽池的核心问题是通缩映射代币与项目合同不兼容。代币和DeFi项目合同代码不兼容造成的安全问题已经是老问题,慢雾安全团队再次提醒:因为DeFi项目需要多个合同之间的交互。在设计过程中,项目方应充分考虑不同合同之间交互的兼容性,并确保交易对兼容。
热点:代币
用戶喜愛的交易所
已有账号登陆后会弹出下载