序
最近关于交易所虚假充值的漏洞很多。显然,交易所和公链的连接并没有我们想象的那么完美。门罗币的问题被披露后,随后被回顾分析,供业内参考。
在此之前,已经有报道称Ripple (XRP)存在虚假充值漏洞(与之前披露的USDT和以太坊代币类似的漏洞),真正的攻击已经在发生。一旦攻击成功,后果将非常严重。这个漏洞在14年就已经被披露了。
据发现门罗币安全漏洞的研究人员称,门罗币存在一个漏洞,允许其从数字货币交易所被盗。根据严重性,此漏洞在10个可能的漏洞中排名第9。Bug赏金猎人在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确认用户充值,就会存在虚假充值漏洞,导致用户充值余额与交易所实际收款不符。攻击者可以在成功后进行虚假充值。
提醒大家:
使用Exchange Monroe Coin客户端版本v0.12.3.0或更高版本替换旧版本。加强兑换充值验证的逻辑,比如实际钱包余额的验证。