门罗币假充值漏洞分析:实为门罗币的业务逻辑问题
前言
最近关于交易所的假充值漏洞层出不穷,很显然,交易所与公链的对接并没有我们想象得那么完善。在门罗币的问题披露之后,然后对此进行了相关回顾分析,供行业内参考。
在这之前,就已经有消息说过瑞波币(XRP)存在假充值漏洞(一个类似于之前披露的USDT及以太坊代币假充值漏洞),已有真实攻击在发生,一旦攻击成功,会非常严重。而这个漏洞在14年的时候就已经有进行过披露了。
据发现门罗币安全漏洞的研究人员称,门罗币存在一个允许从数字货币交易所中盗窃的漏洞。根据严重程度,该漏洞在可能的10中排名第9。
Bug Bounty Hunter发现了Monero钱包中的漏洞。Jason Rhineland在HackerOne中提交了一篇文章,他披露了一个门罗币的业务逻辑问题。根据当时的说法是修复了一个钱包余额显示错误,这似乎无害,但这个错误也延伸到了交易所:例如,1 XMR充值到交易所,并且重复发送TX pubkey,交易所中会显示收到了2 XMR存款,然后允许攻击者从交易所的钱包中提取2 XMR。攻击者可以反复利用这一点来吸取所有交易所的余额。
该漏洞允许网络犯罪分子伪造交易数据,以诱骗虚拟货币运营商的支持人员使用XMR手动记入其用户帐户。每增加一行代码就会增加帐户上显示的Monero数量,让员工不得不履行任何用户手动处理交易的用户。由于Monero中的Bug,Altex交易所遭受重大损失。基于门罗币的币也容易受到同样的错误,正如加密货币运营商Altex的钱包中的ARQ币的黑客行为所证明的那样。
漏洞分析
该问题在今年6月11就已经被用户发现,并在门罗币的GitHub仓库上提交了相关的问题。
该用户称他在执行show_transfers out指令的时候客户端给他返回了错误的转账数量,并表示非常怪异。
随后,在当天门罗币的官方团队便对此进行了修复,并发布了修复的代码。
右方的代码为已修复的代码,其实对于漏洞的修复关键代码就是被红框标记的那一段。我们来细看一下。
以上便是最主要的修复代码,大概意思是判断当前事务的pubkey是否在之前的pubkey中已存在,若已存在便跳过该事务。
若没有加上这段代码,会造成怎样的后果呢?
每笔交易的pubkey的都是唯一的,所以若两笔交易的pubkey一样便意味这两笔交易是完全一样的重复交易,应该在保留其中一笔交易之后其他的重复交易完全忽略。
攻击者可以发送大量重复的交易给对方,这在门罗币中是允许的,因为最终计算余额不会计算重复的交易,重复的交易会被忽略。但是由于该漏洞修复之前,门罗币客户端的show_transfers指令并没有跳过重复的交易,所以每笔重复交易的转账金额也会被计算在内并最终输出出来。
也就是说,当某个人或者交易所通过show_transfers指令来确认入账资金的时候便会出现问题,一个很常见的攻击场景便是攻击者对交易所的充值地址发送多条重复交易,若交易所校验不严谨没有检测真实钱包收账余额,仅仅通过show_transfers来确认用户充值的话,便会出现假充值漏洞,导致交易所给用户充值的余额和交易所自己实际收到的余额不符,攻击者假充值成功后可以进行消费或提款。
曲速未来实验室提醒:
交易所使用门罗币客户端v0.12.3.0或更高的版本来代替旧版本。
交易所加强充值验证逻辑,例如钱包实际余额验证。