事件介绍
在6月28日晚,有安全机构发布了一条针对USDT的预警及漏洞分析,同时提醒各大交易所尽快暂停有关USDT的充值功能,并对自身的代码进行检查,查看是否存在逻辑缺陷。“假充值”是指用户向交易所充值USDT时并不会损失自身的USDT,这些充值的USDT可以正常使用。
同时,在今年6月11就已经有用户发现门罗币存在假充值漏洞,并在门罗币的GitHub仓库上提交了相关issue。
漏洞介绍:
USDT
攻击对者利用交易所对USDT交易充值的判断逻辑缺陷,恶意进行虚假转账牟取交易所的代币。USDT自身是没有问题的。
我们以Omniexplorer提供的素材为例。
通过一例无效交易来阐释这个过程。
地址:1b5c80f487d2bf8b69e1bbba2b1979aacb1aca7a094c00bcb9abd85f9af738ea
(https://omniexplorer.info/search/1b5c80f487d2bf8b69e1bbba2b1979aacb1aca7a094c00bcb9abd85f9af738ea)
这笔无效的交易发生在Omniexplorer。 Omin采用的数字资产转移的方法是Simple Send。
而他的记账模型是基于地址的。通过地址查询交易者余额并与交易发送的地址对比,余额小于发送的金额,这笔交易就会被标记为无效。
同时,对余额的检验是通过Omni 客户端进行的,但Omni没有 UTXO 机制,这也就导致了无效交易也能被广播。
利用场景
1.用户发起恶意 USDT 充值行为;
2.黑客绕过检查系统生成恶意交易并广播;
3.由比特币区块链(Omni core 钱包基于比特币)确认交易;
4.交易所检查交易数目(绕过了余额检查);
5.交易完成;
6.⽤户发起提币。
门罗币
首先我们先看一下官方发布的修复代码
判读一次交易的公共密钥是否已经存在,若存在,则否定此次交易。
在没有添加这段代码前,门罗币客户端的show_transfers指令不会跳过重复的交易,重复的交易金额也会被计算出来。
也就是说,当攻击者交易所的充值地址发送多条重复交易,若交易所校验不严谨没有检测真实钱包收账余额,仅仅通过show_transfers来确认用户充值的话,便会出现假充值漏洞,导致交易所给用户充值的余额和交易所自己实际收到的余额不符,攻击者假充值成功后可以进行消费或提款。
利用场景
在门罗币的开源代码中插入利用代码,然后编译运行。
攻击者在门罗币的cryptonote_tx_utils.cpp文件的第354行中插入大量重复代码。客户端每次发起交易的时候便会向目标多发送3次重复交易,这样便达到了利用该漏洞的目的。
总结
曲速区提醒:黑客只需要几行代码就可以完成假转账,这种漏洞的原因要归于交易所没有处理好逻辑漏洞。开发人员在代码上线前应注意检查,小心仔细。安全无小事。
本文内容来自微信公众号【曲速未来安全区】
领取专属 10元无门槛券
私享最新 技术干货