老调重弹,浅谈“通缩型代币”兼容性问题
By:flush@慢雾安全团队
根据慢雾区情报,MDEX 的 XSquid 和 HT 在代币池中 HT 代币没有进行 swap 经常抽取,慢雾安全团队介入分析,简要分析如下。
攻击核心
这次攻击的核心是使用 XSquid 映射通缩代币模型,转账后会发生通缩,通过自己的合同获得 balanceOf 与通过 Mdex pair 从游泳池获得的 reserve 不匹配的问题,使得攻击者可以抽取池中的 HT 代币。
攻击细节
从链上的分析工具可以看出, 在这笔交易中Mdex pair 池最终将 0转移给攻击者.003 枚 WHT 代币,链上的交易记录显示有很多这样的交易。

接下来,我们仔细观察这笔交易的细节,这是 XSquid 和 HT 的 Mdex Pair 池,对 XSquid 进行 swap 转账前 pair 合同通过 getReserves 接口所获取到池子中 _reserve0 为 1010.50564080917497232。但下一步是 XSquid 合约的 balanceOf 获取 pair 余额后,我们发现结果是 1010.506077394782 ,数量有明显差异。

但在最后一次更新 reserve 之后,没有用户将其转移到合同中。所以我们可以定位在 balancOf 获取时造成的误差。于是我们开始查 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 进来。此时攻击者只需调用 Mdex Pair 合约的 swap 函数根据上诉计算的差额提取代币或调用 skim 函数直接转移代币。因此,这一小部分多余可以从池中抽出,而不是属于他的 HT。在这方面,我们可以在每次转账结束时调用 sync 函数强制准备金与余额匹配同步更新,避免上述不匹配问题。
总结
抽池的核心问题是通缩映射代币与项目合同不兼容。代币和 DeFi 项目合同代码不兼容造成的安全问题已经是老问题,慢雾安全团队再次提醒:因为 DeFi 项目需要多个合同之间的交互。在设计过程中,项目方应充分考虑不同合同之间交互的兼容性,并确保交易对项?兼容。
- 免责声明
- 世链财经作为开放的信息发布平台,所有资讯仅代表作者个人观点,与世链财经无关。如文章、图片、音频或视频出现侵权、违规及其他不当言论,请提供相关材料,发送到:2785592653@qq.com。
- 风险提示:本站所提供的资讯不代表任何投资暗示。投资有风险,入市须谨慎。
- 世链粉丝群:提供最新热点新闻,空投糖果、红包等福利,微信:juu3644。

路安



